“状态机提供确定性转移语义,复制日志提供共同命令前缀;Paxos、Raft与Viewstamped Replication是日志层的具体协议。状态机复制由此支撑高可用键值存储、配置服务、数据库…”
形式陈述 ​
Basic Paxos 在异步消息传递系统与崩溃故障模型中,为一个共识实例选择单一值。安全性允许消息任意延迟、丢失、重复或乱序;节点不会伪造消息内容,也不会表现 Byzantine 行为。活性则另需重传最终成功、正确节点持续取步等公平性条件。
协议使用全序且唯一的 ballot 编号。一个 acceptor 在某个 ballot 记录提案,称为 accepted;同一值被一个quorum接受,称为 chosen;learner 获知 chosen 事实后,才称该值为 learned。accepted 是局部状态,chosen 是跨节点事实,learned 是知识状态,三者不能混用。
角色与持久状态 ​
Proposer 发起 ballot 并提出值,acceptor 作出承诺和接受记录,learner 收集证据得知结果。同一进程可以兼任多个角色,角色划分不改变协议逻辑。
每个 acceptor 维护两项关键状态:它承诺过的最高 ballot,以及自己编号最高的 accepted proposal (ballot,value)。在 crash-stop 模型中,停止的 acceptor 永不重新参与,状态不必经过重启;在 crash-recovery 模型中,这两项必须先写入稳定存储再回复。若重启节点遗忘 promise,便可能再次接受旧 ballot;若遗忘 accepted 记录,新 Phase 1 quorum 便可能漏掉已 chosen 值。
Phase 1:发现必须继承的值 ​
Proposer 选择新 ballot prepare(b)。Acceptor 在尚未承诺更高 ballot 时记录对 prepare(b) 可以重发同一承诺,不改变状态。
当 proposer 收到一个 quorum 的 promise 后,它检查这些回复。若没有 acceptor 报告已接受值,可以选择任意合法输入;否则必须采用回复中 ballot 最高的 accepted value。这个选择规则不是优化策略,而是连接新 ballot 与旧安全事实的桥梁。
Phase 2:接受与选择 ​
Proposer 向 acceptor 发送 accept(b,v)。尚未承诺更高 ballot 的 acceptor 可以记录 (b,v) 并回复 accepted。值
Learner 可以由 proposer 通知,也可以直接收集 acceptor 的 accepted 消息。通知方式影响消息数与故障恢复,却不改变 chosen 的定义。
直觉
安全不变量与归纳证明 ​
Paxos 的核心不变量是:若值
对
这个论证依赖 Phase 1—Phase 2 quorum 交集、ballot 单调 promise、最高 accepted 记录和 proposer 的继承规则。交集本身不够:若
例子与边界
三个 acceptor 的轨迹 ​
设 acceptor 为 (5,x),
若
推论与应用
进展条件与边界 ​
纯异步执行中,两个 proposer 可以不断以更高 ballot 抢占对方,使系统永远没有值 chosen。此执行没有违反 agreement:它只说明安全与进展是不同性质。通常要让某个正确 proposer 最终稳定地主导 ballot,并保证它与一个 quorum 之间的重传最终成功;最终出现的时间界与稳定领导者选举是实现这组条件的常见办法。Paxos 因而不反驳FLP 不可能性。
本页只覆盖单实例 Basic Paxos。Multi-Paxos 为许多日志槽位复用稳定 leader 和 Phase 1;复制日志还要定义缺槽、提交位置、应用位置、客户端去重和成员变更。Byzantine 节点、动态 quorum 与磁盘损坏也需要不同协议或额外假设,不能从 crash-fault 安全证明直接推出。
参考资料
- Leslie Lamport, “The Part-Time Parliament,” ACM Transactions on Computer Systems 16(2), 1998, pp. 133–169,Full paper, ballots, quorums, and consistency of ledgers。
- Leslie Lamport, “Paxos Made Simple,” ACM SIGACT News 32(4), 2001, pp. 51–58,§2, choosing and learning a value; §3, state-machine implementation。