1. 程式人生 > >P2P 網路核心技術:Gossip 協議

P2P 網路核心技術:Gossip 協議

背景

Gossip protocol 也叫 Epidemic Protocol (流行病協議),實際上它還有很多別名,比如:“流言演算法”、“疫情傳播演算法”等。

這個協議的作用就像其名字表示的意思一樣,非常容易理解,它的方式其實在我們日常生活中也很常見,比如電腦病毒的傳播,森林大火,細胞擴散等等。

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 的特點(優勢)

1)擴充套件性
網路可以允許節點的任意增加和減少,新增加的節點的狀態最終會與其他節點一致。

2)容錯
網路中任何節點的宕機和重啟都不會影響 Gossip 訊息的傳播,Gossip 協議具有天然的分散式系統容錯特性。

3)去中心化
Gossip 協議不要求任何中心節點,所有節點都可以是對等的,任何一個節點無需知道整個網路狀況,只要網路是連通的,任意一個節點就可以把訊息散播到全網。

4)一致性收斂
Gossip 協議中的訊息會以一傳十、十傳百一樣的指數級速度在網路中快速傳播,因此係統狀態的不一致可以在很快的時間內收斂到一致。訊息傳播速度達到了 logN。

5)簡單
Gossip 協議的過程極其簡單,實現起來幾乎沒有太多複雜性。

Márk Jelasity 在它的 《Gossip》一書中對其進行了歸納:


  image.png

Gossip 的缺陷

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

1)訊息的延遲

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

2)訊息冗餘

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

Gossip 型別

Gossip 有兩種型別:

  • Anti-Entropy(反熵):以固定的概率傳播所有的資料
  • Rumor-Mongering(謠言傳播):僅傳播新到達的資料
    Anti-Entropy 是 SI model,節點只有兩種狀態,Suspective 和 Infective,叫做 simple epidemics。

Rumor-Mongering 是 SIR model,節點有三種狀態,Suspective,Infective 和 Removed,叫做 complex epidemics。

其實,Anti-entropy 反熵是一個很奇怪的名詞,之所以定義成這樣,Jelasity 進行了解釋,因為 entropy 是指混亂程度(disorder),而在這種模式下可以消除不同節點中資料的 disorder,因此 Anti-entropy 就是 anti-disorder。換句話說,它可以提高系統中節點之間的 similarity。

SI model 下,一個節點會把所有的資料都跟其他節點共享,以便消除節點之間資料的任何不一致,它可以保證最終、完全的一致。

由於在 SI model 下訊息會不斷反覆的交換,因此訊息數量是非常龐大的,無限制的(unbounded),這對一個系統來說是一個巨大的開銷。

但是在 Rumor Mongering (SIR Model) 模型下,訊息可以傳送得更頻繁,因為訊息只包含最新 update,體積更小。而且,一個 Rumor 訊息在某個時間點之後會被標記為 removed,並且不再被傳播,因此,SIR model 下,系統有一定的概率會不一致。

而由於,SIR Model 下某個時間點之後訊息不再傳播,因此訊息是有限的,系統開銷小。

Gossip 中的通訊模式

在 Gossip 協議下,網路中兩個節點之間有三種通訊方式:

  • Push: 節點 A 將資料 (key,value,version) 及對應的版本號推送給 B 節點,B 節點更新 A 中比自己新的資料
  • Pull:A 僅將資料 key, version 推送給 B,B 將本地比 A 新的資料(Key, value, version)推送給 A,A 更新本地
  • Push/Pull:與 Pull 類似,只是多了一步,A 再將本地比 B 新的資料推送給 B,B 則更新本地
    如果把兩個節點資料同步一次定義為一個週期,則在一個週期內,Push 需通訊 1 次,Pull 需 2 次,Push/Pull 則需 3 次。雖然訊息數增加了,但從效果上來講,Push/Pull 最好,理論上一個週期內可以使兩個節點完全一致。直觀上,Push/Pull 的收斂速度也是最快的。

Gossip 演示

現在,我們通過一個具體的例項來深入體會一下 Gossip 傳播的完整過程

為了表述清楚,我們先做一些前提設定

(1)Gossip 是週期性的散播訊息,把週期限定為 1 秒
(2)被感染節點隨機選擇 k 個鄰接節點(fan-out)散播訊息,這裡把 fan-out 設定為 3,每次最多往 3 個節點散播。
(3)每次散播訊息都選擇尚未傳送過的節點進行散播
(4)收到訊息的節點不再往傳送節點散播,比如 A -> B,那麼 B 進行散播的時候,不再發給 A。

這裡一共有 16 個節點,節點 1 為初始被感染節點,通過 Gossip 過程,最終所有節點都被感染:

   

複雜度分析

對於一個節點數為 N 的網路來說,假設每個 Gossip 週期,新感染的節點都能再感染至少一個新節點,那麼 Gossip 協議退化成一個二叉樹查詢,經過 LogN 個週期之後,感染全網,時間開銷是 O(LogN)。由於每個週期,每個節點都會至少發出一次訊息,因此,訊息複雜度(訊息數量 = N * N)是 O(N^2) 。注意,這是 Gossip 理論上最優的收斂速度,但是在實際情況中,最優的收斂速度是很難達到的。

假設某個節點在第 i 個週期被感染的概率為 pi,第 i+1 個週期被感染的概率為 pi+1 ,

1)則 Pull 的方式:


   

2)Push 方式:


   

可見,Pull 的收斂速度大於 Push ,而每個節點在每個週期被感染的概率都是固定的 p (0<p<1),因此 Gossip 演算法是基於 p 的平方收斂,也稱為概率收斂,這在眾多的一致性演算法中是非常獨特的。

全文完!

如果你喜歡我的文章,可以關注我的微信公眾號:deliverit


   

小禮物走一走,來簡書關注我



作者:juniway
連結:https://www.jianshu.com/p/8279d6fd65bb
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。