來自於流行病的Gossip協議
Gossip協議本身比較簡單,其使用類似於流行病的傳播方式,它把信息以一種隨機的方式散布到整個網絡中,你可以在這里看到Gossip協議的信息散布方式的在線模擬。Gossip協議傳播數據的方式分為 Push-based 和 Pull-based 兩種,Push-based 方式的工作流程如下
- 網絡中的某個節點隨機選取其它n個節點作為傳輸對象
- 該節點向其它n個節點傳輸相應的信息
- 收到信息的節點重復 1 ~ 2 步的操作
Pull-based 方式則不一樣,它的工作流程如下
- 某個節點s隨機選取其它n個節點詢問它們是否有最新的信息
- 收到請求的節點回復節點s告知其最新的信息
Gossip協議收斂性是比較好的,也就是說隨着節點的增加,一次數據更新所需要的完整時間的增長率會逐漸降低,最終所需要的時間會趨於平穩,這使得Gossip在海量節點的情況下也能有良好的同步效率。
著名的分布式搜索引擎Elasticsearch就是使用了類似於Gossip的算法來實現節點之間的發現的。所有的節點會根據此協議而相互通信,最終組合起來成為一個完整的整體。
Zen discovery uses a list of seed nodes in order to start off the discovery process. At startup, or when electing a new master, Elasticsearch tries to connect to each seed node in its list, and holds a gossip-like conversation with them to find other nodes and to build a complete picture of the cluster. By default there are two methods for configuring the list of seed nodes: unicast and file-based. It is recommended that the list of seed nodes comprises the list of master-eligible nodes in the cluster.
以上內容出自ES文檔Seed nodes。
簡單來說,ES節點啟動時會根據組播或者文件配置的方式來發現一些種子節點,之后該節點與種子節點進行信息傳輸,而種子節點本身還可能會和一些其它的節點有着數據傳輸的操作。集群內部經過一段時間的節點間數據同步,集群中的任意一個節點都可以讓其它所有的節點都知道自己,因此集群中的任意一個節點都可以得到集群中所有其它的節點的信息,所有的節點此時成為了一個完整的整體。