Cassandra:读取数据不一致(LOCAL_QUORUM)

时间:2018-10-11 23:41:18

标签: cassandra-2.1

在读取Cassandra时,我们发现数据不一致。详细信息如下:

这是一个宽列表。这些列可以添加到多台计算机中,并可以由多台计算机读取。写入和读取之间的时间以分钟为单位,但有时可以以秒为单位。写入每2分钟发生一次。

现在,在阅读时,我们看到以下几种读法不一致的情况:

  • 添加了一列。如果在添加列后(在写入后20秒到2分钟)进行了读取,则Cassandra不返回任何数据。好像密钥不存在。如果应用程序重试,它将获取数据。
  • 行键有几列。并添加了新列“ n”。同样,在写入后几分钟会进行一次读取。这次,仅返回最新的列“ n”。在这种情况下,应用程序不知道数据不完整,因此不会重试。如果我们手动重试,则会看到所有列。
  • 行键有几列。并添加一个新列“ n”。当写入后发生读取时,将返回除“ n”以外的所有列。

这是我们已验证的内容:

  • 读写操作都使用'LOCAL_QUORUM'一致性级别。
  • 复制在本地数据中心内。读写不涉及远程数据中心。
  • 在读取不一致期间,所有节点均未发生GC暂停
  • cassandra日志中没有错误
  • 读取总是在写入之后发生。

其他一些细节: Cassandra版本:2.1.9 DataStax Java驱动程序版本:2.1.10.2 复制因子:3

在较低的环境中我们看不到此问题。去年,这种情况发生了一次或两次,但是从最近几天开始,这种情况就经常发生。平均每分钟2次读取不一致。

这是表定义的样子:

CREATE TABLE "MY_TABLE" (
  key text,
  sub_key text,
  value text,
  PRIMARY KEY ((key), sub_key)
) WITH
  bloom_filter_fp_chance=0.010000 AND
  caching='{"keys":"ALL", "rows_per_partition":"NONE"}' AND
  comment='' AND
  dclocal_read_repair_chance=0.100000 AND
  gc_grace_seconds=864000 AND
  read_repair_chance=0.000000 AND
  default_time_to_live=0 AND
  speculative_retry='ALWAYS' AND
  memtable_flush_period_in_ms=0 AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'LZ4Compressor'};

请为我们指明正确的方向。谢谢!

0 个答案:

没有答案