知识卡片

Paxos两阶段协议的核心机制:Prepare的"两个承诺一个应答"与Accept达成决议

结构图卡

内容

Paxos协议要解决的问题是:在少数派节点可能离线的情况下,让分布式系统里的多数派节点就某个提案达成一致的决议,它依赖一个基本假设——主备之间必须有多数派(N/2+1)机器存活且网络通信正常,否则协议无法推进。协议本身分两个阶段:第一阶段Prepare,Proposer先生成一个全局唯一且递增的ProposalID(通常用高位时间戳+低位机器IP保证唯一性和递增性),只携带这个ID(不携带具体提案内容)向集群所有机器发送PrepareRequest;Acceptor收到后要做出”两个承诺、一个应答”——两个承诺分别是不再应答ProposalID小于等于当前请求的PrepareRequest、不再应答ProposalID小于当前请求的AcceptRequest;一个应答则是把自己此前已经Accept过的、ProposalID最大的那个提案内容返回给Proposer(没有则返回空值)。这两个承诺的关键作用是给后续阶段设了一道”防护栏”:Acceptor在应答任何新请求之前,都要先检查这次应答会不会违背之前已经做出的承诺,并且这个PropsalID的持久化必须先于应答完成。第二阶段Accept,Proposer在收集到多数派对Prepare的应答后,向这些机器发送带有具体提案内容的AcceptRequest;Acceptor在不违背此前”两个承诺”的前提下,持久化这个ProposalID和提案内容并应答;一旦Proposer收集到多数派的AcceptResponse,这个提案就正式形成了决议。这套机制之所以能保证正确性,关键就在于”两个承诺”始终以ProposalID的大小作为唯一裁决依据——任何试图用更小ProposalID发起的操作都会被拒绝,从而保证了即使有多个Proposer并发竞争,最终也只会有一个提案能真正走完两个阶段形成决议。

结构图

sequenceDiagram
    participant P as Proposer
    participant A as Acceptor(多数派)

    Note over P: 阶段一:Prepare
    P->>A: PrepareRequest(ProposalID=N)
    Note over A: 检查承诺1:不应答ID<=N的Prepare<br/>检查承诺2:不应答ID<N的Accept
    A-->>P: 承诺遵守 + 已Accept过的最大提案(若有)
    Note over P: 收到多数派应答后进入阶段二
    Note over P: 阶段二:Accept
    P->>A: AcceptRequest(ProposalID=N, 提案内容)
    Note over A: 检查是否违背此前两个承诺
    A-->>P: 持久化ID和内容后应答AcceptResponse
    Note over P: 收到多数派AcceptResponse<br/>→ 决议正式形成

参考来源

- 位置:《高可用架构(第1卷)》第2章《高可用架构原理与分布式实践》"2.10 架构师需要了解的Paxos原理、历程及实战"节,"2.10.2 Paxos协议简单回顾"(源文件:_epub-src/OEBPS/Text/Chapter2_10_3.xhtml) - 结论依据:原文逐条列出Prepare阶段Proposer/Acceptor的行为("2个承诺,1个应答")和Accept阶段的行为("最后Proposer收集到多数派应答的AcceptResponse后,形成决议"),直接支撑本卡片结论与结构图。 - 原始内容:Acceptor收到PrepareRequest后,做出"2个承诺,1个应答"……第1,不再应答ProposalID小于等于……当前请求的PrepareRequest。第2,不再应答ProposalID小于……当前请求的AcceptRequest……最后Proposer收集到多数派应答的AcceptResponse后,形成决议。