首页 > 解决方案 > Cassandra 是否有可能返回不一致的值?

问题描述

我对 Cassandra 很陌生,我想知道,Cassandra 是否有可能返回不一致的值?

例如,假设我们有六个节点集群。

LOCAL_QUORUM = (replication_factor/2) + 1

这将为我们提供 4 的 Local Quorum。因此,对于简单的写入,六个节点中有四个必须响应,这意味着四个节点将具有最新值。

据我了解,没有更新的两个节点最终都是通过 Gossip Protocol 更新的。

如果是这样,如果客户端从协议发生之前未更新的两个节点之一读取会发生什么?他们是否有获得陈旧价值的风险?

阅读修复如何影响这一切?

*也是一个快速的旁注。并不是说您会这样做,但是如果您将复制因子设置为等于一致性级别,那么这与背面的 2PC(两阶段提交)本质上是否相同?

标签: javacassandranodesdistributed-systemgossip

解决方案


欢迎来到卡桑德拉世界

Cassandra 是否有可能返回不一致的值?

是的,Cassandra 本质上具有“最终一致”的方法,因此,如果您使用ANY 或 ONE为读取设置一致性级别,则返回不一致值的风险会增加。您可以增加此设置以ALL确保信息一致,但会牺牲性能和弹性。应用程序中使用的级别将取决于您的用例。

例如,假设我们有六个节点集群。

LOCAL_QUORUM = (replication_factor/2) + 1

复制因子与集群中的节点数量无关,经验法则是您拥有的是复制因子不应大于节点数量。

假设您在 6 个节点的集群中使用 6 的复制因子:

这将为我们提供 4 的 Local Quorum。因此,对于简单的写入,六个节点中有四个必须响应,这意味着四个节点将具有最新值。

据我了解,没有更新的两个节点最终都是通过 Gossip Protocol 更新的。

确保复制因子得到满足的机制是Hinted handoffs;节点使用gossip 协议报告节点的状态(来自自身和其他节点),其中一些状态是“up”、“down”、“healthy”、“joining”、“leaving”等.

如果是这样,如果客户端从协议发生之前未更新的两个节点之一读取会发生什么?他们是否有获得陈旧价值的风险?

你会想了解Cassandra 的读取路径;作为 tl dr,这将取决于复制因子以及读取操作的一致性级别。您还可以降低因数据不准确而牺牲弹性和性能的风险。


推荐阅读