Paxos算法
如何达成共识
想象这样一个场景,某地出现突发事件,当地村委会、负责人等在积极研究和搜集解决该事件的解决方案,你也决定参与其中,提交提案,建议一些解决方法。为了和其他村民的提案做区分,你的提案还得包含一个提案编号,以起到唯一标识的作用。与你的做法类似,在Basic Paxos中,兰伯特也使用提案代表一个提议。不过提案中除了包含提案编号,还包含提议值。为了方便表示,使用[n,v]表示一个提案,其中n为提案编号,v为提议值。
强调一下,整个共识协商是分为两个阶段进行的(也就是前面提到的二阶段提交:准备阶段、接受阶段),那么具体要如何协商呢?
我们假设客户端1的提案编号为1,客户端2的提案编号为5,并假设节点A、B先收到来自客户端1的准备请求,节点C先收到客户端2
的准备请求
1.准备节点
先来看第一个阶段,首先,客户端1、2作为提议者,分别向所有接受者发送包含提案编号的准备请求,如图所示。
需要注意的是,准备请求中不需要指定提案的值,只需要携带提案编号就可以了,这也是很多人容易产生误解的地方。接着,节点A、B收到提案编号为1的准备请求,节点C收到提案编号为5的准备请求后,将进行如图所示的处理。由于之前没有通过任何提案,所以,节点A、B将返回一个"尚无提案"的响应,也就是说,节点A和B在告诉提议者,我之前没有通过任何提案,并承诺以后不再响应提案编号小于或等于1的准备请求,也不会通过编号小于1的提案。节点C也是如此,它将返回一个"尚无提案"的响应,并承诺以后不再响应提案编号小于等于5的准备请求,也不会通过编号小于5的提案。另外,节点A、B收到提案编号为5的准备请求,节点C收到提案编号为1的准备请求后将进行如图所示的处理过程。当节点A、B收到提案编号为5的准备请求时,因为提案编号5大于它们之前响应的主备请求的提案编号1,而