Paxos是唯一的一致性算法,其他都是paxos不完整版,Google Chubby作者Mike Burrows曾这样评价Paxos。
解决的问题
Paxos算法解决的问题:分布式系统如何就某个值(决议)达成一致。
历史
1990年Leslie Lamport提交Paxos算法论文The Part-Time Parliament,未受太多关注。
2001年发布通俗简化版Paxos Made Simple,剔除公式部分。
场景
爱琴海paxos岛住着一群居民,通过议会形式取代神权政治,事情由议会选举决定。
议员总数确定,岛上每个提议都有一个编号,编号不断增长且不能回退。
提议超半数议员同意就会生效。
每个议员有一个记事本,记录曾经同意过或通过的提议编号,编号随提议不断更新。
每个议员只会同意大于当前编号的提议。
若收到小于或等于当前编号的提议会拒绝提议并通知提出方。
岛上议员以义工方式出现,所以,不保证每个提议的投票在同一时间完成。因此,一定时间内议员们手中的编号并不统一。
议会目标:
议员们对提议达成一致看法。
投票
议会开始时,议员们手中记事本编号统一为0。
当议员发出提议时,先查看自己的记事本,在当前记录基础上加1,作为新提议编号,然后,通知其他议员。
其他议员们收到通知,得知有一个编号为1的提议需要通过。
议员们查看记事本,得知记事本中的编号为0,认为提议可接受。
记下该提议编号并回复接受1号提议。
发起提议的议员收到超半数以上回复时,会发出新通知宣布1号提议通过并生效。
收到通知的议员修改自己记事本的记录,将1号提议记下。
当有人发出请求问1号提议时,会立刻得到答复。
冲突解决
假如,议会有5个议员,a和b各自发出一个提议,都将提议编号定为2(基于自己的记事本)。
如果,其他3个议员先收到a的提议,比对手中记录后一致同意。
b的提议到达时议员查看记事本,发现提议编号未大于手中记录,否决提议。
a的提议通过后,通知了所有人。
b得知新提议编号,更新手中记录,在更新后的基础发出新提议。
通知机制
议会中有一个议员被定为“总统”,“总统”通过算法选举出来,提议由“总统”统一发给所有议员。
算法应用
MySQL高可用方案中,paxos为分布式数据的强一致性提供支持。
Zookeeper使用paxos实现一致性。
Paxos岛:Zookeeper Server Cluster
总统:ZK Server Leader
议员:Zookeeper Server
提议:ZNode Change(Create/Delete/SetData等)
提议编号:Zxid(ZooKeeper Transaction Id)
通过的提议:所有ZNode及其数据