Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 缺少刚刚插入到cassandra柱族中的柱_Java_Cassandra_Astyanax - Fatal编程技术网

Java 缺少刚刚插入到cassandra柱族中的柱

Java 缺少刚刚插入到cassandra柱族中的柱,java,cassandra,astyanax,Java,Cassandra,Astyanax,我们的测试集群不断出现问题 卡桑德拉配置: 卡桑德拉版本:2.2.12 节点数:6,种子节点数3,无种子节点数3 复制因子1(当然,对于产品,我们将使用3) 出现问题的表配置: CREATE TABLE "STATISTICS" ( key timeuuid, column1 blob, column2 blob, column3 blob, column4 blob, value blob, PRIMARY KEY (key, col

我们的测试集群不断出现问题

  • 卡桑德拉配置:

    • 卡桑德拉版本:2.2.12
    • 节点数:6,种子节点数3,无种子节点数3
    • 复制因子1(当然,对于产品,我们将使用3)
  • 出现问题的表配置:

    CREATE TABLE "STATISTICS" (
        key timeuuid,
        column1 blob,
        column2 blob,
        column3 blob,
        column4 blob,
        value blob,
        PRIMARY KEY (key, column1, column2, column3, column4)
    ) WITH COMPACT STORAGE
        AND CLUSTERING ORDER BY (column1 ASC, column2 ASC, column3 ASC, column4 ASC)
        AND caching = {
            'keys':'ALL', 'rows_per_partition':'100'
        }
        AND compaction = {
            'class': 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy'
        };
    
  • 我们的java代码细节

    • java8
    • 卡桑德拉司机:astyanax
    • 应用程序节点计数:4
  • 那么,发生了什么:

    在高负载下,我们的应用程序从所有节点在cassandra表中进行许多插入。 在此期间,当我们下一步处理统计数据表中的行时,我们有一个工作流:

  • 请插入app-node-1中的3列
  • 从app-node-2中插入1列
  • 从app-node-3中插入1列
  • 读取app-node-4行中的所有列
  • 在最后一步(4)中,当我们读取所有列时,我们确保所有列的插入都已完成(这由我们进行的其他检查保证)

    问题是,有时(10万上的2-5次)在stpp 4中,当我们读取所有列时,我们会得到4列而不是5列,即,我们缺少在步骤2或3中插入的列

    我们甚至开始在循环中每隔100ms读取这些列,但并没有得到预期的结果。在此期间,我们还使用cqlsh检查列-相同的结果,即4而不是5

    但是,如果我们在这一行中添加任何新列,那么我们将立即得到预期的结果,即,我们将从工作流中获得6列-5列和1个虚拟列。 所以在插入伪列之后,我们得到了在第2步或第3步插入的缺少的列

    此外,当我们得到missing(然后是Apprared列)的时间戳时,它与从我们的应用程序节点实际添加此列的时间非常接近

    基本上,来自app-node-2和app-node-3的插入几乎是同时进行的,因此最后这两列的时间戳几乎都相同,即使我们在步骤4首次读取所有列后1分钟内插入了伪列

    使用复制因子3,我们无法重现此问题

    因此,开放性问题是:

  • 当复制因子为1时,这可能是Cassandra的预期行为吗
  • 如果不是预期的,那么可能的原因是什么
  • 更新1:

    下一个代码用于插入列:

    UUID uuid = <some uuid>;
    short shortV = <some short>;
    int intVal = <some int>;
    String strVal = <some string>;
    ColumnFamily<UUID, Composite> statisticsCF = ColumnFamily.newColumnFamily(
            "STATISTICS", 
            UUIDSerializer.get(), 
            CompositeSerializer.get()
    );
    MutationBatch mb = keyspace.prepareMutationBatch();
    ColumnListMutation<Composite> clm = mb.withRow(statisticsCF, uuid);
    clm.putColumn(new Composite(shortV, intVal, strVal, null), true);
    mb.execute();
    
    结果-相同的列没有出现

    然后我们重新启动了cassandra集群和列

    更新3:

    试图禁用cassandra缓存,方法是将“\u mb
    属性中的行缓存大小设置为0(在2Gb之前)

    之后,问题就解决了


    因此,probmlem可能位于OHCProvider中,OHCProvider用作默认缓存提供程序。

    能否提供应用程序节点执行的插入示例。他们正在更新哪些列以及更新顺序是什么?没有直接关系,但我不建议使用astyanax-它在很久以前就被放弃了,他们建议使用DataStax的驱动程序。@Jan在中查看我的更新question@AlexOtt是的,当然,我们计划迁移到CQL
    pssh -h cnodes.txt /path-to-cassandra/bin/nodetool flush
    
    row_cache_size_in_mb: 0