上一篇讲述了两个经典的分布式一致性协议(2PC、3PC),这篇博客开始讲解paxos协议,paxos算法是目前公认的解决分布式一致性问题最有效的算法之一。
1、起源
拜占庭将军问题
提及paxos协议的起源,首先得说说这个“拜占庭将军”问题,这个问题实际上是分布式数据一致性问题的一个抽象故事。
故事中的通讯员就是所谓的通信信道,拜占庭故事的结局就是在这种情况下将军之间不可能接收到一个完全正确的决定。也就是说在分布式系统中,试图在异步系统和不可靠通道上达到一致性状态是不可能的。
有人就会问,既然是不可能,那研究的分布式一致性协议有啥用呢?
——实际工程上,由于信道编码纠错等机制,我们可以假设所有信道传输的消息是完整的,是没有被篡改过的,也就是故事中的通讯员不能篡改消息。考虑到这种实际场景下,我们研究的分布式一致性协议才有用处。
那么当信道不存在篡改的情况,该场景下又是如何解决上述问题的呢?
——lamport在1990提出了paxos算法解决上述问题。
lamport将上述的问题设想了这么一个场景:
(多提一句,据说该场景是考古工作者发现真是会议手稿推测的,并不是lamport凭空设想的)
这个场景就具体代表了分布式系统中,多个节点中,数据如何保持一致性,多个节点最终对于某个数据值能够保证一致,也就是对应场景中法令是唯一有效的,不冲突。
如何解决上述的正确法令的产生,paxos算法。
2、算法陈述
paxos算法有着严格的数据公式的证明,但太过于复杂,能以理清,这里我们不在讨论具体的证明过程,只给出paxos算法是如何从众多提案中最终选择一个统一提案的过程。
首先和上述的故事场景类似,存在一个提出者(Proposer)和接收者(Acceptor),同样,整个选举的过程也分为两个阶段:
通过上述的两个阶段,即可保证最终可以得到一个统一的提案。
有人会问,现在知道了这个paxos算法,但是到底怎么用,是怎么一回事呢??
——在设计分布式系统的时候,我们可以将每个节点向管理节点选举时,按照上述提交者的步骤,将每个消息就加上对应的编号,同样,管理节点接收到信息,也按照上述的步骤进行返回,最后即可按照此算法就多个节点同一个数据值达到一致。
3、paxos算法优缺点
paxos算法的优点很明显,按照此方法可以对多个数据值达到一致,收敛较好。
paxos算法的缺点即存在活性问题:考虑到一种极端的情况下,有两个proposer依次提出了一系列编号递增的议案,但是最终paxos无法形成最终的议案。具体场景如下:
没错,在这种情况下,提案只会不断的死循环,提出,被抛弃,再次提出,被抛弃。。。无法保持活性。。。
解决办法:
为了保持活性,避免上述的问题,就必须选择一个主Proposer,并规定只能由主Proposer才能提出议案,只有主能提出议案,那么就算主被抛弃了,下次也会提出更高议案,而其他非主不能再次提出更高的议案,这样就不会陷入死循环中,从而避免了上述的问题。
总结:
通过选择一个主Proposer,并规定只能由主Proposer才能提出议案,整个paxos算法就可以保持活性。
参考:
《从paxos到zookeeper》