首页 > 解决方案 > 在 Cassandra 中,为什么单个值优先于仲裁节点空响应?

问题描述

在 Cassandra 中,墓碑用于删除,因为写入被写入不可变文件。我读到墓碑还解决了分布式系统中删除的难题。这就是我感到困惑的地方。从分布式数据库中删除存在哪些问题?例如:以一个包含节点 A、B 和 C 的 3 节点集群为例。假设节点 C 已关闭并且出现了删除。它在 A 和 B 中被标记为墓碑,成功返回给客户端。一段时间后,A 和 B 开始压实,并清除了这个墓碑。现在,当读取先前删除的值时,A 和 B 什么也不返回,而 C 返回旧值。但是在这里我读到 C 给出的值优先于空响应。

如果在该节点恢复之前已从集群的其余部分删除了墓碑记录,则 Cassandra 将已恢复节点上的记录视为新数据,并将其传播到集群的其余部分。

为什么这样做?既然仲裁节点说这个值不存在,我们为什么不把它返回给客户端呢?这可能会简化分布式系统中的删除问题,因为我们不需要在清除墓碑之前等待 gc grace 秒。

标签: cassandradistributed-systemtombstone

解决方案


quorum 不返回任何内容也可能意味着其余节点根本没有收到值,因为节点已关闭,因此在这种情况下,具有数据的单个节点是正确的,并且该值将传播到不接收的节点有它。Cassandra 根本不知道,数据是否因为通过墓碑删除而丢失,而数据是否丢失是因为在写入时节点不可用。

这就是为什么定期运行修复并确保在 gc_grace_seconds 期间发生这种情况很重要的原因。并且您在离线时间超过此期间后没有放回机器。


推荐阅读