【发布时间】:2017-01-19 12:40:54
【问题描述】:
我正在运行 Cassandra 2.2.1,3 节点集群,RF=3。如果我在 quorum 上对一堆条目执行简单删除,通过 select at quorum 验证结果会发现一些应该被删除的条目仍然存在于表中。通过 Java 驱动程序发出的删除查询无一例外地成功完成。我还使用重试策略来处理失败的删除/写入,但这些失败的策略永远不会被调用,因为它们“成功”了。我可以 100% 地重现问题,它通常在我向表中发出大约 100 次删除后开始发生。我了解墓碑和 gc 宽限期的工作原理,这不是恢复删除的情况。在某处读到这可能是一个 ntp 问题,但所有 3 个节点都同步到同一个时钟,而且我可以说没有漂移。我可以共享日志或根本原因所需的任何其他内容。谢谢!
更新: 我解决了这个问题,这似乎是一个奇怪的竞争条件,似乎与时间相关或与顺序相关。如果从标记时间戳的角度来看,如果在插入之前发出删除,则节点之间有一些时间漂移可能会被忽略。
例如 -insert 由节点 1 在 T1 发出(节点 1 的时间戳) -delete 通过节点 3 进入系统,但带有时间戳 T0 -system 推断插入发生在稍后,因此忽略删除
这给人一种错觉,即删除在插入之前执行,具体取决于各个节点发送的时间戳。
在插入和删除之间留出足够的时间解决了我的问题,尽管我不太确定真正的根本原因是什么。
【问题讨论】:
-
删除和验证删除的选择之间的时间?
标签: cassandra