Cassandra 并不总是在单个数据中心返回相同查询的预期数据,设置 5 个副本

Posted

技术标签:

【中文标题】Cassandra 并不总是在单个数据中心返回相同查询的预期数据,设置 5 个副本【英文标题】:Cassandra not always returning the expected data for the same query in a single datacenter, 5 replica set up 【发布时间】:2021-08-18 21:39:43 【问题描述】:

我遇到了一个我不确定为什么会发生的问题。

我有一个 Cassandra 集群,只有 1 个数据中心,5 个副本,3 个作为复制因子,并且在测试时我的应用和 cqlsh 中的 ONE 保持一致。

我正在使用 cqlsh 运行类似于以下内容的查询:

SELECT * FROM session where id='xxxxxxxxxxxxxxx' and device_id='xxxxxxxxxxxxxxxx';

我随机填充了我的数据行,而其他时候响应为空。

首先我检查了集群的状态,那里一切正常。所有处于“UN”状态的节点,每个节点大约 60% 的所有权,每个节点 256 个令牌。

然后我像这样运行 getendpoints 命令:

nodetool getendpoints <keyspace> <table> "xxxxxxxxxxxxxxx"

我看到 3 个节点持有这个 ID,看起来不错。

然后我在每个节点上运行修复,问题就消失了,但我仍然看不出这里有什么问题。

信息在数据库中保存了很长一段时间,而不是几分钟或几天。

我想问题仍然存在,但它可能是什么以及如何轻松调试或监控?

感谢您的帮助

【问题讨论】:

【参考方案1】:

问题是数据不一致。您可以轻松地验证您是否能够运行修复,然后发现数据是一致的,这意味着您的 ONE CL 正在访问一个实际上不包含数据的节点。如果您需要该级别的一致性,您的查询将需要更高的 CL、两个或 local_quorum。

您的数据不一致的原因可能是由于某处丢失了突变。这可能是网络,或导致丢弃突变的过载节点。不管怎样,这显然是正在发生的事情。

【讨论】:

是的,我们发现我们当前拥有的一致性不会像 ONE 之上的其他一致性那样自动执行读取修复,所以这就是为什么直到我们手动运行修复命令才修复它的原因跨度>

以上是关于Cassandra 并不总是在单个数据中心返回相同查询的预期数据,设置 5 个副本的主要内容,如果未能解决你的问题,请参考以下文章

Java:从 InputStream 读取并不总是读取相同数量的数据

列出包含部分相同数据的行。部分并不总是相同

mysql查询优化

时间敏感的Cloudant视图并不总是返回正确的结果

Cassandra中的行排序

为啥 KMeans 集群标签并不总是与 set random_state 相同?