转自https://blog.csdn.net/liweisnake/article/details/69253206
html
上一章讨论了一种强一致性的状况,即须要分布式事务来解决,本章咱们来讨论一种最终一致的算法,paxos算法。算法
paxos算法是由大牛lamport发明的,关于paxos算法有不少趣事。好比lamport论文最初由故事描述来引入算法,以致于那班习惯数学公式的评委将该论文打回,致使该论文延误了8年才公开发表。另外,google的chubby的做者Mike Burrows说过,世界上只有一种一致性算法,那就是paxos。shell
两将军问题app
为了引入该算法,首先提出一种场景,即两将军问题(见文献1):分布式
- 有两支军队,它们分别有一位将军领导,如今准备攻击一座修筑了防护工事的城市。这两支军队都驻扎在那座城市的附近,分占一座山头。一道山谷把两座山分隔开来,而且两位将军惟一的通讯方式就是派各自的信使来往于山谷两边。不幸的是,这个山谷已经被那座城市的保卫者占领,而且存在一种可能,那就是任何被派出的信使经过山谷是会被捕。 请注意,虽然两位将军已经就攻击那座城市达成共识,但在他们各自占领山头阵地以前,并无就进攻时间达成共识。两位将军必须让本身的军队同时进攻城市才能取得成功。所以,他们必须互相沟通,以肯定一个时间来攻击,并赞成就在那时攻击。若是只有一个将军进行攻击,那么这将是一个灾难性的失败。
两将军问题本质上就是通讯被篡改时可否解决一致性问题。这个问题已经被不少人证实不能。(见文献1)。于是由此推及的拜占庭将军问题(多将军问题)也一样不能被解决。google
PAXOS算法.net
- 一个叫作Paxos的希腊城邦,这个岛按照议会民主制的政治模式制订法律,可是没有人愿意将本身的所有时间和精力放在这种事情上。因此不管是议员,议长或者传递纸条的服务员都不能承诺别人须要时必定会出现,也没法承诺批准决议或者传递消息的时间。可是这里假设没有拜占庭将军问题(Byzantine failure,即虽然有可能一个消息被传递了两次,可是绝对不会出现错误的消息);只要等待足够的时间,消息就会被传到。另外,Paxos岛上的议员是不会反对其余议员提出的决议的。
这里再也不赘述算法的推导及证实过程,参考文献2和3。这里简单描述下算法理解。htm
基本思想也是两阶段提交。可是与两阶段目的不一样。blog
1. 第一阶段主要目的是选出提案编号最大的proposer。事务
其描述以下,全部的proposer向超过半数的acceptor提出编号为n的提案,acceptor收到编号为n的请求,会出现两种状况
a. 编号n大于全部acceptor以前已经批准过的proposal的最大编号及内容m。acceptor赞成该proposal,响应[n, m]回proposer,而且承诺从此再也不批准任何编号小于n的提案。
b. 编号n小于acceptor以前批准过的任意proposal的编号。acceptor拒绝该proposal。
2. 第二阶段尝试对某一proposal达成一致。
proposer收到超过半数的acceptor返回的响应,proposer就会将响应的最大编号[n, m]对应的提案提交到acceptor要求acceptor批准该提案。
acceptor收到最大编号[n, m]的提案,也分为两种状况
a. 未响应过编号大于n的prepare请求。经过该提案。
b. 已响应过编号大于n的prepare请求。拒绝该提案。
整个算法表面上并不难理解,难在实现细节的难易程度和各类异常状况的推导及考虑。若是对上述算法有理解困难的,参考文献4和文献5的例子,其中文献5更容易理解,这里 把他的图贴出来,实际过程就再也不重复赘述了。
两个参谋前后提议的场景
两个参谋交叉提议的场景
须要注意的是参谋1在失败时再次发起请求的过程
这里着重强调几个重点。
1. 算法描述里有好几个地方要求投票必须超过半数,这个超过半数偏偏是保证一致的一个必要条件
2. 算法里也有多处要求只选择编号最大的,这种选择编号最大的方式,是一种最为简单经济的达成共识的方法,可以快速在多个冲突中找到一个突破口
3. paxos算法的关键是,若是一个值m被选中了,那么必须保证更高的proposal其值也为m
4. 注意第一阶段比较的是已经批准过的proposal的最大编号,而第二阶段比较的是prepare请求。即第一阶段比较的是第二阶段的结果,而第二阶段比较的是第一阶段的结果,看似很绕,实际上正好是隔离了阶段外的保证,进入第一阶段的我要保证他是新的开始,跟上一阶段没啥关系,而进入第二阶段的我要保证他是从前面阶段来的,而不是新起的一个阶段,有点像是隔离锁,锁住了阶段一到阶段二这个过程。
分布式系统的事务处理 http://coolshell.cn/articles/10910.html
paxos wiki https://en.wikipedia.org/wiki/Paxos_(computer_science)
paxos维基 https://zh.wikipedia.org/wiki/Paxos%E7%AE%97%E6%B3%95
paxos算法例子 https://www.zhihu.com/question/19787937/answer/107750652
paxos算法例子2* http://iunknown.iteye.com/blog/2246484?from=message&isappinstalled=0
Paxos算法1-算法造成理论 http://blog.csdn.net/chen77716/article/details/6166675