paxos算法的分析与研究

来源:互联网 发布:淘宝文案策划案例 编辑:程序博客网 时间:2024/05/23 15:16

paxos算法是对分布式系统中,对各个子系统协调一致的协议,使得子系统在一个事务中,只有一个命令能够成功,保证数据的强一致性。

从百度或知乎上的文章分析看出,paxos就是对某个值,有不同的事务想修改,但是只有一个命令可以成功。paxos就是对变量设置,现在有多个子系统想设值,然后他们最后协商一致的过程。

个人认为理解paxos的重点应理解:为什么一个事务开始的时候,这个变量为nil,其实nil是代表此次投票,不是说,这个变量的值为nil。而是代表这个事务开始前,还没有接收其他的投票值。

所有的投票只在一个事务里面,有人失败,则返回失败,如果重复提交,需要从下一个事务继续进行,有人成功,就返回成功。

分两个阶段,三个角色:
第一阶段:准备阶段(prepare)
proposer:1、广播自己的提案
acceptor:1、如果提案小于自己当前接收的提案,则拒绝无响应
2、如果大于自己的提案,则接收当前提案编号,并且保证不再接收小于这个被接收的提案编号,最后,返回上一次编号及内容

第二阶段:提交阶段(confirm)
proposer: 1、统计接收和拒绝个数
2、统计接收后返回的提案编号及内容
3、如果拒绝个数小于一半以上,则继续提交新的提案,此时会导致死循环
4、如果接受大于一半以上 ,则提交提案,提案的内容是:
如果返回的提案都为null,则说明acceptor没有接收过提案,可以提交自己的提案内容;
如果返回的提案不全是null,说明接受过提案,则,把接受过的提案内容作为自己的提 案,进行提交
acceptor:1、如果当前提交的提案编号==当前接受的最新提案编号,则直接接收,如果,大于,或者小于 当前接收的提案编号,则拒绝
proposer被拒绝,如果大于一半以上,继续新的提案,会出现死循环,

learner: 接收的提案大于一半以上,则表示提案通过,通知其他未统一的acceptor,强制要求一致

我的推理过程:
paoxos01
这里写图片描述
这里写图片描述
这里写图片描述

总结:
死循环的产生:
1、在prepare阶段,被acceptor拒绝次数大于一半以上时,如果继续提交新提案编号:意味着,两个proposer本来提案权限一大一小,小的被拒绝后,像大人重新获取了一个更大的权限提案进行提案,此时,就出现死循环
2、在准备阶段:提交时,拒绝次数大于一半以上,如果继续提交,那么和上面的一样,出现死循环

那么,我们会什么不能将提案设置成不可以重复提交,使得不会出现死循环呢,主要是因为,在真实的业务中,我们子系统向远程发起一个请求时,都会进行重复提交,不太可能,zab协议就采用一个proposer来解决这个问题3、两个不同权限的提案同时提交,那么最终选择的是哪个权限的提案呢,是权限大的呢还是权限小的提案呢。或者一定是权限更大的提案被提交呢?(前提是如果被一半以上的拒绝,不进行重复提案)a:如果是在第一阶段出现竞争:即,proposer1和proposer2在prepare阶段就出现竞争时:1、proposer2在第一阶段一定能取得一半以上的同意,proposer1,即可能取得一半以上的同意,也可能取得一半以上的拒绝,被拒绝的话,权限大的进行提交,被同意的话,进行第二阶段的竞争,此时一定失败,因此,第一阶段的竞争,一定是以权限大的提案作为提交成功(假设proposer2大于proposer1)B:如果一个处于第一阶段,一个处于第二阶段,两者交叉竞争:假设处于第一阶段的proposer1权限小于proposer2,并且,proposer1处于第一阶段,proposer2处于第二阶段,此时,两者竞争,肯定是proposer2竞争同意,proposer1被全部拒绝,此时,权限大的竞争依然胜利假设处于第一阶段的proposer1权限大于proposer2,并且,proposer1处于第一阶段,proposer2处于第二阶段,那么此时,proper2就会收到一半拒绝,或者一半同意,一半同意不再重新提案,一半同意结束提案,就是说不管失败与否,权限低的将不再继续。那么proposer1会怎么办呢,如果acceptor接收过了提案,则会在第二阶段提交的时候,提交proposer2的提案,如果没有接收过,那么,则会提交自己的提案。最终,胜利的是,权限大的提案编号,权限大的提案内容或者提案小的内容。是权限小的内容还是权限大的内容,取决于权限小的提案处于第二阶段,且再和处于第一阶段的prepare进行竞争时,抢先一步把提案提交上去了

最后再次归纳一下:

1、paxos会出现死循环,因为重复获取新权限,进行提交的,在paoxos,权限和时间相关,因此,如果进行重复提交,逻辑上一定会出现死循环的BUG。
2、权限大的提案在和权限小的提案进行竞争时,权限小的提案,只有竞争处于权限小的提案在第二阶段,权限大的提案处于第一阶段,这个时候可能存在赢的机会,其他情况是赢不了的

为什么说paxos会出现死循环,因为权限是和时间相关的,实际业务中,如果重复提交一个命令,那么会产生新的时间戳,这个时间戳就是权限,让这个权限再去竞争,此时会出现死循环,不继续提交,意味着失败。只有等下一个时间(事务)窗口,就是这个事务结束后,再次进行新的提交。

后面将继续跟进zookeeper进行讲解,看看zookeeper怎么解决死循环的,那么多场景是怎么解决的
zk的使用场景只是zab一致性协议的结果的使用,zab协议,是让他们一致性的过程。后面分析扩展性,分区容错性

原创粉丝点击