在 Paxos 算法中,区分 Proposer(提议者) 和 Acceptor(决策者) 是为了在异步网络环境下实现职责分离,确保系统的一致性与高可用。
核心原因
1. 职责分离:主动驱动 vs 被动决策
关注逻辑复杂度:实现职责单一化,降低算法证明与实现的难度。
- Proposer(主动方):承担“协调者”职责,负责发起提议、处理冲突、驱动两阶段流程。
- Acceptor(被动方):承担“存储者”职责,负责持久化承诺、投票决策。
- 意义:这种分离避免了决策者既要存储状态又要处理复杂网络交互的逻辑混淆。
2. 高可用性:解耦提议动作与共识状态
关注系统可用性:实现提议者“无状态化”,确保提议者宕机时共识流程可恢复。
- 解耦效果:提议是一个临时的动态过程,而共识状态是持久的静态记录。
- 容错表现:如果提议者宕机,由于共识状态保存在独立的 Acceptor 中,新的 Proposer 可以随时接管未完成的提议。
- 意义:系统不再依赖特定的提议发起者,只要多数派 Acceptor 存活,共识就不会丢失。
3. 一致性保障:驱动两阶段锁定流程
关注系统正确性:应对异步网络的不确定性,确保消息乱序时的一致性安全性。
- 流程需求:为了应对异步网络中的消息乱序,必须通过“先询问、再锁定、后投票”的两阶段机制。
- 角色必要性:该流程天然需要一个主动驱动者(Proposer)来获取被动响应者(Acceptor)的承诺。
图解:Proposer 驱动的锁定流程
sequenceDiagram participant P1 as Proposer 1 participant A as Acceptor participant P2 as Proposer 2 Note over P1, P2: 异步网络导致消息乱序 P1->>A: 1. Prepare (n=1) A-->>P1: Promise (n=1) P2->>A: 2. Prepare (n=2) A-->>P2: Promise (n=2, 承诺不再接受 <2 的提议) rect rgb(200, 0, 0, 0.1) Note right of A: 此时 P1 的 Accept 请求才到达 P1->>A: 3. Accept (n=1, value=A) A-->>P1: Reject (n=1 < 承诺的 n=2) end P2->>A: 4. Accept (n=2, value=B) A-->>P2: Accepted (n=2, value=B)
总结
区分角色的本质是将“如何达成共识的逻辑”与“共识结果的存储”分离。Proposer 处理网络的不确定性,Acceptor 保证数据的安全性。这种设计使得 Paxos 能够优雅地处理节点宕机、消息乱序等分布式极端情况。