“执行还必须保持确定性:读取系统时间、随机数或外部服务会引入非确定性,必须转化为已排序输入或通过协议协调。“多数副本存有某条日志”也不自动意味着客户端已看到线性一致结果;还需领导者提交规则、读…”
形式陈述
给定有限副本集合
则任意两次此类操作都共享至少一个参与者,旧证据与新证据因而有机会相遇。交集大小来自包含—排除公式:对任意
因此两个大小至少为
复制寄存器常把读集合族
第一式由
直觉
quorum 的作用是避免每次操作都等待全体副本,同时又不让关键证据彼此错过。一次写只接触部分节点,后续读取也只接触部分节点,但两组人必然有重叠,于是至少有人有机会见过新状态。它建立的是“证据交接通道”,不是自动的一致性算法:交点上的节点需要持久保存什么、如何比较版本、何时承诺,都要由上层协议补齐。
安全与可用性在这里拉向相反方向。quorum 越大,两个集合越容易产生足够大的交集,也越能排除矛盾决定;与此同时,一次操作要等更多节点,故障或分区时更难凑齐。对允许任取
例子与边界
设
网络分区时,两个互不连通的分区不可能各自包含一个严格多数 quorum。较小分区停止服务,保住了双方不能各自形成冲突决定的安全性;若强行允许两边都继续写,则必须接受冲突合并或放弃强一致保证。这里的取舍来自集合相交事实,不是通信库的偶然行为。
读写相交也不能独自保证线性一致读。三个副本初值均为 0,一次未完成写只把副本 A 更新为版本 1;读者先读 A、B,返回 1,随后另一个读者读 B、C,却返回 0。两次读都取多数,仍产生新值之后倒退。ABD 寄存器让第一次读在返回前把最高版本写回一个 quorum,使后继读必然遇到该版本;是否需要这一步取决于完整协议,不能只看
在 ABD 的固定多数多写者扩展中,接收证据的还包括写者自己的查询阶段。先前的写传播或读写回已经得到一个多数确认,新写的查询再与它相交,从而看见不低于先前操作的标签;新写把计数加一,才获得严格更大的标签。这里相交承担的是“传播阶段到后继查询阶段”的交接,交点上的状态单调性和消息先后把集合事实变成实时顺序保证。它没有要求同一组节点永远可用,也不意味着任何其他 quorum 协议都必须让所有种类的集合两两相交。
在
个节点。即使其中
推论与应用
Paxos 中,新 ballot 的 Phase 1 quorum 必须与每个可能选定旧值的 Phase 2 quorum 相交。共同 acceptor 报告其持久 accepted 记录,proposer 再按 ballot 继承值;若共同节点可以遗忘记录或新 proposer 可以忽略记录,即使集合仍相交,两个值也可能分别被选定。Basic Paxos 让两阶段都用多数,Flexible Paxos 则揭示真正必要的是相关 Phase 1 与 Phase 2 集合族交叉相交,而非机械要求所有同阶段 quorum 两两相交。
Raft 让选举 quorum 与提交 quorum 相交,并用“一任期一票”和日志新旧限制规定交点如何携带证据。读写复制可用不对称的
对具体协议,验证 quorum 不能只检查集合大小。还应写清哪些操作族必须互相相交、故障后哪些 quorum 仍可达、交集里需要多少正确节点,以及节点保存的证据是否跨轮次有效;缺少任一项,相交公式都不足以推出协议安全。
参考资料
- David K. Gifford, “Weighted Voting for Replicated Data,” Proceedings of the 7th ACM Symposium on Operating Systems Principles, 1979, pp. 150–162。
- Heidi Howard, Dahlia Malkhi, and Alexander Spiegelman, “Flexible Paxos: Quorum Intersection Revisited,” OPODIS 2016, LIPIcs 70, Article 25,§5 的两阶段交叉相交证明。
- Dahlia Malkhi and Michael Reiter, “Byzantine Quorum Systems,” Distributed Computing 11, 1998, pp. 203–213。