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

Database 选择什么?Cassandra中的仲裁或最新时间戳数据,database,cassandra,nosql,consistency,Database,Cassandra,Nosql,Consistency,我阅读了有关Cassandra的文章,了解到有仲裁概念(即,如果有多个节点/副本存储了特定密钥,那么在读取操作期间,选择并返回在这些副本中占多数的数据)来处理读取操作期间的一致性 我的怀疑可能是愚蠢的,但我无法理解在多数数据值与最新时间戳数据不同的情况下,仲裁概念如何有用。 我们如何决定必须返回哪个数据值 前- 对于特定键“键1” 时间戳:t1>t2 5个副本 replica0(主节点)已关闭 replicaNo-值-时间戳- 复制1-值1-t1 复制2-值2-t2 复制3-值2-t2 复制4

我阅读了有关Cassandra的文章,了解到有仲裁概念(即,如果有多个节点/副本存储了特定密钥,那么在读取操作期间,选择并返回在这些副本中占多数的数据)来处理读取操作期间的一致性

我的怀疑可能是愚蠢的,但我无法理解在多数数据值与最新时间戳数据不同的情况下,仲裁概念如何有用。 我们如何决定必须返回哪个数据值

前-

对于特定键“键1”

时间戳:t1>t2

5个副本

replica0(主节点)已关闭


replicaNo-值-时间戳- 复制1-值1-t1

复制2-值2-t2

复制3-值2-t2

复制4-值2-t2

那么在上述情况下,我们应该返回什么多数(value2)或最新的时间戳(value1)


有人能帮忙吗?

仲裁只意味着大多数节点都应该提供答案。但是答案可能有不同的时间戳,因此协调器节点将选择具有最新时间戳的答案发送给客户端,同时将触发对具有旧数据的节点的修复操作

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


另外,在卡桑德拉没有主副本-所有副本都是相等的。

在卡桑德拉,最后一次写入总是获胜。这意味着对于(a1,t1)和(a2,t2),具有t2>t1值a2的(a1,t1)和(a2,t2)将被认为是正确的

关于你的问题,单独阅读法定人数并没有多大用处。这是因为为了实现完全一致性,必须遵循以下规则:

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

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

因此,如果您在RF为5的情况下以一致性1进行写入,那么即使使用quorum,您也会面临获取旧数据的风险,而且如果具有良好数据的节点发生了某些情况,那么您可能会完全丢失这些数据。找到平衡取决于特定的用例。如果有疑问,请使用仲裁进行读取和写入

希望这有意义,
干杯