如何解决在 Cassandra 中,为什么单个值优先于仲裁节点的空响应?
在 Cassandra 中,tombstones 用于删除,因为写入是写入不可变文件。我读到墓碑也解决了分布式系统中删除的棘手问题。这是我感到困惑的地方。从分布式数据库中删除存在哪些问题?例如:以具有节点 A、B 和 C 的 3 节点集群为例。假设节点 C 已关闭并且删除了。它在 A 和 B 中被标记为墓碑,成功返回给客户端。一段时间后,A 和 B 上的压实开始并清除了这个墓碑。现在,当读取先前删除的值时,A 和 B 不返回任何内容,而 C 返回旧值。但在这里我读到 C 给出的值优先于空响应。
如果在该节点恢复之前已从集群的其余部分删除了墓碑记录,Cassandra 会将恢复节点上的记录视为新数据,并将其传播到集群的其余部分。
为什么要这样做?既然仲裁节点说这个值不存在,为什么我们不把它返回给客户端呢?这可能会简化分布式系统中的删除问题,因为我们无需等待 gc 宽限秒就可以清除墓碑。
解决方法
仲裁不返回任何内容也可能意味着其余节点根本没有收到值,因为节点已关闭,因此在这种情况下,具有数据的单个节点是正确的,并且该值将传播到具有数据的节点没有它。 Cassandra 根本不知道,是因为通过墓碑删除数据而丢失数据,还是因为在写入时节点不可用而丢失数据。
这就是为什么定期进行维修并确保在 gc_grace_seconds 期间进行维修很重要的原因。并且您在超过此时间段下线后没有放回机器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。