database - cassandra 如何处理 QUORUM 读取之间的写入时间戳冲突?
问题描述
如果 2 个 QUORUM 写入并行发生在同一行,并导致 2 个分区副本与相同的时间戳不一致,这种情况极不可能发生:
当 CL=QUORUM READ 发生在 3 节点集群中,并且 READ 中的 2 个节点以相同的时间戳报告不同的数据时,READ 将决定什么是实际记录?还是会出错?
那么下一个问题是,既然数据具有相同的时间戳,那么集群如何再次达到一致性?
我知道这种情况是极不可能的,但我猜它仍然是可能的。
解决方案
这是我从 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,因为它不参与该读取。
推荐阅读
- python - 'return' 超出功能错误 keras 预测值
- python - 使用 Python 扩展 API 包装复杂的 C++ 类
- forms - Xamarin Forms:如何在 ListView 中处理大数据?
- view - 更新由管理的视图的属性“填充”时出错:RNSVGLine
- c# - 如何在 C# 中使用 LINQ 获取列表中的元素并获取下一项?
- django - Django 迁移完整性错误列包含空值
- javascript - 如何将逗号分隔的列值从 sql server 传递到 c# 中的变量中
- machine-learning - 在主成分分析 (PCA) 中使用 4 个成分
- typo3 - 为什么 noTrimWrap 在以下 TypoScript 中不起作用?
- c# - 无法从 Visual Studio 2017 Professional 运行 Outlook 加载项