分佈式系統中,即使是一個小型的集羣,也須要經過一個機制來維護各個節點或服務的狀態一致性和數據一致性。zab、paxos是使用較早的協議,後來出現了RAFT協議,這些主要經過RPC的機制進行節點鏈接,所以主要用於局域網或數據中心內部。Gossip(意:八卦、流言)支持p2p協議,是可以用於廣域網的一致性維護的協議,已經被不少互聯網系統採用。此外,CRDT也是正在研究的一致性機制,能夠實現即時的多節點數據寫入同步。這裏主要介紹GOSSIP協議。算法
參考:網絡
Gossip是分佈式系統中被普遍使用的協議,其主要用於實現分佈式節點或者進程之間的信息交換。Gossip協議同時知足應用層多播協議所要求的低負載,高可靠和可擴展性的要求。因爲其簡單而易於實現,當前不少系統(例如Amazon S3,Usenet NNTP等)選擇基於Gossip協議以實現應用層多播的功能。分佈式
Gossip Protocol利用一種隨機的方式將信息散播到整個網絡中。正如Gossip自己的含義同樣,Gossip協議的工做流程即相似於緋聞的傳播,或者流行病的傳播。具體而言Gossip Protocol能夠分爲Push-based和Pull-based兩種。Push-based Gossip Protocol的具體工做流程以下:ide
Pull-based Gossip Protol的協議過程恰好相反:性能
固然,爲了提升Gossip協議的性能,還有基於Push-Pull的混合協議。同時須要注意的是Gossip協議並不對網絡的質量作出任何要求,也不須要loss-free的網絡協議。Gossip協議通常基於UDP實現,其自身即在應用層保證了協議的robustness。spa
Gossip協議的分析是基於流行病學(Epidemiology)研究的。所以在分析Gossip的性能以前,須要首先介紹一下流行病學中基本的模型。.net
流行病傳染最基本的模型僅做以下幾個假設:對象
有了以上假設,咱們能夠進一步分析流行病的傳染狀況。咱們記tt時刻處於infected狀態的人數爲ytyt,處於uninfected狀態的人爲xtxt,那麼初始狀態 y0=1y0=1, x0=nx0=n,而且在任什麼時候候xt+yt=n+1xt+yt=n+1.blog
考慮連續的時間,可知:進程
dxdt=−βxydxdt=−βxy
解的:
x=n(n+1)n+eβ(n+1)tx=n(n+1)n+eβ(n+1)ty=n+11+ne−β(n+1)ty=n+11+ne−β(n+1)t
明顯,當t→∞t→∞時,x→0,y→(n+1)x→0,y→(n+1),即通過足夠的時間,全部的人都將被傳染。
上述流行病傳染模型爲分析Gossip的性能提供了基礎。在Gossip性能中,咱們能夠認爲: β=b/nβ=b/n(由於對每一個節點而言,被其餘節點選中的機率就是b/nb/n)。咱們令t=clog(n)t=clog(n),能夠獲得:
y≈(n+1)−1ncb−2y≈(n+1)−1ncb−2
這代表,僅須要O(log(n))O(log(n))個回合,gossip協議便可將信息傳遞到全部的節點。 根據分析可得,Gossip協議具備如下的特色:
於此同事,Gossip協議的容錯性比較高,例如,5050的丟包率等價於使用b/2b/2帶代替bb進行分析;5050的節點錯誤等價於使用n/2n/2來代替nn,同時使用b/2b/2來代替bb進行分析,其分析結果不用帶來數量級上的變化。