cassandra 如何处理 QUORUM 读取之间的写入时间戳冲突?

问题描述

在极不可能发生的情况下,2 次 QUORUM 写入并行发生在同一行上,并导致 2 个分区副本与同一时间戳不一致:

当 CL=QUORUM READ 发生在 3 节点集群中,并且 READ 中的 2 个节点报告具有相同时间戳的不同数据时,READ 将决定什么是实际记录?还是会出错?

那么下一个问题是,既然数据具有相同的时间戳,集群如何再次达到一致性?

我知道这种情况不太可能发生,但我的猜测是仍有可能。

示例图:

enter image description here

解决方法

这是我从 Datastax 支持中得到的:

绝对是一种需要考虑的可能情况。 Cassandra/Astra 使用以下优先规则处理这种情况,以便客户端的结果始终保持一致:

比较时间戳,最新的时间戳总是胜出 如果读取的数据具有相同的时间戳,则删除优先于插入/更新 如果仍然有平局,Cassandra/Astra 会选择词法上较大的列的值 虽然这些肯定有点武断,但 Cassandra/Astra 无法知道应该优先考虑哪个值,并且这些规则确实可以在发生平局时始终为所有客户端提供完全相同的结果。

当 CL=QUORUM READ 发生在 3 节点集群中,并且 READ 中的 2 个节点报告具有相同时间戳的不同数据时,READ 将决定什么是实际记录?还是会出错?

Cassandra/Astra 会在遍历读取路径时在幕后为您处理此问题。如果两个副本返回的数据之间存在差异,则在将数据发送回客户端之前,将在参与读取的两个节点之间比较和同步数据。

因此,对于您的图表,W1 和 W2 都发生在 t = 1,返回到客户端的数据将为 data = 2,因为 2 > 1。此外,节点 1 现在将具有缺失的数据= 2 在 t = 1 记录。节点 2 在 t = 1 时仍然只有数据 = 1,因为它没有参与该读取。

相关问答

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