散布谣言也能实现一致性?来看看Gossip协议如何活用六度分隔理论
文章目錄
- Gossip協議
- 直接郵寄
- 反熵
- 謠言傳播
- 閉環反熵
- 總結
Gossip協議
Gossip協議(Gossip Protocol)又稱Epidemic協議(Epidemic Protocol),是基于謠言傳播方式的節點或者進程之間信息交換的協議,在分布式系統中被廣泛使用,比如我們可以使用Gossip協議來確保網絡中所有節點的數據一致。
說到社交網絡,就不得不提著名的六度分隔理論。1967年,哈佛大學的心理學教授Stanley Milgram想要描繪一個連結人與社區的人際連系網。做過一次連鎖信實驗,結果發現了“六度分隔”現象。簡單地說:“你和任何一個陌生人之間所間隔的人不會超過六個,也就是說,最多通過六個人你就能夠認識任何一個陌生人。
數學解釋該理論:若每個人平均認識260人,其六度就是260↑6 =1,188,137,600,000。消除一些節點重復,那也幾乎覆蓋了整個地球人口若干多多倍,這也是Gossip協議的雛形。
Gossip基于六度分隔理論,每個節點像謠言傳播一樣,隨機的將信息傳播到其他節點上,不斷重復這個過程,直到將信息傳播到整個網絡中,并在一定時間內,使得系統內的所有節點數據一致。
Gossip主要有以下三個功能:
- 直接郵寄(Direct Mail)
- 反熵(Anti-entropy)
- 謠言傳播(Rumor mongering)
直接郵寄
直接發送需要更新的數據到其他節點,當數據發送失敗時,將數據緩存到隊列中,然后進行重傳。
直接郵寄從上面可以看出,這種方法實現簡單切數據同步及時,但是可能會因為重試的緩存隊列滿了而丟數據,從而無法實現最終一致性。
那么我們如何實現最終一致性呢?
這時候就需要借助到了Gossip協議中的反熵。
反熵
熵指混亂程度,反熵就是消除不同節點間數據的差異,提升節點間數據的相似度。
反熵的過程如下:
反熵主要通過三種方式進行:
-
推(Push)
- 節點A將數據(key,value,version)推送給節點B,節點B將A中比自己新的數據更新過來。
-
拉(Pull)
- 節點A僅將數據(key,version)推送給 B,B將本地比A新的數據(key, value, version)推送給A,A更新本地數據。
-
推拉(Push/Pull)
- 同時執行上述兩個步驟,同時修復兩個節點的數據。
從上面的三種反熵方式可以看出,反熵是需要節點兩兩交換和比對自己所有的數據,這樣來看的話,通訊成本是很高的,而在實際場景下這種頻繁的交換會大大影響性能。
那有沒有辦法來減少反熵的次數呢?
我們可以通過引入如校驗和,如奇偶校驗、CRC校驗和格雷碼校驗等來降低需要對比的數據量和通訊信息。
執行反熵時,相關節點都是已知的,且節點數量不能太多。如果節點動態變化或節點數過多,反熵就不合適。
那在這種場景下,有沒有辦法來解決動態、多節點的最終一致性呢?
答案是有的,那這時候就要用到Gossip協議中的謠言傳播。
謠言傳播
謠言傳播,就像是一個謠言的產生流程一樣,每個人都會向自己身邊的人傳播,知道謠言散布各地。
在分布式系統中,當一個節點有了新數據后,這個節點變成活躍狀態,并周期性地聯系其他節點向其發送新數據,直到所有節點都存儲了該數據,可以理解為之前講的反熵中的推的方式。
謠言傳播從上面可以看出,謠言傳播仍然具有以下缺點:
- 時間隨機:所有節點達到一致性是一個隨機性的概率。可以使用閉環反熵修復。
- 消息冗余:同一節點會多次接收同一消息,增加了消息處理的壓力,每一次通信都會對網絡帶寬、CPU等資源造成負載,進而影響達到最終一致性的時間。
- 拜占庭問題:如果有惡意節點出現,那么其他節點也會出問題。所以需要先修復故障節點。
閉環反熵
對于謠言傳播,所有節點達到一致性是一個隨機性的概率,其達到最終一致性的時間并不可控,這并不滿足我們的期望,我們更希望能在一個確定的時間范圍內實現數據副本的最終一致性,因此Gossip協議又引入了閉環反熵。
它按照一定順序來修復節點的數據差異,先隨機選擇一個節點,順著這個節點往下循環修復。每個節點都會對比自身與下一個節點,將本節點存在而下個節點不存在的缺失數據發送給下一個節點來進行修復,如下圖:
閉環反熵與上面的反熵不同,閉環反熵不再是一個節點不斷隨機選擇另一個節點,來修復副本上的熵,而是設計了一個閉環的流程,一次修復所有節點的副本數據不一致。通過這種方法我們就能夠將最終一致性的時間范圍明確下來,使其可控。
總結
上面說了那么多缺點,下面也來講講Gossip的幾個優點
- 拓展性:網絡可以允許節點的動態增加和減少,新增加的節點的狀態最終會與其他節點一致。
- 容錯:網絡中任何節點的宕機和重啟都不會影響 Gossip 消息的傳播,Gossip 協議具有天然的分布式系統容錯特性。
- 去中心化:Gossip協議不要求任何中心節點,所有節點都可以是對等的,任何一個節點無需知道整個網絡狀況,只要網絡是連通的,任意一個節點就可以把消息散播到全網。
- 實現簡單:Gossip 協議中的消息會以一傳十、十傳百一樣的指數級速度在網絡中快速傳播,因此系統狀態的不一致可以在很快的時間內收斂到一致。消息傳播速度達到了 logN。
- 高性能:Gossip 協議的過程極其簡單,實現起來幾乎沒有太多復雜性。
Gossip的三種功能其實都是為了實現反熵,第一種用消息隊列,第二種用推拉消息,第三種用散播謠言,下面給出三個功能的使用場景
| 直接郵寄 | 實際場景,直接郵寄一定要實現,性能損耗最低。通過發送更新數據或緩存重傳就能修復數據的不一致。 |
| 反熵 | 在存儲組件中,節點都是已知的,采用反熵修復數據副本的不一致。 |
| 謠言傳播 | 集群節點變化時,或節點較多時,采用謠言傳播方式,來同步更新多節點的數據,來實現最終一致性。 |
總結
以上是生活随笔為你收集整理的散布谣言也能实现一致性?来看看Gossip协议如何活用六度分隔理论的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 虚幻引擎入门_蓝图
- 下一篇: Sql学习04(11.23-11.24)