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

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

下面來總結一下

Gossip 的特點(優勢)

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

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

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

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

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

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

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 的收斂速度也是最快的。
復雜度分析
對於一個節點數為 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 的平方收斂,也稱為概率收斂,這在眾多的一致性算法中是非常獨特的。

Java版實現

項目地址:https://gitee.com/xiaomaoguai/jgossip.git


轉載自:簡書@juniway


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM