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 读取间歇性失败的主要内容,如果未能解决你的问题,请参考以下文章