一致性算法 - Paxos

こ雲淡風輕ζ 提交于 2020-01-20 03:10:26

转自:https://cs.xieyonghui.com/architecture/35.html

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及其数据

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!