为什么读修复不足以使发电机式数据库线性化?

问题描述 投票:0回答:1

我正在阅读 DDIA。它说“可以以降低性能为代价使 Dynamo 式仲裁线性化:读取器必须在将结果返回到应用程序之前同步执行读取修复(请参阅第 178 页的“读取修复和反熵”)[23],并且写入器在发送其写入之前必须读取法定节点的最新状态。”

要求“写入者在发送写入之前必须读取节点法定数量的最新状态”有什么好处?

读取修复将修复图 1 中的示例,但我无法提出编写者应该在写入之前执行大量读取的原因或示例,尤其是假设它是无条件的。

enter image description here

enter image description here

database database-design distributed-system distributed-transactions consensus
1个回答
0
投票

按照我的理解,作者并不是说编写者需要读取该值,而是说他们应该检查集群写入仲裁的最新状态(即编写者是否可以看到所有“w”节点)并且应该 推迟如果不满足,请写。否则,即使后续读取是“读取修复”,您最终也可能会读取从一开始就从未被视为成功的写入的陈旧数据,从而违反了线性化。

在引用的示例中(n = 3,w = 3,r = 2),假设写入者仅连接到Replica-1(而不是所有3个),但发起了x = 1的写入,这当然随后被视为失败(因为副本 2 和副本 3 未更新)。现在,如果读取器 A 和读取器 B 按照图表执行读取修复,使用最新写入获胜,则所有 3 个副本的 x=1。这是不正确的,因为读者必须得到 x=0,因为之前的写入被视为失败。

请注意,读者 A 和 B 可能在我们收到写入响应后开始,但我们仍然会遇到相同的情况。即使写入器可以与所有 3 个副本通信,但由于磁盘错误而导致其中 2 个副本写入失败,您也有可能最终处于这种状态。因此,在写入之前检查法定人数只是部分要求。

总而言之,任何仅依赖于基于仲裁的一致性的无领导者复制都不是 100% 线性化的。

© www.soinside.com 2019 - 2024. All rights reserved.