Google 的 Chubby 锁服务和 Spanner 数据库都基于 Paxos 协议构建。Paxos 由 Leslie Lamport 于 1990 年提出(1998 年正式发表),是分布式共识领域的理论基石。尽管 Raft 因易理解性在工程实践中更受欢迎,但理解 Paxos 对深入掌握共识算法的本质至关重要。
一、共识问题定义
一组节点需要对某个值达成一致,需满足:
- 安全性(Safety):所有节点决定的值相同,且一旦决定不可更改
- 活性(Liveness):只要多数节点可达,最终一定能做出决定
- 容错性:少数节点故障不影响系统正常运行
Paxos 通过”多数派”(Quorum)机制保证安全性:任何两个多数派必有交集,因此已决定的值不会被覆盖。
二、Basic Paxos
2.1 三种角色
| 角色 | 职责 |
|---|---|
| Proposer(提案者) | 提出值,争取多数 Acceptor 接受 |
| Acceptor(接受者) | 对提案投票,接受或拒绝 |
| Learner(学习者) | 得知最终决定的值 |
实际部署中,一个节点通常同时扮演多种角色。
2.2 两阶段协议
Basic Paxos 分为两个阶段:
阶段一:Prepare
- Proposer 选择提案编号 n,向所有 Acceptor 发送 Prepare(n)
- Acceptor 收到 Prepare(n) 后:
- 如果 n 大于已承诺的编号,承诺不再接受小于 n 的提案,并返回已接受的最大编号提案
- 否则拒绝
阶段二:Accept
- Proposer 收到多数 Acceptor 的 Promise 后:
- 如果返回中有已接受提案,使用最高编号提案的值
- 否则使用自己提议的值
- 向所有 Acceptor 发送 Accept(n, value)
- Acceptor 收到后,如果 n 不小于已承诺编号,则接受
2.3 安全性推导
Paxos 的安全性证明核心:如果值 v 在提案编号 n 被选定,则任何更高编号的提案的值也必须是 v。
推导过程:
- 值 v 在编号 n 被 Accept 阶段多数接受
- 任何更高编号 m 的提案,其 Prepare 阶段必须收到至少一个接受过 v 的 Acceptor 的响应
- Proposer 必须使用已接受提案中最高编号的值
- 通过归纳,更高编号的提案值必为 v
三、Multi-Paxos
Basic Paxos 每次决定一个值需要两轮 RPC,效率较低。Multi-Paxos 通过选举 Leader 优化:
3.1 Leader 选举
选出一个稳定的 Leader 后,所有提案由 Leader 发起,省去 Prepare 阶段:
- Leader 一次性发送 Prepare 覆盖所有未决定的槽位
- 后续请求直接执行 Accept 阶段
- 将两轮 RPC 减少为一轮
3.2 日志复制
Multi-Paxos 将共识扩展到日志序列,每个槽位独立运行 Paxos:
3.3 日志压缩
通过快照机制截断已提交的日志前缀,与 Raft 类似。
四、Paxos 的工程挑战
Paxos 理论完备但实现困难,主要挑战:
4.1 日志空洞
Multi-Paxos 允许日志存在空洞(某些槽位未决定),需要额外的补洞机制。
4.2 Leader 选举
Basic Paxos 未定义 Leader 选举过程,各实现需自行设计。
4.3 成员变更
原始论文未涉及成员变更,实际系统需扩展协议支持。
4.4 磁盘持久化
Acceptor 的承诺和接受状态必须持久化,崩溃后恢复才能保证安全性。
// 持久化状态type AcceptorState struct { PromisedID int64 // 已承诺的最大提案编号 AcceptedID int64 // 已接受的最大提案编号 AcceptedVal []byte // 已接受的值}五、Paxos 系列对比
| 协议 | 特点 | 适用场景 |
|---|---|---|
| Basic Paxos | 单值共识,两阶段 | 理论学习,简单配置项 |
| Multi-Paxos | 日志序列,Leader 优化 | 分布式数据库、锁服务 |
| Fast Paxos | 减少通信步骤,3F+1 节点 | 低延迟场景 |
| EPaxos | 去中心化,命令交错 | 跨区域部署 |
六、Paxos 在生产系统中的应用
6.1 Google Chubby
Chubby 是 Google 的分布式锁服务,基于 Paxos 实现。GFS、BigTable 等系统依赖 Chubby 进行 Leader 选举和元数据存储。
6.2 Google Spanner
Spanner 使用 Paxos 组(Paxos Group)管理数据分片,每个分片是一个 Paxos 复制组。Spanner 在 Paxos 之上引入 TrueTime API,实现外部一致性。
6.3 阿里 OceanBase
OceanBase 使用 Multi-Paxos 实现分布式事务的一致性提交,支撑支付宝核心交易。
七、Paxos 与 Raft 的选择
| 维度 | 选择 Paxos | 选择 Raft |
|---|---|---|
| 团队经验 | 有分布式共识经验 | 初次实现共识模块 |
| 性能需求 | 需要极致优化 | 通用场景即可 |
| 跨区域部署 | EPaxos 更优 | Raft 对跨区域支持较弱 |
| 调试难度 | 较高 | 较低 |
| 生态支持 | 较少 | etcd/Consul 生态成熟 |
Paxos 是分布式共识的理论根基,虽然工程实现难度较高,但其设计思想深刻影响了后续所有共识算法。理解 Paxos 的推导过程,有助于在更高维度理解分布式一致性问题的本质。
支持与分享
如果这篇文章对你有帮助,欢迎支持作者或分享给更多人
部分信息可能已经过时






