paxos算法解决的问题是如何在一个分布式系统中就某个问题达成共识,解决数据的一致性问题。具体来讲,因为分布式系统包含众多节点,节点之间通过消息传递进行通信,在这一过程中必然存在消息的丢失、延迟、重复等问题,在这种情况下,集群中所有的节点如何对某个全局数据达成一致,保持数据的一致性,即使paxos要解决的问题。
paxos将节点分为proposer、acceptor、learner三种角色,proposer发起提案,acceptor收到提案后可以接受提案,也可以拒绝提案,若提案被大多数acceptor接受,则表示该提案通过。learner不参与以上过程,只是获取最重被通过的提案。
paxos分为两个阶段:prepare阶段和批准阶段
prepare阶段
proposer发起一个提案(编号为N),并将该提案发送给多于一半的acceptor。
acceptor收到提案后,如果之前没有接受过其他的提案,则回复OK;如果已经接受过其他的提案(编号为M),但M<N,那么acceptor将提案M回复给proposer,如果M>=N,则不做回复。
批准阶段
当一个proposer收到多数acceptor的回复后,就进入批准阶段,他会向回复proposer的acceptor发送accept请求(具体的提案编号),需要注意的是,该提案编号不一定就是最开始的N,因为proposer可能会接收到多个accpetor发送不来的多个提案,proposer会从多个提案中选择一个编号最大的提案(表明提案更权威)发送给acceptor。
acceptor收到accept请求后即接受对应的提案请求。
这里需要注意的是
(1)在一次paxos算法的执行中,可能不能确定一个共识提案,则需要再执行一次。
(2)提案的编号表示对应节点的优先级和权威性,用于当acceptor在同时收到多个提案时,如何选择一个提案,这个和现实世界是一样的,人们往往会选择更权威的提案。
(3)为了让算法更快的产生出一个最重的提案,建议参与投票节点的数量为一个奇数。
网上有一些该算法的实现,可以参考:
https://github.com/cocagne/paxos