问题描述
我正在阅读有关 Cassandra 的文章,并了解到 Quorum 概念(即,如果有多个节点/副本存储特定密钥,则在读取操作期间选择并返回在这些副本中占多数的数据)到处理读操作的一致性。
我的怀疑可能很愚蠢,但我无法理解在我们的多数数据值与最新时间戳数据不同的情况下,Quorum 概念有何用处。 那么我们如何决定必须返回哪个数据值?
前 -
对于特定的键“key1”
时间戳:t1>t2
5 个副本
replica0(主节点)宕机
replicaNo - 值 - 时间戳 -
replica1 - value1 - t1
replica2 - value2 - t2
replica3 - value2 - t2
replica4 - value2 - t2
那么在上面的例子中,我们应该返回多数(value2)还是最新的时间戳(value1)?
有人可以帮忙吗?
解决方法
法定人数只是意味着大多数节点应该提供答案。但是答案可能有不同的时间戳,所以协调器节点会选择时间戳最新的答案发送给客户端,同时对有旧数据的节点触发修复操作.
但在您的情况下,您可能仍会得到旧答案,因为 RF=5,法定人数为 3 个节点,并且协调器可以从具有旧数据的副本 2-4 中获取结果。仅当协调器将副本 1 包含到查询节点列表中时,您才会获得最新结果。
附言在 Cassandra 中没有主副本 - 所有副本都是平等的。
,在 Cassandra 中,最后一次写入总是获胜。这意味着对于具有 t2>t1 值 a2 的 (a1,t1) 和 (a2,t2) 将被认为是正确的。
关于您的问题,单独阅读 QUORUM 并没有那么有用。那是因为为了具有完全的一致性,必须遵循以下规则:
RC+WC>RF
(RC - 读取一致性;WC - 写入一致性;RF - 复制因子)
在您的情况下(当大多数副本具有旧数据时),QUORUM 会增加获得正确数据的机会,但不能保证。
最常见的用例是使用法定人数进行读取和写入。这意味着对于 5 的 RF,3 个节点将具有正确的值。现在,如果我们也从 3 个节点中读取数据,那么 3 个节点中的一个不可能没有新值(因为最多有 2 个具有旧值)。
关于读取的工作原理,当您要求 RF 为 5 时,协调器节点将要求一个节点提供实际数据,并要求 2 个节点提供该数据的摘要。然后协调器节点将来自第一个节点的摘要(实际数据)与其他 2 个摘要进行比较。如果它们匹配,则返回第一个节点的所有数据。如果它们不同,则会触发读取修复,这意味着将在所有可用节点上更新数据。
因此,如果您在 RF 为 5 上以一致的方式编写一个,不仅即使在法定人数下您也会冒着获取旧数据的风险,而且如果拥有良好数据的节点发生问题,那么您可能会完全丢失它。找到平衡取决于特定的用例。如果有疑问,请使用法定人数进行读取和写入。
希望这是有道理的,
干杯!