gossip協議介紹

背景

gossip 協議(gossip protocol)又稱 epidemic 協議(epidemic protocol),是基於流行病傳播方式的節點或者進程之間信息交換的協議,在分佈式系統中被廣泛使用,比如我們可以使用 gossip 協議來確保網絡中所有節點的數據一樣。

Gossip protocol 最早是在 1987 年發表在 ACM 上的論文 《Epidemic Algorithms for Replicated Database Maintenance》中被提出。主要用在分佈式數據庫系統中各個副本節點同步數據之用,這種場景的一個最大特點就是組成的網絡的節點都是對等節點,是非結構化網絡,這區別於用於結構化網絡中的 DHT 算法 Kadmelia。很多知名的 P2P 網絡或區塊鏈項目,比如 IPFS,Ethereum 等,都使用了 Kadmelia 算法,而大名鼎鼎的 Bitcoin 則是使用了 Gossip 協議來傳播交易和區塊信息。實際上,Ethereum 使用 DHT 算法並不是很合理,因爲它使用節點保存整個鏈數據,不像 IPFS 那樣分片保存數據,因此 Ethereum 真正適合的協議應該像 Bitcoin 那樣,是 Gossip 協議。

從 gossip 單詞就可以看到,其中文意思是八卦、流言等意思,我們可以想象下緋聞的傳播(或者流行病的傳播);gossip 協議的工作原理就類似於這個。gossip 協議利用一種隨機的方式將信息傳播到整個網絡中,並在一定時間內使得系統內的所有節點數據一致。Gossip 其實是一種去中心化思路的分佈式協議,解決狀態在集羣中的傳播和狀態一致性的保證兩個問題。

優勢

可擴展性(Scalable)

gossip 協議是可擴展的,一般需要 O(logN) 輪就可以將信息傳播到所有的節點,其中 N 代表節點的個數。每個節點僅發送固定數量的消息,並且與網絡中節點數目無法。在數據傳送的時候,節點並不會等待消息的 ack,所以消息傳送失敗也沒有關係,因爲可以通過其他節點將消息傳遞給之前傳送失敗的節點。系統可以輕鬆擴展到數百萬個進程。

容錯(Fault-tolerance)

網絡中任何節點的重啓或者宕機都不會影響 gossip 協議的運行。

健壯性(Robust)

gossip 協議是去中心化的協議,所以集羣中的所有節點都是對等的,沒有特殊的節點,所以任何節點出現問題都不會阻止其他節點繼續發送消息。任何節點都可以隨時加入或離開,而不會影響系統的整體服務質量(QOS)

最終一致性(Convergent consistency)

Gossip 協議實現信息指數級的快速傳播,因此在有新信息需要傳播時,消息可以快速地發送到全局節點,在有限的時間內能夠做到所有節點都擁有最新的數據。

簡單(Simplicity)

Gossip 協議實現過程簡單,沒有太多複雜性。

劣勢

分佈式網絡中,沒有一種完美的解決方案,Gossip 協議跟其他協議一樣,也有一些不可避免的缺陷,主要是兩個:

1)消息的延遲

由於 Gossip 協議中,節點只會隨機向少數幾個節點發送消息,消息最終是通過多個輪次的散播而到達全網的,因此使用 Gossip 協議會造成不可避免的消息延遲。不適合用在對實時性要求較高的場景下。

2)消息冗餘

Gossip 協議規定,節點會定期隨機選擇周圍節點發送消息,而收到消息的節點也會重複該步驟,因此就不可避免的存在消息重複發送給同一節點的情況,造成了消息的冗餘,同時也增加了收到消息的節點的處理壓力。而且,由於是定期發送,因此,即使收到了消息的節點還會反覆收到重複消息,加重了消息的冗餘。

協議類型

gossip 協議的類型。目前主要有兩種方法:

  • Anti-Entropy(反熵):以固定的概率傳播所有的數據
  • Rumor-Mongering(謠言傳播):僅傳播新到達的數據

Anti-Entropy

Anti-Entropy 的主要工作方式是:每個節點週期性地隨機選擇其他節點,然後通過互相交換自己的所有數據來消除兩者之間的差異。Anti-Entropy 這種方法非常可靠,但是每次節點兩兩交換自己的所有數據會帶來非常大的通信負擔,以此不會頻繁使用。

