Gossip协议本身比较简单,其使用类似于流行病的传播方式,它把信息以一种随机的方式散布到整个网络中,你可以在这里看到Gossip协议的信息散布方式的在线模拟。Gossip协议传播数据的方式分为 Push-based 和 Pull-based 两种,Push-based 方式的工作流程如下

  1. 网络中的某个节点随机选取其它n个节点作为传输对象
  2. 该节点向其它n个节点传输相应的信息
  3. 收到信息的节点重复 1 ~ 2 步的操作

Pull-based 方式则不一样,它的工作流程如下

  1. 某个节点s随机选取其它n个节点询问它们是否有最新的信息
  2. 收到请求的节点回复节点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节点启动时会根据组播或者文件配置的方式来发现一些种子节点,之后该节点与种子节点进行信息传输,而种子节点本身还可能会和一些其它的节点有着数据传输的操作。集群内部经过一段时间的节点间数据同步,集群中的任意一个节点都可以让其它所有的节点都知道自己,因此集群中的任意一个节点都可以得到集群中所有其它的节点的信息,所有的节点此时成为了一个完整的整体。

参考

Gossip Simulator
Gossip 协议简介