阅读 250

Paxos协议和流程详解!细说分布式系统中的去中心化的分布式协议

基本概念

  • Paxos协议是少数在工程实践中证实的强一致性,高可用的去中心化分布式协议

  • Paxos协议的流程较为复杂,但是基本思想类似投票过程

  • Paxos协议中有一组完全对等的参与节点 :acceptor

    • 这组节点各自就某一件事做出决议,如果某个决议获得了超过半数节点的同意则生效

  • Paxos协议中只要有超过一半的节点正常,就可以工作,就能很好对抗宕机,网络分化等异常情况

角色

  • Proposer: 提案者

    • 比如某个Proposer提议“将变量X设置为1”

    • 另一个Proposer提议“将变量X设置为2”

    • value: 指在工程实践中的任何操作:

    • Paxos协议中统一将这些操作抽象为value

    • 比如修改某个变量为某个值

    • 设置当前primary为某个节点等等

    • Proposer可以有多个

    • Proposor提出议案value:

    • 不同的Proposer可以提出不同甚至矛盾的value:

    • 但是对于同一轮Paxos过程,最多只有一个value被批准

  • Acceptor: 批准者

    • Acceptor可以有多个

    • Proposer提出的value必须获得超过半数的Acceptor批准后才能通过

    • Acceptor之间完全对等独立

  • Learner: 学习者

    • 就是通过读取各个Proposervalue的选择结果

    • 如果某个value被超过半数Acceptor通过,那么Learner就学习到了这个value

    • Learner学习被批准的value:

  • 类似Quorum机制,某个value需要获得N2+1\frac{N}{2}+12N+1Acceptor批准,学习者Learner需要至少读取N2+1\frac{N}{2}+12N+1Acceptor, 至多读取NAcceptor的结果后,才能学习到一个通过的value

  • 这三类角色只是逻辑上的划分,工程实践中一个节点可以同时充当这三类角色

流程

  • Paxos协议一轮一轮进行,每轮都有一个编号.每轮Paxos协议可能会批准一个value. 如果某一轮Paxos协议批准了某个value, 那么以后各轮Paxos协议只能批准这个value

  • 各轮协议流程组成一个Paxos协议实例: 一次Paxos协议实例只能批准一个value. 这也是Paxos协议强一致性的重要体现

  • 每轮Paxos协议分为两个阶段:

    • 准备阶段

    • 批准阶段

    • 这两个阶段ProposerAcceptor有各自的处理流程

Proposer处理流程

  • 向所有的Acceptor发送消息 “Prepare(b)”, 这里的bPaxos的轮数,每轮递增

  • 如果收到任何一个Acceptor发送的消息 “Reject(B)”, 对于这个Proposer而言,本轮Paxos失败,将轮数b设置为B+1后重新进行上一个步骤

    • 在批准阶段,会根据收到的Acceptor的消息作出不同选择

  • 如果接收到的Acceptor“Promise(b, v_i)” 消息达到N2+1\frac{N}{2}+12N+1. NAcceptor总数,除法取整 ,v-i表示Acceptor最近一次在i轮批准过的value

    • 如果收到的 “Promise(b, v)消息”,v都为空 ,Promise会选择一个value作为v, 向所有Acceptor广播消息Accept(b, v)

    • 否则,在所有接收的 “Promise(b, v_i)消息” 中,选择i最大的value作为v, 向所有Acceptor广播消息 “Accept(b, v)”

  • 如果接收到Nack(B), 将轮数b设置为B+1后重新进行第一步步骤

Acceptor流程

  • 接收某个Proposer的消息Prepare(b). 参数B是该Acceptor收到的最大Paxos轮数编号 ,VAcceptor批准的value, 可以为空

    • 如果b > B, 回复Promise(b, V_B), 设置B = b. 表示不再接受编号小于b提案

    • 否则,回复 “Reject(B)消息”

  • 接受Accept(b, v):

    • 如果b < B, 回复Nack(B), 表示Proposer有一个更大编号的提案被这个Acceptor接收了

    • 否则设置V=v. 表示这个Acceptor批准的Valuev. 广播 “Accepted消息”

Paxos协议示例

  • 5Acceptor,1Proposer, 不存在任何网络,宕机异常

  • 着重考察各个Acceptor上变量B和变量V的变化以及Proposer上变量B的变化

  • 初始状态:

在这里插入图片描述

  • Proposer向所有Acceptor发送“Prepare(1)”. 所有Acceptor正确处理,并回复Promise(1, NULL) :

在这里插入图片描述

  • Proposer收到5个Promise(1,NULL),满足多余半数的Promise的value为空,此时发送Accept(1, v1),其中v1是Proposer选择的value :

在这里插入图片描述

  • 此时,v1被超过半数的Acceptor批准,v1即是本次Paxos协议实例批准的value. 如果Learner学习value,学习到的只能是v1

  • Paxos协议的核心 : 批准的value无法改变. 这也是整个协议正确性的基础

    • 在同一个Paxos实例中, 批准的value是无法改变的,即使后续Proposer以更高的序号发起Paxos协议也无法改变value

  • Paxos协议是被人为设计出来的,设计过程也是协议的推导过程:

    • Paxos协议利用了Quorum机制,选择的W=R=N2+1W=R=\frac{N}{2}+1W=R=2N+1

    • 协议就是Proposer更新Acceptor的过程,一旦某个Proposer成功更新了超过半数的Acceptor, 那么就更新成功

    • Learner按照Quorum机制去读取Acceptor, 一旦某个value在超过半数的Proposer上被成功读取,则说明这是一个被批准的value

    • 协议通过引入轮次,使得高轮次的提议抢占低轮次的提议来避免死锁

  • 协议设计的关键点:

    • 如何满足 “在一次Paxos算法实例过程中只批准一个value” 这一约束条件


作者:攻城狮Chova
链接:https://juejin.cn/post/7027098708097368100


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