类似的Cassandra表中的数据不一致

时间:2015-12-03 05:29:24

标签: cassandra

我有3个类似的cassandra表。表A1,A2,A3。 所有列都具有相同列,但不同分区键。 使用Mapper Library(cassandra-driver-mapping-2.1.8.jar)通过顺序插入将数据同时插入所有三个表中 但是,几列中存在不一致。 例如。有时A1.colX和A2.colX相同,但A3.colX具有旧值(未更新),并且这三个表中的所有列都具有完全相同的值。 另一次A1.colY和A3.colY可能具有相同的值,但A2.colY具有旧值(未更新),并且这三个表中的所有列具有完全相同的值。 我正在使用Mapper Manager将输入数据保存在Cassandra中。

映射器管理器是否存在已知问题或我的方法出错?

示例代码:

public void insertInTables(String inputString){     
        .
        .
        ClassNameA1 classObjectA1=new Gson().fromJson(inputString, ClassNameA1.class);
        ClassNameA2 classObjectA2=new Gson().fromJson(inputString, ClassNameA2.class);
        ClassNameA3 classObjectA3=new Gson().fromJson(inputString, ClassNameA3.class);

        MappingManager manager = new MappingManager(session); 
        Mapper<ClassNameA1> mapperA1 = manager.mapper(ClassNameA1.class);
        Mapper<ClassNameA2> mapperA2 = manager.mapper(ClassNameA2.class);
        Mapper<ClassNameA3> mapperA3 = manager.mapper(ClassNameA3.class);

        mapperA1.save(classObjectA1);
        mapperA2.save(classObjectA2);
        mapperA3.save(classObjectA3);
        .
        .
}

1 个答案:

答案 0 :(得分:0)

可能会发生这种情况,因为Cassandra是最终的一致性商店,而不是强大的商店。我在我的经历中目睹的类似行为的典型原因是:

  • 读/写一致性级别问题。如果您有RF = 3,但是使用CL = ONE写入数据,某些节点可能由于某种原因(如网络/ hw毛刺)而无法在写入时复制您的值。然后,如果使用CL = QUORUM(或ONE)读取,则仲裁可能会决定向您显示旧列值,因为新列值未正确传播到所有节点。因此,请确保您使用CL = ALL / QUORUM进行书写并使用CL = QUORUM进行阅读。
  • 暗示切换的问题(用于保护您免受以前的问题)。一旦我看到一个奇怪的行为,当第一列读取是陈旧/不一致时(占所有查询的1%),但第二列(或第三列)始终显示正确的列值。因此,尝试多次重新读取不一致的列(并考虑之前可能的hw / net失败)。
  • 由于硬件故障或Cassandra本身而导致内部数据库错误。

上述大多数问题都可以通过nodetool repair进行修复。您可以进行全面修复,看看是否有帮助。