一致性算法- Paxos

一致性算法- Paxos

Paxos是一种基于消息传递的分布式一致性算法,由Leslie Lamport(莱斯利·兰伯特)于1990提出。是目前公认的解决分布式一致性问题的最有效算法之一。

Paxos 是什么

Paxos协议是一个解决分布式系统中,多个节点之间就某个值(提案)达成一致(决议)的通信协议。它能够处理在少数节点离线的情况下,剩余的多数节点仍然能达成一致。

概念定义

Proposal:为了就某一个值达成一致而发起的提案,包括提案编号和提案的值。

涉及角色如下:
  
  Proposer:提案发起者,为了就某一个值达成一致,Proposer可以以任意速度、发起任意数量的提案,可以停止或重启。
  
  Acceptor:提案批准者,负责处理接收到的提案,响应、作出承诺、或批准提案。
  
  Learner:提案学习者,可以从Acceptor处获取已被批准的提案。

Paxos 协议

Paxos需要遵循如下约定:

  1. 一个Acceptor必须批准它收到的第一个提案。

  2. 如果编号为n的提案被批准了,那么所有编号大于n的提案,其值必须与编号为n的提案的值相同。

Paxos 协议是一个两阶段协议,分为Prepare 阶段 和 Accept阶段。

Prepare 阶段

Proposer 发送 Prepare

Proposer 生成一个全局唯一且递增的提案ID,向 Acceptor 发送请求,只携带提案ID即可。

Acceptor 应答 Prepare

Acceptor 接收到提案请求后,如下情况会收到应答

  • 当前提交的编号大于之前的其他机器 Prepare 的编号,

  • 当前是第一个提交 Prepare 的机器

Accept 阶段

Proposer 发送 Accept

如果Proposer收到半数以上Acceptor对其发出的编号为N的Prepare请求的响应,那么它就会发送一个针对[N,V]提案的Accept请求给半数以上的Acceptor。注意:V就是收到的响应中编号最大的提案的value,如果响应中不包含任何提案,那么V就由Proposer自己决定。

Acceptor 应答 Accept

如果Acceptor收到一个针对编号为N的提案的Accept请求,只要该Acceptor没有对编号大于N的Prepare请求做出过响应,它就接受该提案。

Learner

  一旦Acceptor批准了某个提案,即将该提案发给所有的Learner。为了避免大量通信,Acceptor也可以将批准的提案,发给主Learner,由主Learner分发给其他Learner。考虑到主Learner单点问题,也可以考虑Acceptor将批准的提案,发给主Learner组,由主Learner组分发给其他Learner。

Paxos 算法演示

死循环问题

  如果Proposer1提出编号为n1的提案,并完成了阶段一。与此同时Proposer2提出了编号为n2的提案,n2>n1,同样也完成了阶段一。于是Acceptor承诺不再批准编号小于n2的提案,当Proposer1进入阶段二时,将会被忽略。同理,此时,Proposer1可以提出编号为n3的提案,n3>n2,又会导致Proposer2的编号为n2的提案进入阶段二时被忽略。以此类推,将进入死循环。

  解决办法

  可以选择一个Proposer作为主Proposer,并约定只有主Proposer才可以提出提案。因此,只要主Proposer可以与过半的Acceptor保持通信,那么但凡主Proposer提出的编号更高的提案,均会被批准。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值