轉自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