Cassandra 写入后读取与 LOCAL_QUORUM 不一致

Posted

技术标签:

【中文标题】Cassandra 写入后读取与 LOCAL_QUORUM 不一致【英文标题】:Cassandra read after write inconsistency with LOCAL_QUORUM 【发布时间】:2020-05-26 03:26:08 【问题描述】:

我们正在运行一个具有 3 个节点的本地数据中心和(我相信)复制因子为 3 的 cassandra 集群。 存在远程数据中心,但未在我们的查询中使用。

更准确地说,我们使用 Java 库:

org.apache.cassandra:cassandra-allcom.datastax.cassandra:cassandra-driver-core 均 v3.1.1 用于数据库交互 info.archinnov:achilles-core v5.1.3 用于代码源注释处理 - 这是指定 LOCAL_QUORUM 一致性级别的地方

最近,我们遇到了与新行插入的后写一致性相关的问题。

使用 LOCAL_QUORUM 一致性插入行。成功插入后几毫秒,具有 LOCAL_QUORUM 一致性的分区键的行选择有时 - 很少 - 不成功。找不到行。

根据我对 LOCAL_QUORUM 一致性的天真理解,如果该行先写入然后使用 LOCAL_QUORUM 一致性读取(具有相同的数据中心),则应该“始终”找到并读取它。 但这似乎不是正在发生的事情。

阅读 Cassandra 文档后,我想知道时钟同步问题是否可以解释该问题。示例:没有行的节点可能有一个提前的时钟,因此“无行”可能被认为是最新的值。

节点时钟同步问题是否确实可以解释行插入的读写不一致(尽管有 LOCAL_QUORUM 和单个本地数据中心)? 如果不是,如何解释这种一致性问题?

【问题讨论】:

你能检查你的键空间的复制因子吗? 也许确保您执行的查询带有时间戳,这样您就知道第二个查询在后面,然后确保您的客户时钟同步。 @Alex Ott 复制因子被确认为等于 3 我的意思是 - 什么复制策略? 【参考方案1】:

你可以执行下面的命令来验证,有多少节点有key的数据。

./nodetool getendpoints keyspacename tablename 'keyname'

【讨论】:

以上是关于Cassandra 写入后读取与 LOCAL_QUORUM 不一致的主要内容,如果未能解决你的问题,请参考以下文章

Spark Streaming:读取和写入状态信息到外部数据库,如 cassandra

Cassandra 占用大量 CPU

Apache Beam - 将 BigQuery TableRow 写入 Cassandra

Solr与Cassandra二级缓存实践

在 Cassandra 中混合轻量级事务和正常写入

Cassandra 4.0 虚拟表如何读取数据?