Paxos算法之Basic Paxos
Posted 程序技术分享
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Paxos算法之Basic Paxos相关的知识,希望对你有一定的参考价值。
在分布式一致性算法中,paxos算法可以说是地位很高,目前最常用的raft算法,ZAB协议都是由它演进的,兰伯特当时提出的paxos算法,是包含两部分的,
1 Basic paxos 描述的是多节点之间如何就某个值达成共识
2 Mulit-Paxos描述的是多个Basic paxos实例,对一系列值达成的共识
思考一个问题:
如果对于一个分布式集群,集群中有A,B,C三个节点,作为kv存储系统,如果集群存储,要设置一个只读变量T(只读变量要先复制,赋值后无法修改变更),如果客户端1设置值为3,客户端2设置值为7,由于只能设置一次,如何保证在三个节点上的值是一样的呢?
Basic Paxos 就是解决这种问题的算法。
Basic Paxos的三种身份
提议者,提议的发起者,提议一个值,用于投票的发起和表决。一般提议者是某个接到客户端请求的集群实例,
接受者,对接受到的提议的值,进行投票,并存储。一般集群中所有的节点都作为接受者
学习者,被告知投票后的结果,不参与投票,只是负责保存投票结果,作为容灾备份
关系如下图所示,两个提议者都想提议设置自己想要设置自己想要的值,然后 把这两个值让集群节点去投票,最后选出来后,交给学习者去保存备份。
这个图你可能会有疑问,刚刚说,提议者是集群某个节点,接收者是集群,看上面的图,感觉提议者不是集群的三个节点之一,是另外的身份,上面的图是为了分析三者之间的关系,真正的逻辑是下面的,
客户端发起一个请求后,集群某个节点会收到请求,此时收到请求的节点就作为提议者,下图中的A和C 对应上图中的提议者,然后 提议者又作为接受者,把决议在集群内部协调传输,如上图流程,让集群各个节点参与决议,最后把决议结果告诉学习者。
现在你已经明白是怎么样的流程去决议了,下面在来研究一下,决议的详细流程是怎么样?
如何达成共识的?
说到提议,一定少不了,提议编号,用来标识不同的提议,就好比送标书,不可能你只送上一份写的很好价格的标书,不标识这个标书是出自你们公司。其实这个算法达成共识的逻辑和标书差不多,大家先把标书送上(就是客户端想要设置的值),然后价高者得,因此Basic Paxos也是分为两个阶段
1 准备阶段
假设客户端1的请求,提案编号为1,客户端2的请求,提案编号为5,并且集群中A,B 两节点先收到编号为1的提案,C先收到提案编号为5的提案,如图所示,(下面为了方便了解提议者和接收者之间的流程,会把客户端作为提议者,自己心里明白就行)
当节点A和节点B收到提议后(第一阶段只是提议编号,并无提议内容),发现自身以前没有收到过提案,就会通过这个提议,并返回无提议,承诺以后不再接受小于等于1编号的提议。当时间轴向右,会发现节点A和节点B收到了客户端2的请求后,发现提议编号为5,大于1,会通过编号为5的提议,承诺不再接受任何小于等于5提议编号的提议。节点C收到客户端2的请求后,由于自身以前没收到过提议,会通过编号为5的提议,承诺不再接受任何小于等于5提议编号的提议,当C在收到客户端1的请求后,会发现提议标号小于5,舍弃。最终如图所示
2 提议阶段
提议者1在收到A ,B接收者最开始返回的无提议,承诺以后不再接受小于等于1编号的提议的信息后,判断已经有两个接受者投票通过了大于半数,会把具体的提议内容 3 发送给接受者。提议者2在收到A ,B,C接收者返回的通过后,判断大于半数,会把具体的内容 7 发送给接受者。
当集群中三个节点收到提议者发送的具体提议后,会这样处理。
由于提议1的提议编号为1,小于集群中三个几点,约定能通过的提议编号不能小于5,所以提案1会被拒绝
由于提议2的提议编号为5,等于预定能通过的最小编号,所以提议会被通过,就接收了值为7,三个接受者就T的值为7达成了一致的共识。
总结一下:就好比政府 要和某个企业合作一个大项目,各个公司都有自己的方案,首先他们把自己公司的资质,收益先汇报一下(协议编号给接收者),评审团在审核的时候会选择一个最好的(不允许小于该值的协议编号),在审核的过程可能觉得A公司还不错,有两票的结果,就通知A公司做准备,后面有发现了B更好,最终决定了B,B也接到通知,A,B公司都给了自己的方案,由于已经内定好了,公司资质不能低于B,所以A的方案就被拒绝了。
以上是关于Paxos算法之Basic Paxos的主要内容,如果未能解决你的问题,请参考以下文章