选什么? Quorum OR Cassandra 中的最新时间戳数据

问题描述

我正在阅读有关 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 上以一致的方式编写一个,不仅即使在法定人数下您也会冒着获取旧数据的风险,而且如果拥有良好数据的节点发生问题,那么您可能会完全丢失它。找到平衡取决于特定的用例。如果有疑问,请使用法定人数进行读取和写入。

希望这是有道理的,
干杯!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...