1

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

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

LOCAL_QUORUM = (replication_factor/2) + 1

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

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

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

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

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

4

2 回答 2

0

欢迎来到卡桑德拉世界

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,这将取决于复制因子以及读取操作的一致性级别。您还可以降低因数据不准确而牺牲弹性和性能的风险。

于 2019-06-11T03:12:20.233 回答
0

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

答案是:是的。

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

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

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

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

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

R + W > N

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

W是写操作的一致性级别

N是副本数

要了解更多信息,请查看:一致的读写操作

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

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

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

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

  2. 修复节点

于 2019-06-11T03:05:30.690 回答