问题描述
在 Cassandra 中,tombstones 用于删除,因为写入是写入不可变文件。我读到墓碑也解决了分布式系统中删除的棘手问题。这是我感到困惑的地方。从分布式数据库中删除存在哪些问题?例如:以具有节点 A、B 和 C 的 3 节点集群为例。假设节点 C 已关闭并且删除了。它在 A 和 B 中被标记为墓碑,成功返回给客户端。一段时间后,A 和 B 上的压实开始并清除了这个墓碑。现在,当读取先前删除的值时,A 和 B 不返回任何内容,而 C 返回旧值。但在这里我读到 C 给出的值优先于空响应。
如果在该节点恢复之前已从集群的其余部分删除了墓碑记录,Cassandra 会将恢复节点上的记录视为新数据,并将其传播到集群的其余部分。
为什么要这样做?既然仲裁节点说这个值不存在,为什么我们不把它返回给客户端呢?这可能会简化分布式系统中的删除问题,因为我们无需等待 gc 宽限秒就可以清除墓碑。
解决方法
仲裁不返回任何内容也可能意味着其余节点根本没有收到值,因为节点已关闭,因此在这种情况下,具有数据的单个节点是正确的,并且该值将传播到具有数据的节点没有它。 Cassandra 根本不知道,是因为通过墓碑删除数据而丢失数据,还是因为在写入时节点不可用而丢失数据。
这就是为什么定期进行维修并确保在 gc_grace_seconds 期间进行维修很重要的原因。并且您在超过此时间段下线后没有放回机器。