【问题标题】:Is It Possible for Cassandra to Return an Inconsistent Value?Cassandra 是否有可能返回不一致的值?
【发布时间】:2019-10-25 09:21:04
【问题描述】:

我是 Cassandra 的新手,我想知道,Cassandra 是否有可能返回不一致的值?

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

LOCAL_QUORUM = (replication_factor/2) + 1

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

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

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

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

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

【问题讨论】:

    标签: java cassandra nodes distributed-system gossip


    【解决方案1】:

    欢迎来到卡桑德拉世界

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

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

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

    LOCAL_QUORUM = (replication_factor/2) + 1

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      答案是:是的。

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

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

      如果您将读取操作的一致性级别设置为 ONETWO,那么仍然存在获得陈旧值的可能性/风险。 为什么?:因为 cassandra 如果从指定数量的节点获得响应,就会返回值给客户端。

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

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

      R + W > N

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

      W是写操作的一致性级别

      N是副本数

      如需了解更多信息,请查看:consistent read and write operations

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

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

      查看此链接了解更多详情:

      1. Read Repair: repair during read path

      2. Repairing nodes

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        • 2017-12-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多