类似Cassandra表中的数据不一致

类似Cassandra表中的数据不一致,cassandra,Cassandra,我有3张类似的卡桑德拉桌子。表A1、A2、A3。 它们都有相同的列,但分区键不同。 使用Mapper库(cassandra-driver-mapping-2.1.8.jar)通过顺序插入将数据同时插入到所有三个表中 然而,在少数几列中存在不一致性。 例如,有时A1.colX和A2.colX相同,但A3.colX具有旧值(未更新),其余三个表中的所有列具有完全相同的值。 另一次,A1.colY和A3.colY可能具有相同的值,但A2.colY具有旧值(未更新),其余三个表中的所有列具有完全相同的值

我有3张类似的卡桑德拉桌子。表A1、A2、A3。 它们都有相同的列,但分区键不同。 使用Mapper库(cassandra-driver-mapping-2.1.8.jar)通过顺序插入将数据同时插入到所有三个表中 然而,在少数几列中存在不一致性。 例如,有时A1.colX和A2.colX相同,但A3.colX具有旧值(未更新),其余三个表中的所有列具有完全相同的值。 另一次,A1.colY和A3.colY可能具有相同的值,但A2.colY具有旧值(未更新),其余三个表中的所有列具有完全相同的值。 我正在使用Mapper Manager将输入数据保存在Cassandra中

这是mapper manager的已知问题还是我的方法中的某些错误

示例代码:

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);
        .
        .
}
public void插入文件(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=新的MappingManager(会话);
MapperMappera1=manager.Mapper(ClassNameA1.class);
MapperMappera2=manager.Mapper(ClassNameA2.class);
MapperMappera3=manager.Mapper(ClassNameA3.class);
mapperA1.save(classObjectA1);
mapperA2.save(classObjectA2);
mapperA3.save(classObjectA3);
.
.
}

这可能会发生,因为Cassandra是最终的一致性存储,而不是强大的一致性存储。在我的经验中,我目睹的类似行为的典型原因是:

  • 读/写一致性级别存在问题。如果您的RF=3,但写入数据时CL=1,则某些节点可能由于某种原因(如网络/硬件故障)无法在写入时复制您的值。然后,如果使用CL=QUORUM(或1)进行读取,则QUORUM可能会决定向您显示旧列值,因为新列值未正确传播到所有节点。因此,请确保使用CL=ALL/QUORUM进行书写,使用CL=QUORUM进行阅读
  • 暗示移交的问题(用于保护您免受以前问题的影响)。有一次,我观察到一种奇怪的行为,第一次读取的列过时/不一致(占所有查询的1%),但第二次(或第三次)始终显示正确的列值。因此,尝试多次重读不一致的列(并在之前考虑可能的硬件/网络故障)
  • 由于硬件故障或Cassandra本身而导致内部数据库错误
上述大多数问题都可以通过
nodetool repair
解决。您可以进行全面修复,看看这是否有帮助