- gossip 是什么
Gossip protocol 也叫 Epidemic Protocol (流行病協議),實際上它還有很多別名,比如:“流言算法”、“疫情傳播算法”等。是基于流行病傳播方式的節點或者進程之間信息交換的協議,主要用在分布式數據庫系統中各個副本節點同步數據之用,這種場景的一個最大特點就是組成的網絡的節點都是對等節點,是非結構化網絡,
gossip protocol 最初是由施樂公司帕洛阿爾托研究中心(Palo Alto Research Center)的研究員艾倫·德默斯(Alan Demers)于1987年創造的。從 gossip 單詞就可以看到,其中文意思是八卦、流言等意思,我們可以想象下緋聞的傳播(或者流行病的傳播);gossip 協議的工作原理就類似于這個。gossip 協議利用一種隨機的方式將信息傳播到整個網絡中,并在一定時間內使得系統內的所有節點數據一致。Gossip 其實是一種去中心化思路的分布式協議,解決狀態在集群中的傳播和狀態一致性的保證兩個問題。
- Gossip 協議的執行過程:
Gossip 過程是由種子節點發起,當一個種子節點有狀態需要更新到網絡中的其他節點時,它會隨機的選擇周圍幾個節點散播消息,收到消息的節點也會重復該過程,直至最終網絡中所有的節點都收到了消息。這個過程可能需要一定的時間,由于不能保證某個時刻所有節點都收到消息,但是理論上最終所有節點都會收到消息,因此它是一個最終一致性協議。
如下:
- Gossip 是周期性的散播消息,把周期限定為 1 秒
- 被感染節點隨機選擇 k 個鄰接節點(fan-out)散播消息,這里把 fan-out 設置為 3,每次最多往 3 個節點散播。
- 每次散播消息都選擇尚未發送過的節點進行散播
- 收到消息的節點不再往發送節點散播,比如 A -> B,那么 B 進行散播的時候,不再發給 A。
假設現在有 16 個節點,節點 1 為初始被感染節點,通過 Gossip 過程,最終所有節點都被感染:
gossip 優勢
可擴展性(Scalable)
gossip 協議是可擴展的,一般需要 O(logN) 輪就可以將信息傳播到所有的節點,其中 N 代表節點的個數。每個節點僅發送固定數量的消息,并且與網絡中節點數目無法。在數據傳送的時候,節點并不會等待消息的 ack,所以消息傳送失敗也沒有關系,因為可以通過其他節點將消息傳遞給之前傳送失敗的節點。系統可以輕松擴展到數百萬個進程。
容錯(Fault-tolerance)
網絡中任何節點的重啟或者宕機都不會影響 gossip 協議的運行。
健壯性(Robust)
gossip 協議是去中心化的協議,所以集群中的所有節點都是對等的,沒有特殊的節點,所以任何節點出現問題都不會阻止其他節點繼續發送消息。任何節點都可以隨時加入或離開,而不會影響系統的整體服務質量(QOS)
最終一致性(Convergent consistency)
Gossip 協議實現信息指數級的快速傳播,因此在有新信息需要傳播時,消息可以快速地發送到全局節點,在有限的時間內能夠做到所有節點都擁有最新的數據。
gossip 的應用
gossip 協議可以支持以下需求:
- Database replication
- 消息傳播
- Cluster membership
- Failure 檢測
- Overlay Networks
- Aggregations (比如計算平均值、最大值以及總和)
在下面的工程上使用到了 gossip 協議。
- Riak(https://github.com/basho/riak) 使用 gossip 協議來共享和傳遞集群的環狀態(ring state)和存儲桶屬性(bucket properties)。
- Cassandra:節點間的信息交換使用了 gossip 協議,因此所有節點都可以快速了解集群中的所有其他節點。
- Dynamo:采用基于 gossip 協議的分布式故障檢測和成員協議,這樣集群中添加或移除節點,其他節點可以快速檢測到。
- Consul:使用了稱為 SERF 的gossip 協議,主要有兩個目的:1、發現新的節點或者發現故障節點;2、為一些重要的事件(比如 Leader 選舉)傳播提供可靠、快速的傳播
- redis Cluster:集群中的 Nodes 之間使用 gossip 協議向其他 nodes 傳播集群信息,以達到自動發現的特性。