【问题标题】:In Cassandra, why does a single value take precedence over quorum nodes empty response?在 Cassandra 中,为什么单个值优先于仲裁节点空响应?
【发布时间】:2021-01-07 15:16:28
【问题描述】:

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

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

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

【问题讨论】:

    标签: cassandra distributed-system tombstone


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。我可以知道法定人数没有数据的可能情况吗?为了写入成功,仲裁节点必须回复成功。那么,如果仲裁节点响应时没有任何值,那不就一定意味着该值被删除了吗?
    • 不,没有该值并不意味着它已被删除。数据被删除的唯一通信意义就是墓碑——如果它过期了,你不能说你有没有数据。此外,即使您使用 QUORUM 写入数据,并收到超时,数据仍然可以写入某些节点 - Cassandra 没有办法说 - 回滚事务......见这里:stackoverflow.com/questions/30017301/…跨度>
    猜你喜欢
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 2020-11-05
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    相关资源
    最近更新 更多