cassandra - 在 Cassandra 中,为什么单个值优先于仲裁节点空响应?
问题描述
在 Cassandra 中,墓碑用于删除,因为写入被写入不可变文件。我读到墓碑还解决了分布式系统中删除的难题。这就是我感到困惑的地方。从分布式数据库中删除存在哪些问题?例如:以一个包含节点 A、B 和 C 的 3 节点集群为例。假设节点 C 已关闭并且出现了删除。它在 A 和 B 中被标记为墓碑,成功返回给客户端。一段时间后,A 和 B 开始压实,并清除了这个墓碑。现在,当读取先前删除的值时,A 和 B 什么也不返回,而 C 返回旧值。但是在这里我读到 C 给出的值优先于空响应。
如果在该节点恢复之前已从集群的其余部分删除了墓碑记录,则 Cassandra 将已恢复节点上的记录视为新数据,并将其传播到集群的其余部分。
为什么这样做?既然仲裁节点说这个值不存在,我们为什么不把它返回给客户端呢?这可能会简化分布式系统中的删除问题,因为我们不需要在清除墓碑之前等待 gc grace 秒。
解决方案
quorum 不返回任何内容也可能意味着其余节点根本没有收到值,因为节点已关闭,因此在这种情况下,具有数据的单个节点是正确的,并且该值将传播到不接收的节点有它。Cassandra 根本不知道,数据是否因为通过墓碑删除而丢失,而数据是否丢失是因为在写入时节点不可用。
这就是为什么定期运行修复并确保在 gc_grace_seconds 期间发生这种情况很重要的原因。并且您在离线时间超过此期间后没有放回机器。
推荐阅读
- c# - 通过 Linq 和 EF 选择链接表的空列表
- android - Android studio error - react native using firebase
- greenplum - 表greenplum数据库中缺少分布键
- excel - 如何从 maatwebsite/Excel 向集合添加额外数据
- git - 如何获取 github 文件的查询 url?
- python - 在尝试粘贴时,使用 tkinter 从 Windows 10 中的 Python 3.4 复制到剪贴板会导致崩溃
- android - simd 是否包含在 Android NDK 中
- python - python从套接字流接收图像
- javascript - Nodejs发布未访问文件所在的目录
- javascript - 单击添加按钮后元素立即消失