Cassandra 读取间歇性失败

Posted

技术标签:

【中文标题】Cassandra 读取间歇性失败【英文标题】:Cassandra reads failing intermittently 【发布时间】:2014-10-13 17:56:17 【问题描述】:

我遇到了一个令人费解的问题,我的 cassandra 读取没有返回键“K”的值。我有一个近 2 周前插入到列族中的键,当我连续 8 次使用 CQLSH 查询该键时,有 2 次没有返回值。 6次正确显示结果。我的键空间的复制因子是 3。

此密钥是使用 QUORUM 一致性(Java Hector 客户端)编写的。我正在使用 CQLSH 阅读它,它的默认一致性为 1。到目前为止,我还没有对此提出任何解释。有什么想法吗?

【问题讨论】:

【参考方案1】:

原因是您不尊重一致性级别不等式:

(写 CL + 读 CL)> 复制因子

RF = 3 -> QUORUM = 2

所以你的不等式说

((WRITE CL) 2 + (READ CL) 1) > 3 2 + 1 > 3 = FALSE

在this post 你可以找到如何实现一致性。但是,您可能有兴趣调整您的 read repair chance

尝试使用CONSISTENCY 命令在 CQLSH 中设置 CL 仲裁

cqlsh> CONSISTENCY QUORUM;

然后再次执行读取

HTH, 卡罗

【讨论】:

嘿@Carlo 感谢您提供的信息。但是一致性不就是为了保证返回数据的新鲜度吗?即使我使用 ONE 的读取一致性(我对写入使用了 QUORUM 一致性),它也会从最近的持有此密钥的副本返回此特定密钥的数据。我可以理解,如果一致性较弱,您可能无法获得此键的最新值。但是我怎么可能根本没有得到这个键的数据呢?我一直在试图弄清楚在什么情况下 cassandra 根本不会返回现有密钥的数据,即使它存在? 如果密钥 K 有 3 个节点 RF,并且您使用 CL=Quorum 编写它,这意味着在将控制权返回给客户端之前只有 2 个节点编写它。如果执行了 CL=1 的读取并且要回答的第一个节点是缺少 K 的节点,您将不会得到任何结果 - 验证尝试按照我在编辑的答案中所说的设置 CL 谢谢@Carlo。现在说得通了:)

以上是关于Cassandra 读取间歇性失败的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra 2.2.1 不会开始使用 cassandra -f

Cassandra 数据库安装部署

Cassandra 边界框搜索

无法启动 Cassandra:端口已在使用中

MySQL 从流中读取失败

禁用 Spring Boot 启动器 Cassandra 进行单元测试