Quorum 仲裁:NWR 与读写交集
本文基于模型知识整理(生成时未联网核对),关键结论建议对照经典文献复核。
一句话定义
Quorum 机制让写入到达 n 个副本中的 w 个、读取访问 r 个,只要 w + r > n 就保证读写集合有交集,从而以概率或确定性(取决于版本比较方式)读到足够新的值,并在可用性与一致性之间提供可调旋钮。
为什么重要
它是无主复制(kp-011)的核心引擎,也是"一致性可调"的工程实现(Cassandra/DynamoDB 的一致性级别参数)。理解 NWR,才能看懂 Dynamo 论文、读懂 Cassandra 的 ONE/QUORUM/ALL 配置,并避免"w=1 也敢叫强一致"的配置事故。
前置知识
核心概念
- N/W/R:n=副本数,w=写确认数,r=读确认数。
- 交集条件:
w + r > n⇒ 任意读集合与任意写集合至少共享一个副本。 - 读修复(read repair):读到旧副本时,把最新值写回落后的副本。
- 写修复/反熵:后台比对补齐(与 kp-010 的 anti-entropy 配合)。
- 一致性级别(Cassandra 术语):ONE(w/r=1,最快、最弱)→ QUORUM → ALL(最强、可用性最差)。
原理与机制
交集保证什么、不保证什么:w+r>n 只保证"读集合中至少有一个副本收到了这次写"。要据此确定最新值,还需版本比较机制(时间戳/版本向量,kp-015)挑出最大版本;若没有可靠的版本排序,交集也挑不错。更微妙的是:若两次并发写各自只到达部分副本且读集合恰好分别命中不同写入,"最新"需要向量时钟才能判定为并发(保留多版本)。因此严格结论是:quorum + 版本向量 + 单 key 读写可以逼近线性一致;只有时间戳取舍时则是"最后写胜"的弱保证。
可用性换算:容忍 n-w 个副本写故障、n-r 个副本读故障。w=1, r=1, n=3:写可用性最高但一致性最弱(两个并发写都"成功",冲突交给修复);w=2, r=2:容 1 副本故障且保证交集;w=3:无副本故障才可写(CAP 的 C 侧)。
sloppy quorum 与 hinted handoff(Dynamo 的可用性增强):正常副本不足时,写入"顺延"到不在偏好列表的其他节点,并在原节点恢复后把数据交还(hinted handoff)。这提高了分区时的写可用性,但交集不再保证——是一致性向可用性的明确让步(AP 选择)。
公式或模型
- 交集:r + w > n ⇒ P(读到本次写) = 1(在版本可比较前提下)。
- 可用性:写可容忍 n-w 副本故障;读可容忍 n-r 副本故障。
- 常见配置:n=3, w=2, r=2(均衡);n=3, w=1, r=1(纯性能,靠修复收敛)。
直观类比
重要文件交给 5 个保管人(n=5),寄出时确认 3 人收到(w=3),取件时问 3 人(r=3)——任意收件 3 人与问询 3 人必有交集,总有人拿着你要的版本。嫌麻烦就只确认 1 人、只问 1 人(快),但问错人就拿旧版(弱一致)。
实例或案例
- Dynamo 论文:n=3, w=2, r=2 为默认;购物车场景允许冲突多版本由客户端合并(kp-015)。
- Cassandra:业务按场景配 ONE/LOCAL_QUORUM/QUORUM/ALL;跨机房用 LOCAL_QUORUM 控制跨 DC 延迟。
- ZooKeeper:内部亦用多数派(w=r=(n+1)/2)确认写与读,是 quorum 思想与共识结合的实例。
常见误区
- 误区一:"w+r>n 就自动线性一致"。还需要写进入交集前完成排序/版本可比较;纯时间戳取舍 + 并发写仍是弱一致。
- 误区二:"sloppy quorum 不影响一致性"。它允许写入离开偏好集合,交集性质被破坏,一致性明显下降——开启即应视作 AP 模式。
- 误区三:"读修复很贵所以关掉"。修复是收敛的必要条件,关闭意味着旧值可能长期存在;应做预算限流而非关闭。
与其他知识点的关系
- kp-012:quorum 是 CP/AP 之间的可调实现。
- kp-015:版本向量/CRDT 是 quorum 读取后判定"最新"的关键搭档。
- kp-019:共识协议可看作"w = 多数派 + 全序日志"的强化版 quorum。
自测题
- n=5, w=2, r=3 满足交集条件吗?容忍几个写故障?
答:2+3=5 不大于 5,不满足交集(需 >5,如 w=3,r=3 或 w=2,r=4);写容忍 n-w=3 个副本故障。
- 读修复与反熵修复的分工?
答:读修复在读路径即时补齐被读到的旧副本,收敛快但覆盖面窄;反熵后台全量比对,覆盖一切漂移但收敛有周期。
- 为什么 sloppy quorum 会破坏交集?
答:写入落到偏好列表之外的节点,原始副本可能没有任何一份收到写,读偏好列表就可能与写集合不相交。
延伸阅读
- DeCandia 等, Dynamo(SOSP 2007)第 4、5 节。
- Cassandra 文档:consistency levels / read repair / hinted handoff。
- Abadi, "PACELC"(对 quorum 延迟代价的分析)。