mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1286 字
4 分钟
Paxos 协议:分布式共识的理论基石
2024-12-29

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

  1. Proposer 选择提案编号 n,向所有 Acceptor 发送 Prepare(n)
  2. Acceptor 收到 Prepare(n) 后:
    • 如果 n 大于已承诺的编号,承诺不再接受小于 n 的提案,并返回已接受的最大编号提案
    • 否则拒绝
sequenceDiagram participant P as Proposer participant A1 as Acceptor1 participant A2 as Acceptor2 participant A3 as Acceptor3 P->>A1: Prepare(n=5) P->>A2: Prepare(n=5) P->>A3: Prepare(n=5) A1-->>P: Promise(已接受提案{3, X}) A2-->>P: Promise(无已接受提案) A3-->>P: Promise(无已接受提案)

阶段二:Accept

  1. Proposer 收到多数 Acceptor 的 Promise 后:
    • 如果返回中有已接受提案,使用最高编号提案的值
    • 否则使用自己提议的值
  2. 向所有 Acceptor 发送 Accept(n, value)
  3. Acceptor 收到后,如果 n 不小于已承诺编号,则接受
sequenceDiagram participant P as Proposer participant A1 as Acceptor1 participant A2 as Acceptor2 participant A3 as Acceptor3 P->>A1: Accept(n=5, value=X) P->>A2: Accept(n=5, value=X) P->>A3: Accept(n=5, value=X) A1-->>P: Accepted A2-->>P: Accepted Note over P: 多数接受,值 X 被选定

2.3 安全性推导#

Paxos 的安全性证明核心:如果值 v 在提案编号 n 被选定,则任何更高编号的提案的值也必须是 v。

推导过程:

  1. 值 v 在编号 n 被 Accept 阶段多数接受
  2. 任何更高编号 m 的提案,其 Prepare 阶段必须收到至少一个接受过 v 的 Acceptor 的响应
  3. Proposer 必须使用已接受提案中最高编号的值
  4. 通过归纳,更高编号的提案值必为 v

三、Multi-Paxos#

Basic Paxos 每次决定一个值需要两轮 RPC,效率较低。Multi-Paxos 通过选举 Leader 优化:

3.1 Leader 选举#

选出一个稳定的 Leader 后,所有提案由 Leader 发起,省去 Prepare 阶段:

  • Leader 一次性发送 Prepare 覆盖所有未决定的槽位
  • 后续请求直接执行 Accept 阶段
  • 将两轮 RPC 减少为一轮

3.2 日志复制#

Multi-Paxos 将共识扩展到日志序列,每个槽位独立运行 Paxos:

graph LR subgraph "日志槽位" S1[Slot1: SET x=1] --> S2[Slot2: SET y=2] S2 --> S3[Slot3: SET x=3] S3 --> S4[Slot4: ...] end

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 的推导过程,有助于在更高维度理解分布式一致性问题的本质。

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

Paxos 协议:分布式共识的理论基石
https://blog.souloss.com/posts/distributed/distributed-paxos-protocol/
作者
Souloss
发布于
2024-12-29
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时