分布式算法 - Paxos算法
(一) Paxos 算法的设计原理、工程实现及与 Raft 的对比
一、设计原理
- 目标:在分布式系统中实现一致性,即使在部分节点故障或网络分区的情况下,也能保证系统正确运行。
- 基本思想:
- 通过多轮消息交互达成共识
- 使用提案编号(Proposal Number)解决冲突
- 采用"两阶段提交"思想(准备阶段和承诺阶段)
- 关键特性:
- 容错性:允许最多N/2个节点故障(N为总节点数)
- 一致性:最终所有正确节点会达成相同决策
- 活性:系统最终能做出决策(在非拜占庭故障下)
二、工程实现要点
- 角色实现:
- 提议者(Proposer):负责发起提案
- 接受者(Acceptor):负责接受或拒绝提案
- 学习者(Learner):负责学习最终决策
- 关键机制:
- 提案编号单调递增
- 多数派(Quorum)机制
- 心跳检测(可选)
- 优化方向:
- Multi-Paxos:减少准备阶段消息
- Fast Paxos:减少通信轮次
- EPaxos:支持非确定性操作
三、与Raft对比
特性 | Paxos | Raft |
---|---|---|
设计目标 | 通用一致性算法 | 易于理解的分布式共识算法 |
复杂度 | 较高(理论性强) | 较低(工程友好) |
角色划分 | 提议者、接受者、学习者 | 领导者、跟随者、候选人 |
选举机制 | 无内置选举机制 | 有明确的领导者选举机制 |
日志复制 | 需要额外实现 | 内置日志复制机制 |
故障恢复 | 较复杂 | 较简单 |
学习曲线 | 陡峭 | 平缓 |
实际应用 | Google Chubby等 | etcd、Consul等 |
消息复杂度 | 较高(两阶段) | 较低(单阶段为主) |
可理解性 | 难以直观理解 | 直观易懂 |
四、核心差异总结
-
设计哲学:
- Paxos:理论优先,通用性强
- Raft:工程优先,易理解
-
实现方式:
- Paxos:需要自行实现日志复制、选举等机制
- Raft:内置完整解决方案
-
运维体验:
- Paxos:故障排查困难
- Raft:状态机清晰,易于监控
-
适用场景:
- Paxos:需要高度定制化的系统
- Raft:需要快速落地的生产系统
五、选择建议
- 选择Paxos:当需要极致性能或特殊一致性需求时
- 选择Raft:当需要快速开发、易于维护的生产系统时
Paxos作为分布式一致性的理论基石,为后续算法(包括Raft)提供了基础;而Raft则通过简化设计,使分布式一致性算法更易于工程实现和理解。
(二) Paxos算法详解 核心角色 核心流程
一、 Paxos算法核心角色
- 提议者(Proposer):提出提案(包含提案编号和值),试图让接受者接受该提案。
- 接受者(Acceptor):接收提议者的提案,决定是否接受该提案。
- 学习者(Learner):学习被批准的提案,了解系统的最终决策。
二、 Paxos算法核心流程
1. 准备阶段(Prepare Phase)
- 提议者选择一个提案编号
n
(比之前使用过的编号都大),向大多数接受者发送Prepare(n)
请求。 - 接受者收到
Prepare(n)
请求后:- 如果
n
大于它之前响应过的所有Prepare
请求的编号,它承诺不再接受编号小于n
的提案,并返回它已经接受过的编号最大的提案(如果有)。 - 否则,它忽略该请求。
- 如果
2. 承诺阶段(Accept Phase)
- 提议者收到大多数接受者的
Promise
响应后:- 如果所有返回的提案都是空的,提议者可以提出自己的值
v
。 - 否则,提议者必须使用返回的编号最大的提案的值。
- 提议者向大多数接受者发送
Accept(n, v)
请求。
- 如果所有返回的提案都是空的,提议者可以提出自己的值
- 接受者收到
Accept(n, v)
请求后:- 如果
n
不小于它之前承诺的编号,它接受该提案,并返回Accepted(n, v)
响应。 - 否则,它忽略该请求。
- 如果
3. 学习阶段(Learn Phase)
学习者通过监听接受者的 Accepted
响应来学习被批准的提案。
三、算法流程图
流程图说明
- 准备阶段:提议者发送
Prepare
请求,接受者根据提案编号进行响应,承诺不再接受编号小的提案并返回已接受的提案信息。- 承诺阶段:提议者根据接受者的响应决定提案的值,然后发送
Accept
请求,接受者根据提案编号决定是否接受该提案。- 学习阶段:学习者监听接受者的
Accepted
响应来学习被批准的提案。- 可视化设计:使用粉色标注提议者初始操作节点,蓝色标注关键操作节点,橙色标注学习阶段节点,流程方向清晰,包含必要的条件判断。