【问题标题】:How does cassandra handle write timestamp conflicts between QUORUM reads?cassandra 如何处理 QUORUM 读取之间的写入时间戳冲突?
【发布时间】:2021-04-09 21:47:11
【问题描述】:
如果 2 次 QUORUM 写入并行发生在同一行,并导致 2 个分区副本与同一时间戳不一致,这种情况极不可能发生:
当 CL=QUORUM READ 发生在 3 节点集群中,并且 READ 中的 2 个节点报告具有相同时间戳的不同数据时,READ 将决定什么是实际记录?还是会出错?
那么下一个问题是,既然数据具有相同的时间戳,那么集群如何再次达到一致性?
我知道这种情况极不可能发生,但我猜它仍然有可能。
示例图:
【问题讨论】:
标签:
database
cassandra
nosql
consistency
eventual-consistency
【解决方案1】:
这是我从 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,因为它没有参与读取。