在分佈式中,最難解決的一個問題就是多個節點間數據同步問題。爲了解決這樣的問題,涌現出了各類奇思妙想。只有在解決了如何進行信息同步的基礎之上才衍生出形形色色的應用。這裏開始介紹幾種分佈式通訊協議。跨域
totem協議也許你還比較陌生,可是corosync就是totem協議的一個開源實現。比較火的HA軟件pacemaker就是基於corosync來提供各類服務的。提及totem協議,最簡單的形象就是,他將多個節點組成一個令牌環。多個節點手拉手造成一個圈,你們依次的傳遞token。只有獲取到token的節點纔有發送消息的權利。簡單有效的解決了在分佈式系統中各個節點的同步問題,由於只有一個節點會在一個時刻發送消息,不會出現衝突。固然,若是有節點發生意外時,令牌環就會斷掉,此時你們不可以通訊,而是從新組建出一個新的令牌環。網絡
提及paxos,須要稍微提提二段提交。簡單來講,二階段提交就是1.一個節點詢問其餘節點,我是否是能夠進行消息提交。2.若是收到全部人的贊成,則告訴你們,開始提交吧。這個協議在實際中並不能很好的解決分佈式中信息同步問題。例如只要有節點失效,就會發生得不到全部人贊成的結果,在超時後,這一次提交失敗,等一系列問題。可是paxos在對二段提交進行了優化後,獲得了一個比較好的解決辦法。 paxos協議引入了多數派,以及消息編號的概念。在1準備時,詢問2/n+1的參與者,要求他們保證不會接受小於編號n的提交。 2.若是獲得了2/n+1的回覆,則能夠開始告訴2/n+1的參與者進行消息的提交。 能夠明顯的看出,這就是對二段提交的一個優化版。就是這麼一個比較巧妙的思想,解決了一些二階段提交帶來的問題。 順便說一句,這個協議的做者Leslie Lamport。他剛剛得到2013年圖靈獎。app
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節點來同步信息一、隨機取一個當前活着的節點,並向它發送同步請求 二、向隨機一臺不可達的機器發送同步請求 三、若是第一步中所選擇的節點不是seed,或者當前活着的節點數少於seed數,則向隨意一臺seed發送同步請求 |
數據一致性 | 強一致性 | 強一致性 | 最終一致性 |
相關應用 | zookeeper | corosync | Cassandra |
優勢 | 能夠很好的解決通訊一致性問題,在集羣規模上比corosync要略大一些 | 簡單方便,按照協議實現後就能夠直接使用 | 協議自己簡單,組網規模幾乎不受限制,通訊性能好 |
缺點 | 理論性太強,若是要實際使用,仍是須要進行優化 | 使用了廣播包,對於跨域傳送有影響,並且令牌環自己帶來的問題使得組網規模不大 | 不能提供傳統的數據一致性服務,在傳輸中佔用較多的網絡流量 |