首页 > 解决方案 > cassandra 如何处理 QUORUM 读取之间的写入时间戳冲突?

问题描述

如果 2 个 QUORUM 写入并行发生在同一行,并导致 2 个分区副本与相同的时间戳不一致,这种情况极不可能发生:

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

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

我知道这种情况是极不可能的,但我猜它仍然是可能的。

示例图: 在此处输入图像描述

标签: databasecassandranosqlconsistencyeventual-consistency

解决方案


这是我从 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 时仍然只有 data = 1,因为它不参与该读取。


推荐阅读