圖解Redis如何利用Gossip協議確保信息一致性

Gossip是什麼

Gossip協議是一個通信協議,一種傳播消息的方式,靈感來自於:瘟疫、社交網絡等。使用Gossip協議的有:Redis Cluster、Consul、Apache Cassandra等。

六度分隔理論

說到社交網絡,就不得不提著名的六度分隔理論。1967年,哈佛大學的心理學教授Stanley Milgram想要描繪一個連結人與社區的人際連繫網。做過一次連鎖信實驗,結果發現了“六度分隔”現象。簡單地說:“你和任何一個陌生人之間所間隔的人不會超過六個,也就是說,最多通過六個人你就能夠認識任何一個陌生人。

數學解釋該理論:若每個人平均認識260人,其六度就是260↑6 =1,188,137,600,000。消除一些節點重複,那也幾乎覆蓋了整個地球人口若干多多倍,這也是Gossip協議的雛形。

原理

Gossip協議基本思想就是:一個節點想要分享一些信息給網絡中的其他的一些節點。於是,它週期性隨機選擇一些節點,並把信息傳遞給這些節點。這些收到信息的節點接下來會做同樣的事情,即把這些信息傳遞給其他一些隨機選擇的節點。一般而言,信息會週期性的傳遞給N個目標節點,而不只是一個。這個N被稱為

fanout(這個單詞的本意是扇出)。

用途

Gossip協議的主要用途就是信息傳播和擴散:即把一些發生的事件傳播到全世界。它們也被用於數據庫複製,信息擴散,集群成員身份確認,故障探測等。

基於Gossip協議的一些有名的系統:Apache Cassandra,Redis(Cluster模式),Consul等。

圖解

接下來通過多張圖片剖析Gossip協議是如何運行的。如下圖所示,Gossip協議是週期循環執行的。圖中的公式表示Gossip協議把信息傳播到每一個節點需要多少次循環動作,需要說明的是,公式中的20表示整個集群有20個節點,4表示某個節點會向4個目標節點傳播消息:

圖解Redis如何利用Gossip協議確保信息一致性

Gossip Protocol

如下圖所示,紅色的節點表示其已經“受到感染”,即接下來要傳播信息的源頭,連線表示這個初始化感染的節點能正常連接的節點(其不能連接的節點只能靠接下來感染的節點向其傳播消息)。並且N等於4,我們假設4根較粗的線路,就是它第一次傳播消息的線路:

圖解Redis如何利用Gossip協議確保信息一致性

first infected node

第一次消息完成傳播後,新增了4個節點會被“感染”,即這4個節點也收到了消息。這時候,總計有5個節點變成紅色:

圖解Redis如何利用Gossip協議確保信息一致性

infected nodes

那麼在下一次傳播週期時,總計有5個節點,且這5個節點每個節點都會向4個節點傳播消息。最後,經過3次循環,20個節點全部被感染(都變成紅色節點),即說明需要傳播的消息已經傳播給了所有節點:

圖解Redis如何利用Gossip協議確保信息一致性

infected all nodes

需要說明的是,20個節點且設置fanout=4,公式結果是2.16,這只是個近似值。真實傳遞時,可能需要3次甚至4次循環才能讓所有節點收到消息。這是因為每個節點在傳播消息的時候,是隨機選擇N個節點的,這樣的話,就有可能某個節點會被選中2次甚至更多次。

發送消息

由前面對Gossip協議圖解分析可知,節點傳播消息是週期性的,並且

每個節點有它自己的週期。另外,節點發送消息時的目標節點數由參數fanout決定。至於往哪些目標節點發送,則是隨機的。

一旦消息被髮送到目標節點,那麼目標節點也會被感染。一旦某個節點被感染,那麼它也會向其他節點傳播消息,試圖感染更多的節點。最終,每一個節點都會被感染,即消息被同步給了所有節點:

圖解Redis如何利用Gossip協議確保信息一致性

infected

可擴展性

Gossip協議是可擴展的,因為它只需要O(logN) 個週期就能把消息傳播給所有節點。某個節點在往固定數量節點傳播消息過程中,並不需要等待確認(ack),並且,即使某條消息傳播過程中丟失,它也不需要做任何補償措施。大哥比方,某個節點本來需要將消息傳播給4個節點,但是由於網絡或者其他原因,只有3個消息接收到消息,即使這樣,這對最終所有節點接收到消息是沒有任何影響的。

如下表格所示,假定fanout=4,那麼在節點數分別是20、40、80、160時,消息傳播到所有節點需要的循環次數對比,在節點成倍擴大的情況下,循環次數並沒有增加很多。所以,Gossip協議具備可擴展性:

圖解Redis如何利用Gossip協議確保信息一致性

可擴展性

失敗容錯

Gossip也具備失敗容錯的能力,即使網絡故障等一些問題,Gossip協議依然能很好的運行。因為一個節點會多次分享某個需要傳播的信息,即使不能連通某個節點,其他被感染的節點也會嘗試向這個節點傳播信息。

健壯性

Gossip協議下,沒有任何扮演特殊角色的節點(比如leader等)。任何一個節點無論什麼時候下線或者加入,並不會破壞整個系統的服務質量。

然而,Gossip協議也有不完美的地方,例如,拜占庭問題(Byzantine)。即,如果有一個惡意傳播消息的節點,Gossip協議的分佈式系統就會出問題。


專注於技術熱點大數據,人工智能,JAVA、Python、 C 、GO、Javascript等語言最新前言技術,及業務痛點問題分析,請關注【編程我最懂】共同交流學習。


分享到:


相關文章: