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



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

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

LOCAL_QUORUM = (replication_factor/2) + 1

这将使我们的本地法定人数为 4。因此,对于简单的写入,六个节点中的四个必须响应,这意味着四个节点将具有最新的值。

据我了解,没有更新的两个节点最终会通过八卦协议进行更新。

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

读取修复如何在这一切中发挥作用?

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

欢迎来到卡桑德拉世界

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

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

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

LOCAL_QUORUM = (replication_factor/2) + 1

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

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

这将使我们的本地法定人数为 4。所以对于一个简单的写作,四个 六个节点必须响应,这意味着四个节点将具有 最新值。

据我了解,最终没有更新的两个节点 通过八卦协议获取更新。

确保满足复制因子的机制是使用提示切换;节点使用 gossip 协议来报告节点的状态(来自自身和其他节点),其中一些状态是"up"、"down"、"healthy"、"join"、"离开"等。

如果是这样,如果客户端从两个节点之一读取会发生什么情况 在协议发生之前没有更新?他们是否有以下风险 获取过时值?

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

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

答案是:是的。

这取决于您将如何设置读/写一致性级别。

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

如果将读取操作的一致性级别设置为ONETWO,则仍有可能/有获得过时值的风险。为什么?:因为 cassandra 如果从指定数量的节点获得响应,它将向客户端返回值。

Cassandra非常灵活,您可以根据应用程序需要配置Cassandra。要保持强大的一致性级别,您可以始终遵循以下规则:

读写操作的可靠性取决于一致性 用于验证操作。可以保证强大的一致性 当满足以下条件时:

R + W> N

其中 R 是读取操作的一致性级别

W 是写入操作的一致性级别

N 是副本数

要了解更多信息,请查看以下内容:一致的读取和写入操作

读取修复如何在这一切中发挥作用?

在读取修复中,Cassandra 不直接向每个副本发送摘要请求 参与阅读。Cassandra 比较所有副本并写入最新的副本 版本到任何没有它的副本节点。如果查询的一致性 级别高于 ONE,Cassandra 在 数据返回到客户端之前的前台。读取修复修复任何节点 由阅读询问。这意味着对于 ONE 的一致性级别,没有数据 已修复,因为没有进行比较。对于仲裁,只有 查询接触已修复,但并非所有节点。

查看此链接以获取更多详细信息:

读取修复
  1. :读取路径期间的修复

  2. 修复节点

最新更新