Paxos是一个基于消息传递的解决分布式数据一致性的算法。
Basic Paxos算法中共有三种角色:
Proposer:向集群提出议案。
Acceptor:对提议进行投票,只有在达到多数派时提议才会被接收。
Learner:提议接受者,对集群的一致性没有什么影响,单纯的记录人员。
另外,client也是一个重要组成部分,是请求Proposer发起提议的。
Proposal:proposer提出的议案或者建议,编号为n和内容为value。(自增的,不受某个proposer控制)
一个进程可以充当不同的角色。
算法的最终目标:每一个Proposer,Acceptor,Learner都认为同一个Proposal中的value被选中。
算法分为两个阶段:
阶段1:Prepare
Proposer 提出一个编号n的proposal(n),广播给所有的Acceptor。
阶段2:Promise
如果n大于该Proposer接收过的proposal(如n-1),就接收Proposal并返回空值,否则拒绝,如果拒绝后,他发现已经接收了Proposal(x,value),就返回给Proposer编号和内容。
阶段3:accept
proposer接收到半数以上的空值,说明达成一致,则返回给acceptor:proposal(n,value);如果发现存在编号更大的proposal,提取value,以一个更大的编号m,组合成proposal(m,value)发送出给acceptor。
阶段4:accepted
acceptor如果一段时间内没有收到任何编号大于N的提案,就接受该提案的内容,否则拒绝。当Proposer接收到超过半数的accepor返回的Accept(m)时,达成共识。
可能导致的问题是:
活锁:两个proposer较劲,彼此提出更大的编号。
效率低:两轮RPC
难实现。
Multi Paxos:
会有一个节点是leader,是唯一的propser,所有的请求都需要经过此leader。