分布式算法 - Paxos算法

分布式算法 - Paxos算法

(一) Paxos 算法‌的设计原理、工程实现及与 Raft 的对比

一、设计原理

  1. 目标:在分布式系统中实现一致性,即使在部分节点故障或网络分区的情况下,也能保证系统正确运行。
  2. 基本思想
    • 通过多轮消息交互达成共识
    • 使用提案编号(Proposal Number)解决冲突
    • 采用"两阶段提交"思想(准备阶段和承诺阶段)
  3. 关键特性
    • 容错性:允许最多N/2个节点故障(N为总节点数)
    • 一致性:最终所有正确节点会达成相同决策
    • 活性:系统最终能做出决策(在非拜占庭故障下)

二、工程实现要点

  1. 角色实现
    • 提议者(Proposer):负责发起提案
    • 接受者(Acceptor):负责接受或拒绝提案
    • 学习者(Learner):负责学习最终决策
  2. 关键机制
    • 提案编号单调递增
    • 多数派(Quorum)机制
    • 心跳检测(可选)
  3. 优化方向
    • Multi-Paxos:减少准备阶段消息
    • Fast Paxos:减少通信轮次
    • EPaxos:支持非确定性操作

三、与Raft对比

特性PaxosRaft
设计目标通用一致性算法易于理解的分布式共识算法
复杂度较高(理论性强)较低(工程友好)
角色划分提议者、接受者、学习者领导者、跟随者、候选人
选举机制无内置选举机制有明确的领导者选举机制
日志复制需要额外实现内置日志复制机制
故障恢复较复杂较简单
学习曲线陡峭平缓
实际应用Google Chubby等etcd、Consul等
消息复杂度较高(两阶段)较低(单阶段为主)
可理解性难以直观理解直观易懂

四、核心差异总结

  1. 设计哲学

    • Paxos:理论优先,通用性强
    • Raft:工程优先,易理解
  2. 实现方式

    • Paxos:需要自行实现日志复制、选举等机制
    • Raft:内置完整解决方案
  3. 运维体验

    • Paxos:故障排查困难
    • Raft:状态机清晰,易于监控
  4. 适用场景

    • Paxos:需要高度定制化的系统
    • Raft:需要快速落地的生产系统

五、选择建议

  • 选择Paxos:当需要极致性能或特殊一致性需求时
  • 选择Raft:当需要快速开发、易于维护的生产系统时

Paxos作为分布式一致性的理论基石,为后续算法(包括Raft)提供了基础;而Raft则通过简化设计,使分布式一致性算法更易于工程实现和理解。

(二) Paxos算法详解 核心角色 核心流程

一、 Paxos算法核心角色

  1. 提议者(Proposer):提出提案(包含提案编号和值),试图让接受者接受该提案。
  2. 接受者(Acceptor):接收提议者的提案,决定是否接受该提案。
  3. 学习者(Learner):学习被批准的提案,了解系统的最终决策。

二、 Paxos算法核心流程

1. 准备阶段(Prepare Phase)
  1. 提议者选择一个提案编号 n(比之前使用过的编号都大),向大多数接受者发送 Prepare(n) 请求。
  2. 接受者收到 Prepare(n) 请求后:
    • 如果 n 大于它之前响应过的所有 Prepare 请求的编号,它承诺不再接受编号小于 n 的提案,并返回它已经接受过的编号最大的提案(如果有)。
    • 否则,它忽略该请求。
2. 承诺阶段(Accept Phase)
  1. 提议者收到大多数接受者的 Promise 响应后:
    • 如果所有返回的提案都是空的,提议者可以提出自己的值 v
    • 否则,提议者必须使用返回的编号最大的提案的值。
    • 提议者向大多数接受者发送 Accept(n, v) 请求。
  2. 接受者收到 Accept(n, v) 请求后:
    • 如果 n 不小于它之前承诺的编号,它接受该提案,并返回 Accepted(n, v) 响应。
    • 否则,它忽略该请求。
3. 学习阶段(Learn Phase)

学习者通过监听接受者的 Accepted 响应来学习被批准的提案。

三、算法流程图

n大于之前响应的编号
n不大于之前响应的编号
n不小于之前承诺的编号
n小于之前承诺的编号
提议者选择提案编号n
向大多数接受者发送Prepare(n)请求
接受者收到Prepare(n)请求
承诺不再接受编号小于n的提案
忽略请求
返回已接受过的编号最大的提案(如果有)
提议者收到大多数Promise响应
所有返回的提案是否为空
提出自己的值v
使用返回的编号最大的提案的值
向大多数接受者发送Accept(n, v)请求
接受者收到Accept(n, v)请求
接受该提案,返回Accepted(n, v)响应
忽略请求
学习者监听Accepted响应学习提案
流程图说明
  1. 准备阶段:提议者发送 Prepare 请求,接受者根据提案编号进行响应,承诺不再接受编号小的提案并返回已接受的提案信息。
  2. 承诺阶段:提议者根据接受者的响应决定提案的值,然后发送 Accept 请求,接受者根据提案编号决定是否接受该提案。
  3. 学习阶段:学习者监听接受者的 Accepted 响应来学习被批准的提案。
  4. 可视化设计:使用粉色标注提议者初始操作节点,蓝色标注关键操作节点,橙色标注学习阶段节点,流程方向清晰,包含必要的条件判断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值