Anti-Entropy 使用“simple epidemics”的方式,所以其包含兩種狀態:susceptible 和 infective,這種模型也稱爲 SI model。處於 infective 狀態的節點代表其有數據更新,並且會將這個數據分享給其他節點;處於 susceptible 狀態的節點代表其並沒有收到來自其他節點的更新。

Rumor-Mongering

Rumor-Mongering 的主要工作方式是:當一個節點有了新的信息後,這個節點變成活躍狀態,並週期性地聯繫其他節點向其發送新信息。直到所有的節點都知道該新信息。因爲節點之間只是交換新信息,所有大大減少了通信的負擔。

Rumor-Mongering 使用“complex epidemics”方法,相比 Anti-Entropy 多了一種狀態:removed,這種模型也稱爲 SIR model。處於 removed 狀態的節點說明其已經接收到來自其他節點的更新,但是其並不會將這個更新分享給其他節點。因爲 Rumor 消息會在某個時間標記爲 removed,然後不會發送給其他節點,所以 Rumor-Mongering 類型的 gossip 協議有極小概率使得更新不會達到所有節點。一般來說,爲了在通信代價和可靠性之間取得折中,需要將這兩種方法結合使用。

通信方式

不管是 Anti-Entropy 還是 Rumor-Mongering 都涉及到節點間的數據交互方式,節點間的交互方式主要有三種:Push、Pull 以及 Push&Pull。

  • Push:發起信息交換的節點 A 隨機選擇聯繫節點 B,並向其發送自己的信息(key,value,version),節點 B 在收到信息後更新比自己新的數據,一般擁有新信息的節點纔會作爲發起節點。
  • Pull:發起信息交換的節點 A 隨機選擇聯繫節點 B,發送自己的(key,version) 信息給B,B將比A新的信息(key,value,version) 發送給A,A更新本地數據。一般無新信息的節點纔會作爲發起節點。
  • Push&Pull:在Push和Pull的基礎上,A再將比B新的信息(key,value,version)發送給B,B收到後更新本地數據,從而分別從對方獲取數據,並更新自己的本地數據。

如果把兩個節點數據同步一次定義爲一個週期,則在一個週期內,Push 需通信 1 次,Pull 需 2 次,Push/Pull 則需 3 次。雖然消息數增加了,但從效果上來講,Push/Pull 最好,理論上一個週期內可以使兩個節點完全一致。直觀上,Push/Pull 的收斂速度也是最快的。

收斂分析

流行病傳染最基本的模型僅作如下幾個假設:

  1. (n+1)個人均勻的分佈在一起
  2. 每一對人羣之間的傳染概率是β,顯然0<β<1.
  3. 任意時刻,某個人要麼處於infected的狀態要麼處於uninfected的狀態.
  4. 一旦某個人從uninfected狀態轉變成爲infected狀態,其一直停留在infected狀態。

有了以上假設,我們可以進一步分析流行病的傳染情況。我們記t時刻處於infected狀態的人數爲yt,處於uninfected狀態的人爲xt,那麼初始狀態 y0=1, x0=n,並且在任何時候xt+yt=n+1.

考慮連續的時間,可知:

dxdt=−βxy

解的:

x=n(n+1)n+eβ(n+1)ty=n+11+ne−β(n+1)t

明顯,當t→∞時,x→0,y→(n+1),即經過足夠的時間,所有的人都將被傳染。

上述流行病傳染模型爲分析Gossip的性能提供了基礎。在Gossip性能中,可以認爲: β=b/n(因爲對每個節點而言,被其他節點選中的概率就是b/n)。我們令t=clog(n),可以得到:

y≈(n+1)−1ncb−2

這表明,僅需要O(log(n))個回合,gossip協議即可將信息傳遞到所有的節點。 根據分析可得,Gossip協議具有以下的特點:

  1. 低延遲。僅僅需要O(log(n))個回合的傳遞時間。
  2. 非常可靠。僅有1ncb−2個節點不會收到信息。
  3. 輕量級。每個節點傳送了cblog(n)次信息。

於此同時,Gossip協議的容錯性比較高,例如,50的丟包率等價於使用b/2帶代替b進行分析;50的節點錯誤等價於使用n/2來代替n,同時使用b/2來代替b進行分析,其分析結果不用帶來數量級上的變化。

應用

gossip 協議可以支持以下需求:

  • Database replication
  • 消息傳播
  • Cluster membership
  • Failure 檢測
  • Overlay Networks
  • Aggregations (比如計算平均值、最大值以及總和)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章