java—cassandra是否可能返回不一致的值?

41ik7eoe  于 2021-06-14  发布在  Cassandra
关注(0)|答案(2)|浏览(551)

我对cassandra很陌生,我想知道,cassandra是否可能返回一个不一致的值?
例如,假设我们有六节点集群。
本地\u仲裁=(复制\u因子/2)+1
这将使我们的当地法定人数达到4人。因此,对于一个简单的写操作,六个节点中有四个必须响应,这意味着四个节点将具有最新的值。
据我所知,两个没有更新的节点最终通过八卦协议得到更新。
如果是这样,那么如果客户机从两个节点中的一个节点读取在协议发生之前没有更新的内容,会发生什么情况?他们是否有获得过时价值的风险?
阅读修复是如何参与这一切的?

  • 还有一个简短的旁注。并不是说您会这样做,但是如果您将复制因子设置为一致性级别,那么它的操作是否与后面的2pc(两阶段提交)基本相同?
pvcm50d1

pvcm50d11#

cassandra是否可能返回不一致的值?
答案是:是的。
这取决于您将如何设置读/写一致性级别。
如果是这样,那么如果客户机从两个节点中的一个节点读取在协议发生之前没有更新的内容,会发生什么情况?他们是否有获得过时价值的风险?
如果您将读取操作的一致性级别设置为一个或两个,那么仍然存在获取过时值的可能性/风险。为什么?:因为如果cassandra从指定数量的节点得到响应,它将向客户端返回值。
cassandra非常灵活,您可以根据应用程序的需要配置cassandra。要保持高度的一致性,您可以始终遵循以下规则:
读写操作的可靠性取决于用于验证操作的一致性。当满足下列条件时,可以保证强一致性:
r+w>n
其中r是读取操作的一致性级别
w是写操作的一致性级别
n是副本数
要了解更多信息,请参阅:一致的读写操作
阅读修复是如何参与这一切的?
在读取修复中,cassandra向每个不直接参与读取的副本发送摘要请求。cassandra比较所有副本,并将最新版本写入任何没有它的副本节点。如果查询的一致性级别高于1,则cassandra会在数据返回到客户端之前对前台的所有副本节点执行此过程。read repair修复read查询的任何节点。这意味着对于一致性级别为1的情况,不会修复任何数据,因为不会进行比较。对于quorum,只修复查询所触及的节点,而不是修复所有节点。
有关详细信息,请查看此链接:
读取修复:在读取路径期间修复
正在修复节点

kgqe7b3p

kgqe7b3p2#

欢迎来到Cassandra世界
cassandra是否可能返回不一致的值?
是的,cassandra天生就有一种“最终一致”的方法,所以如果你为一个或多个read设置了一致性级别,那么返回不一致值的风险就会增加。您可以将此设置增加到 ALL 以确保信息的一致性,但您将牺牲性能和恢复能力。应用程序中使用的级别将取决于您的用例。
例如,假设我们有六节点集群。
本地\u仲裁=(复制\u因子/2)+1
复制因子独立于集群中的节点数量,经验法则是复制因子不应大于节点数量。
假设您在6节点群集中使用的复制因子为6:
这将使我们的当地法定人数达到4人。因此,对于一个简单的写操作,六个节点中有四个必须响应,这意味着四个节点将具有最新的值。
据我所知,两个没有更新的节点最终通过八卦协议得到更新。
确保复制因子满足的机制是暗示切换;节点使用gossip协议来报告节点的状态(从自身和其他节点),其中一些状态是“向上”、“向下”、“健康”、“加入”、“离开”等。
如果是这样,那么如果客户机从两个节点中的一个节点读取在协议发生之前没有更新的内容,会发生什么情况?他们是否有获得过时价值的风险?
你会想读Cassandra的阅读路径;作为tl dr,这将取决于复制因子以及读取操作的一致性级别。您还可以降低数据不准确的风险,从而牺牲恢复能力和性能。

相关问题