paxos made simple 简洁说明

46 阅读3分钟
  • Paxos算法——优雅解读与注释

基本介绍

Paxos算法是分布式系统中实现一致性(Consensus)最经典且基础的协议之一。它能保证即使出现节点故障、消息丢失或网络分割,只要多数节点可用,就可以安全地就某个值达成唯一决议。

整个流程分为“阶段一”(Prepare/Promise) 和 “阶段二”(Accept/Accepted),通过Proposer和Acceptor的相互协作驱动。


伪代码与流程注释

角色说明

  • Proposer:发起提案编号,力图推动整个系统达成某个一致的决议值。
  • Acceptor:响应接受或拒绝提案,保证整个协议的安全性。
  • Quorum 半数原则:提案与接受均需获得超过一半成员响应方可安全推进。

阶段一:Prepare / Promise

# Proposer:初始化流程
function proposer_prepare():
    N = next_unique_proposal_number()     # 选择唯一递增编号N
    broadcast Prepare(N) to majority_acceptors()
    responses = collect_promises_from_majority()

    # 进入阶段二前的决策分支如下:
    # 如果多数Promise的accepted值均为空 -> 可选任意值
    # 否则 -> 选取acceptedN最大的acceptedV作为后续提案值

# Acceptor:响应Prepare请求
function acceptor_on_prepare(N):
    if maxN is None:
        maxN = N
        reply POK, acceptedN=None, acceptedV=None
        return
    if N < maxN:
        # 已承诺更高编号,不响应
        return
    if N >= maxN:
        maxN = N
        if acceptedN is None:
            reply POK, acceptedN=None, acceptedV=None
        else:
            reply POK, acceptedN, acceptedV
        return

阶段二:Accept / Accepted

# Proposer:根据Promise结果,发起Accept请求
function proposer_accept(N, responses):
    if majority responses are (POK, None, None):
        V = pick_any_value()     # 半数empty,任选值
    else:
        # 选取最大acceptedN对应的acceptedV作为提案值
        V = value_with_largest_acceptedN(responses)

    # 发起Accept(N, V)到多数Acceptor
    broadcast Accept(N, V) to majority_acceptors()
    accept_responses = collect_accepts_from_majority()
    # 若多数AOK,则通知Learners已安全决议
    if majority accept_responses are AOK:
        notify_learners(V)
    else:
        # 本轮编号未被多数接受,需升高N重新Prepare
        N = increase_proposal_number()
        proposer_prepare()

# Acceptor:响应Accept请求
function acceptor_on_accept(N, V):
    if N < maxN:
        # 已承诺更高编号,不响应
        return
    if N >= maxN:
        maxN = N
        acceptedN = N
        acceptedV = V
        reply AOK, acceptedN, acceptedV
        return

补充说明

1. 安全性如何保证?

  • 编号(N)保证并发时不会互相覆盖历史决议。
  • 在阶段一中收集到acceptedV时,Proposer必须选取已有多数派中最大编号的值,防止“旧值覆写新值”导致一致性损坏。

2. 为什么要有两个阶段?

  • 阶段一用来“清理”可能的旧提案,使并发的proposer不会对系统一致性产生威胁。
  • 阶段二才实际赋值,且必须承诺不违背阶段一获得的历史值。

3. 常见的实践与改进

  • 多轮决议时,可用Multi-Paxos优化,减少网络交互。
  • 引入Leader角色可简化proposer冲突。
  • 持久化Acceptor状态,防止节点意外重启导致安全性丢失。

4. Learner角色

  • Paxos基础流程未细化如何通知Learner,实际工程中通过汇聚Acceptors决议转发给Learners实现。

总结与参考

Paxos算法通过编号、半数原则和两阶段协议实现最小通信量的一致性决议,是分布式一致性算法奠基石。
建议深入阅读论文原文以及工程实践案例,加深理解。

参考文献:

  • Lamport, L. "Paxos Made Simple." 2001.
  • Distributed Systems textbook, Tanenbaum.