分布式算法(四):Basic Paxos协议初探

一、什么是 Paxos 算法

Paxos 是一种分布式一致性算法,用于确保多个节点在出现网络延迟、故障或消息丢失的情况下仍能就某个值达成一致。这是分布式系统的核心问题之一。

Paxos 最早由 Leslie Lamport 提出,其思想来源于投票和多数派原则。Basic Paxos 是 Paxos 的最基础形式——它保证单个提案(proposal)的共识。后续如 Multi-Paxos、Raft 等都可看作是它的扩展。


二、角色与基本概念

Paxos 系统中主要有三个角色:

角色名称作用说明
Proposer(提案者)负责提出提案(proposal)。
Acceptor(接受者)对提案进行投票和接受。
Learner(学习者)被通知最终的决议结果。

为了方便理解,我们用一个思维导图展示这三者的关系:

Basic Paxos角色

Proposer 提案者

发起提案

与多数Acceptor通信

Acceptor 接受者

阶段一:准备(Prepare)

阶段二:接受(Accept)

保存最高提案编号

Learner 学习者

监听决议结果

更新状态机


三、Paxos 的核心思想

Paxos 的核心目标是:

在网络环境不可靠、节点可能宕机的情况下,也能让多数节点对某个值达成一致。

它通过**两阶段提交(Two-phase commit)**来实现:

  1. Prepare 阶段(准备阶段)
  2. Accept 阶段(接受阶段)

如果一个提案在多数节点上得到批准,那么它就是“被选中的提案”,系统即达成共识。


四、阶段一:Prepare 阶段

在 Prepare 阶段中,Proposer 向所有 Acceptor 发送一个包含唯一编号的提案号 n,请求他们“承诺”不再接受比这个编号更小的提案。

Acceptor 的响应规则:

  • 如果收到的提案号 n 比它之前见过的提案号都大,就承诺不再接受较小的提案。
  • 如果它之前已经接受过某个提案,则返回该提案的值及编号。

下面是阶段一的通信流程(时序图展示):

"接受者(Acceptor3)" "接受者(Acceptor2)" "接受者(Acceptor1)" "提案者(Proposer)" "接受者(Acceptor3)" "接受者(Acceptor2)" "接受者(Acceptor1)" "提案者(Proposer)" "发送Prepare请求(n)" "发送Prepare请求(n)" "发送Prepare请求(n)" "返回承诺及已接受的提案(可为空)" "返回承诺及已接受的提案(可为空)" "返回承诺及已接受的提案(可为空)"

五、阶段二:Accept 阶段

当 Proposer 收到多数 Acceptor 的承诺响应后,它将进入阶段二,发送提案内容(编号 n 与提议的值 v)进行正式投票。

Acceptor 的行为:

  • 若当前看到的最高承诺编号 ≤ 提案编号 n,则接受该提案。
  • 否则,拒绝。

最终,当有多数 Acceptor 接受了同一个提案时,该值被认为是被选中的值(Chosen Value)

下面是对应流程图:

Proposer 收到多数承诺

Proposer 选择提案值

发送 Accept 请求(n, v)

Acceptor 判断是否接受

大多数接受则达成共识

Learner 获得最终结果


六、为何 Paxos 能保证一致性

Paxos 算法关键在于:

  1. 提案编号单调递增 —— 保证新提案不会与旧提案冲突。
  2. 多数派原则 —— 任意两个多数集合必然有交集,确保旧提案信息可被新提案继承。
  3. 两阶段确认 —— 防止并行提案导致冲突。

这一设计使 Paxos 即使某些节点失效,也能保持一致性,不会产生不同的决议。

七、Paxos的故障恢复机制详解(Fault Recovery)

分布式系统中的故障是常态——节点宕机、网络分区、消息丢失在大型集群中经常发生。
Basic Paxos 设计的最大亮点之一,就是能够在部分节点故障的情况下仍保证一致性与正确恢复

Paxos 的故障恢复主要体现在以下几个层面:


1️⃣ 临时节点故障(Acceptor/Proposer宕机)

(1)多数原则确保共识继续进行

Paxos 要求提案只需获得多数节点同意即可达成共识。
因此,即便少数节点临时宕机,仍不会影响整个系统的决议。

(2)宕机节点恢复后的处理逻辑

当节点重新上线后:

  • 加载本地持久化的状态(存储过的最大提案号与已接受提案)。
  • 再次参与新的 Paxos 流程。
  • 通过从其他节点学习最新决议(Learner机制),保持状态一致。

如下图展示了节点故障恢复的基本流程:

某节点宕机

剩余多数Acceptor继续Paxos流程

系统正常达成共识

故障节点恢复

从其他节点同步最新状态

重新参与后续提案流程


2️⃣ Proposer故障恢复

在实际系统中,Proposer可能在提案进行中断开连接或宕机。
Basic Paxos允许其他节点成为新的Proposer并继续发起提案。

为避免提案冲突,新 Proposer须遵守以下策略:

  • 使用比已知最高提案号更大的编号(例如上一轮最大编号为 n,则新提案号取 n+1)。
  • 重新发起 Prepare 阶段,收集多数 Acceptor 的承诺。
  • 若存在旧提案已被部分接受,则继承那些提案的值,保证上一轮结果不会丢失。

如下用时序图展示 Proposer 故障恢复的过程:

"Acceptor3" "Acceptor2" "Acceptor1" "新Proposer(故障恢复后)" "旧Proposer(已宕机)" "Acceptor3" "Acceptor2" "Acceptor1" "新Proposer(故障恢复后)" "旧Proposer(已宕机)" "P_old 宕机" "发送Prepare请求(n)" "发送Prepare请求(n)" "发送Prepare请求(n)" "发送新Prepare请求(n+1)" "发送新Prepare请求(n+1)" "发送新Prepare请求(n+1)" "返回承诺及可能的旧提案" "返回承诺及可能的旧提案" "返回承诺及可能的旧提案" "发送Accept请求(n+1,v)" "发送Accept请求(n+1,v)" "发送Accept请求(n+1,v)"

3️⃣ 持久化机制保证数据安全

每个 Acceptor 都需对以下内容实施持久化存储:

  1. 已响应(Promise)的最大提案编号 n_max
  2. 已接受的提案内容 (n, v)

这样即便系统或者节点突然宕机,只要本地磁盘数据不丢失,重启后仍然能依据持久化数据恢复现场。

这就保证:

  • 过去多数接受的提案结果不会被遗忘;
  • 新一轮提案仍可延续旧提案的共识状态;
  • 系统在多次故障恢复后仍保持强一致性。

4️⃣ 网络分区与消息重传机制

在分布式环境中,网络分区可能导致部分节点暂时无法通信。
Paxos 通过以下策略应对:

  • 超时重试机制:若 Proposer 未收到多数响应,则自动超时并重新发起新提案(提案号 +1)。
  • 冗余消息策略:同一请求可多次发送,重复消息由 Acceptor 根据提案号去重。
  • 异步恢复:当分区恢复后,故障节点可学习最新共识结果(通过 Learner 模块)。

如下图所示:

Proposer等待响应超时

检测网络分区或丢包

重新发起新提案(n+1)

Acceptor根据提案号去重

网络恢复后Learner同步最终结果


5️⃣ Learner的状态同步机制

Learner 是整个系统保持最终一致性的关键角色。
在故障恢复阶段:

  • Learner 可从多数 Acceptor 拉取已决定的提案值;
  • 若 Learner 自身发生故障,恢复后即可从其他 Learner 获取已达成的决议;
  • 多个 Learner 保持实时同步,最终保障系统状态一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TracyCoder123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值