共识算法-paxos

pasxos与raft,与mysql的主从复制,不同的是,不依赖于leader节点,像mysql的主节点挂了,全部网络就挂了,必须重新选举主节点,并且mysql主从复制只能主节点写。

pasxos多个节点可写。

二个值:

value:要提议的值,也可以是某种操作(比如对a加1)

number:提议的序列号,可理解为提议的版本号

三个角色:

1、proposer:提议者,发起提议。一轮共识中,多个proposer可以发起提议多个valuse。一轮的共识中,值有一个value值被达成全局一致性。

2、acceptor:接受提议者,或者称为提议接受者。proposer必须得到半数以上的accepter同意,才能写入成功。

3、learner: 提议学习者,将半数以上accepter达成共识的提议,同步给剩下的未达成共识的协议。

主要是为了解决多个副本同步过程中,由于网络原因,延迟,故障等原因,造成顺序不一致性,导致的整个系统数据的不一致性。

acceptor的结构

{

<#已经接受的序列号,#已经接受的值value>

#目前接受的最大的序列号

}

考虑基本方案1:

proposer获取acceptor锁的方式,哪个proposer获得acceptor锁,哪个proposer来对acceptor做写操作。这种方式的问题,在proposer获得acceptor的锁后,挂掉了,那么会造成死锁,所以这个方案有BUG

考虑改进方案2:

让acceptor给proposer发放锁后,然后仍可以向更高序列号的proposer发放锁。“喜新厌旧”的方式来发放锁。

考虑1个acceptor的情况:

1、proposer1发送序列号<#1>给acceptor,

      如果此时acceptor里面的值为<#空,#值空>, 那么接受proposer的请求,发放锁,里面的值为<#1,null>,此为确定值。

      如果此时proposer2发送更高的序列号<#2>给acceptor,那么acceptor已经有了确定性的序列号#1,将不会再接受proposer#2。

2、proposer1发送第2阶段,<#1,v1>给acceptor,acceptor会接受此v1值。

     此时,appeptor结构里的值为

    {

     <#1,#值1>

     <已经接受的最大序列号> #1

    }

      如果此时,让proposer2发送来更高的序列号<#2>给acceptor,那么acceptor会再次循环。

此方案的问题:只有1个acceptor,中心节点,此节点挂掉,整个系统挂掉。

改进方案3:引入多个acceptor的方案,解决方案2个问题。

考虑情况如下:

1、propose1向3个acceptor发动<#1>,此时3个acceptor的结构中都为空,那么接受<#1>,返回<#1,#值空>

     此时,propose2向acceptor1发送<#2>,    acceptor1看到#2比#1大,那么会接受#2,给Propose2发放锁,<#2,#值空>

2、prepose1得到了全部的3个acceptor的锁,那么就会向3个acceptor发送<#1,#值1>,

      其中acceptor1,发现#1 小于 #2,那么会拒绝接受prepose1的值。

      其中acceptor2,acceptor3,仍占领大多数,会接受这个prepose1这个值。

      此时preposer2向acceptor2发送<#2>,acceptor2已经有确定#值1了,会回复<#2,#值1>,此时,preposer2不会进入第2阶段了, 会接受#值1。

不理解的地方:

     acceptor得到一次确定值后,再进入下一轮循环,如何进入?

     按逻辑分析,应该是把结构体中的<#序号,#值>清空变为<#序号null,#值null>,保留 #最大已接受number。

     下一轮开始,只接受比 #最大已接受number 大的序列号,以此反复。

Paxos算法描述的过程是发生在“一次选举”的过程中,这个在前面也提到过,实际Paxos算法执行是一轮接一轮,每轮还有个专有称呼:instance(翻译成中文有点怪),每instance都选出一个唯一的value。

 

问题1:活锁问题

当proposer1第1阶段达成以后,第2阶段开始之前,3个acceptor中的2个,已经分别接受了proposer2和proposer3更高的序列号,此时会出现活锁的现象,proposer1,2,3谁都不能获得大多数选票。

解决办法,proposer1,2,3节点,选出1个leader,只让leader往acceptor解决请求。leader的选举有随机和超时机制,随机很好理解了,超时机制可参考raft。

问题2:序号的全局唯一性

这也是1个分布式一致性问题。

先给所有proposer节点编号,从0开始。0,1,2。。。。

公式:m*n+r旧的编号 = 新序列号

n为propose的总数,m为拥有最大值得那个proposer的编号,r为计算节点自己的旧的小的编号。

问题3:learn角色学习问题

learn如何知道acceptor已经获得确定的值,这需要由acceptor告诉他。

如果每个acceptor都需要告诉每个learn,那么会对网络造成很大负载,可以只告诉1个,或者1部分,或者选leader。根据算法自己定。

learn需要时有顺序的,先学习#序号1的#值,再学习#序号2个#值。

 

   

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值