分布式基础通信协议:paxos,totem和gossip
背景:
在分布式中,最難解決的一個問題就是多個節點間數據同步問題。為了解決這樣的問題,涌現出了各種奇思妙想。只有在解決了如何進行信息同步的基礎之上才衍生出形形色色的應用。這里開始介紹幾種分布式通信協議。
簡單即有效——totem協議:
totem協議也許你還比較陌生,但是corosync就是totem協議的一個開源實現。比較火的HA軟件pacemaker就是基于corosync來提供各種服務的。說起totem協議,最簡單的形象就是,他將多個節點組成一個令牌環。多個節點手拉手形成一個圈,大家依次的傳遞token。只有獲取到token的節點才有發送消息的權利。簡單有效的解決了在分布式系統中各個節點的同步問題,因為只有一個節點會在一個時刻發送消息,不會出現沖突。當然,如果有節點發生意外時,令牌環就會斷掉,此時大家不能夠通信,而是重新組建出一個新的令牌環。
進化的二段提交——paxos協議:
說起paxos,需要稍微提提二段提交。簡單來說,二階段提交就是1.一個節點詢問其他節點,我是不是可以進行消息提交。2.如果收到所有人的同意,則告訴大家,開始提交吧。這個協議在實際中并不能很好的解決分布式中信息同步問題。例如只要有節點失效,就會發生得不到所有人同意的結果,在超時后,這一次提交失敗,等一系列問題。但是paxos在對二段提交進行了優化后,得到了一個比較好的解決辦法。
paxos協議引入了多數派,以及消息編號的概念。在1準備時,詢問2/n+1的參與者,要求他們保證不會接受小于編號n的提交。
2.如果得到了2/n+1的回復,則可以開始告訴2/n+1的參與者進行消息的提交。
可以明顯的看出,這就是對二段提交的一個優化版。就是這么一個比較巧妙的思想,解決了一些二階段提交帶來的問題。
順便說一句,這個協議的作者Leslie Lamport。他剛剛獲得2013年圖靈獎。
奇思妙想——gossip協議:
gossip協議是一個神奇的協議。它常用于P2P的通信協議,這個協議就是模擬人類中傳播謠言的行為而來。簡單的描述下這個協議,首先要傳播謠言就要有種子節點。種子節點每秒都會隨機向其他節點發送自己所擁有的節點列表,以及需要傳播的消息。任何新加入的節點,就在這種傳播方式下很快地被全網所知道。這個協議的神奇就在于它從設計開始就沒想到信息一定要傳遞給所有的節點,但是隨著時間的增長,在最終的某一時刻,全網會得到相同的信息。當然這個時刻可能僅僅存在于理論,永遠不可達。
基礎協議的對比:
簡單的介紹了這幾種協議,下面我們來看看他們的對比:
| 基礎協議 | paxos | totem | gossip |
| 數據同步 | 第一階段: ? proposer 選擇一個提案編號 n 并將 prepare 請求發送給acceptors 中的一個多數派;acceptor 收到 prepare 消息后,如果提案的編號大于它已經回復的所有 prepare 消息,則 acceptor 將自己上次的批準回復給 proposer并承諾不再批準小于 n 的提案。 第二階段: 當一個 proposor 收到了多數 acceptors 對 prepare 的回復后,就進入批準階段。它要向回復 prepare 請求的acceptors 發送 accept 請求,包括編號 n 和根據 P2c 決定的 value(如果根據 P2c 沒有決定 value,那么它可以自由決定 value)。在不違背自己向其他 proposer 的承諾的前提下,acceptor 收到 accept 請求后即批準這個請求。 | 1.通信方式。 當集群有節點要發起通信時,需要等待token。當拿到token后,先廣播這次需要發送的數據,然后傳遞token來確認所有人都接收到消息。 如果確認成功,釋放token。 2.節點的加入和退出。 當集群中有節點加入時,加入的節點廣播一個加入信息,所有人都開始廣播自己的信息,當所有人都獲得同伴信息,開始由id最小的人提交一個token,交由所有節點確認。 如果都確認后,則節點正式加入,開始正常運行。 當集群有節點退出時,由于令牌環斷鏈,觸發token超時,則同樣開始廣播信息,然后由最小id提交token,經過確認后恢復正常。 | gossip協議有多種實現,這里說一個例子當節點啟動時,讀配置文件,然后向一個seed發送信息,進行信息同步,然后開始沒秒都隨機選擇一個seed節點來同步信息 1、隨機取一個當前活著的節點,并向它發送同步請求 2、向隨機一臺不可達的機器發送同步請求 3、如果第一步中所選擇的節點不是seed,或者當前活著的節點數少于seed數,則向隨意一臺seed發送同步請求 |
| 數據一致性? | 強一致性 | 強一致性 | 最終一致性 |
| 相關應用 | zookeeper | corosync | Cassandra |
| 優點 | 可以很好的解決通信一致性問題,在集群規模上比corosync要略大一些 | 簡單方便,按照協議實現后就可以直接使用 | 協議本身簡單,組網規模幾乎不受限制,通信性能好 |
| 缺點 | 理論性太強,如果要實際使用,還是需要進行優化 | 使用了廣播包,對于跨域傳送有影響,而且令牌環本身帶來的問題使得組網規模不大 | 不能提供傳統的數據一致性服務,在傳輸中占用較多的網絡流量 |
參考資料
totem協議:http://blog.csdn.net/zuokong/article/details/7548152
paxos協議:http://en.wikipedia.org/wiki/Paxos_algorithm
gossip協議:http://en.wikipedia.org/wiki/Gossip_protocol
原文地址:http://blog.csdn.net/cloudresearch/article/details/23127985
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的分布式基础通信协议:paxos,totem和gossip的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: json面试题_21道前端面试题,值得收
- 下一篇: 7、线管和线槽