选什么? Cassandra 中的仲裁或最新时间戳数据

What to pick? Quorum OR Latest timestamp data in Cassandra

我正在阅读有关 Cassandra 的文章,并了解到存在 Quorum 概念(即,如果有多个 nodes/replicas 存储特定密钥,则在读取操作期间选择和 return 数据在这些副本中占多数)以处理读取操作期间的一致性。

我的怀疑可能很愚蠢,但我无法理解在我们拥有的大多数数据值与最新时间戳数据不同的情况下 Quorum 概念有何用处。 那么我们如何决定我们必须使用哪个数据值 return?

例如-

对于特定键“key1”

时间戳:t1>t2

5 个副本

replica0(主节点)宕机


replicaNo - 值 - 时间戳 -

replica1 - value1 - t1

replica2 - value2 - t2

replica3 - value2 - t2

replica4 - value2 - t2

所以在上面的例子中,我们应该return majority (value2) 还是 latest timestamp (value1)?

有人可以帮忙吗?

法定人数只是意味着大多数节点应该提供答案。但是答案可能有不同的时间戳,所以协调节​​点会select将时间戳最新的答案发送给客户端,同时会触发修复操作具有旧数据的节点。

但在您的情况下,您可能仍会得到旧答案,因为在 RF=5 时,法定人数为 3 个节点,并且协调器可以从具有旧数据的副本 2-4 中获取结果。仅当协调器将副本 1 包含到查询节点列表中时,您才会获得最新结果。

P.S。在 Cassandra 中没有主副本 - 所有副本都是平等的。

在 Cassandra 中,最后写入的总是获胜。这意味着对于 t2>t1 的 (a1,t1) 和 (a2, t2) 值 a2 将被认为是正确的。

关于您的问题,单独读取 QUORUM 并没有多大用处。那是因为为了完全一致,必须遵循以下规则:

RC+WC>RF

(RC - 读取一致性;WC - 写入一致性;RF - 复制因子)
在您的情况下(当大多数副本拥有旧数据时),QUORUM 会增加获得正确数据的机会,但不能保证。
最常见的用例是使用 quorum 进行读取和写入。这意味着对于 5 的 RF,3 个节点将具有正确的值。现在,如果我们还从 3 个节点读取,那么 3 个节点中的一个节点不可能没有更新的值(因为最多 2 个节点具有旧值)。

关于读取的工作原理,当您请求 RF 上的法定人数为 5 时,协调器节点将向一个节点请求实际数据,并向 2 个节点请求该数据的摘要。协调器节点然后将来自第一个节点的摘要(实际数据)与其他 2 个摘要进行比较。如果它们匹配,则返回第一个节点的数据。如果它们不同,将触发读取修复,这意味着数据将在所有可用节点上更新。

因此,如果您在 RF 为 5 的情况下以一致性写入一个,您不仅会冒着获取旧数据的风险,即使有法定人数,而且如果具有良好数据的节点出现问题,那么您可能会完全丢失它。找到平衡取决于特定的用例。如果有疑问,请使用法定人数进行读取和写入。

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