Sloppy Quorum能否保证强读一致性?我的推理是否有误?
在《Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable and Maintainable Systems》一书中,关于Sloppy Quorum有如下描述:
然而,这意味着即使w + r > n,你也无法确保读取到某个键的最新值,因为最新值可能暂时被写入到n个节点之外的某些节点中。
我无法理解这段话的含义,下面以客户端为键“K1”写入不同值为例进行分析:
假设配置
- 副本数:N=3
- 写入成功前需确认的节点数:W=2
- 读取成功前需接收的响应数:R=2
- 可用节点:A、B、C、D、E
满足W+R>N。初始状态下,A、B、C节点中存储键值对(K1,V1)。
写入与读取场景分析
随后假设A、B节点故障,(K1,V1)从C复制到D和E(因N=3),之后客户端在Sloppy Quorum配置下写入(K1,V2)。我的理解是,为避免像Strict Quorum配置那样阻塞写入操作,我们会使用C、D、E节点来写入并复制(K1,V2),且需要其中2个节点的确认。假设收到了C和D的确认,写入成功。
现在另一个客户端要读取K1的值,需要2个响应,存在三种情况:
- C和D先响应:我们肯定能得到(K1,V2),因为这两个节点已确认写入(K1,V2)
- C和E先响应:可能得到两个(K1,V2),也可能在复制到E未完成时,得到C返回的(K1,V2)和E返回的(K1,V1)。后者可通过Vector Clock等版本算法解决冲突,只要系统能处理冲突就能确保得到(K1,V2)(这种冲突在Strict Quorum配置中也可能出现,并非Sloppy Quorum导致)
- D和E先响应:情况与上述C和E的情况相同。
由此我认为,只要系统能处理冲突(这也是Strict Quorum配置需处理的),Sloppy Quorum系统就能保证强读一致性,返回(K1,V2),但这与书中描述不符。我的推理是否存在问题?
【2024年12月31日编辑】:数月后重读该问题,我想将“随后假设A、B节点故障,客户端在Sloppy Quorum配置下写入(K1,V2)”修改为“随后假设A、B节点故障,(K1,V1)从C复制到D和E(因N=3),之后客户端在Sloppy Quorum配置下写入(K1,V2)”,以便明确E后续可能返回(K1,V1)的原因。
内容的提问来源于stack exchange,提问作者Yas

