走进Gossip协议

Gossip协议,是一个比较简单的分布式协议,要用途就是 信息传播和扩散 :即把一些发生的事件传播到全世界。它们也被用于数据库复制,信息扩散,集群成员身份确认,故障探测等。

基于Gossip协议的一些有名的系统:Apache Cassandra,Redis Cluster模式,Consul等。

执行过程

Gossip 过程是由种子节点发起,当一个种子节点有状态需要更新到网络中的其他节点时,它会随机的选择周围几个节点散播消息,收到消息的节点也会重复该过程,直至最终网络中所有的节点都收到了消息。这个过程可能需要一定的时间,由于不能保证某个时刻所有节点都收到消息,但是理论上最终所有节点都会收到消息,因此它是一个最终一致性协议。

gossip

如下:

  • Gossip 是周期性的散播消息,把周期限定为 1 秒
  • 被感染节点随机选择 k 个邻接节点(fan-out)散播消息,这里把 fan-out 设置为 3,每次最多往 3 个节点散播。
  • 每次散播消息都选择尚未发送过的节点进行散播
  • 收到消息的节点不再往发送节点散播,比如 A -> B,那么 B 进行散播的时候,不再发给 A。

Gossip数据传输

Gossip 协议最终的目的是将数据分发到网络中的每一个节点,那么在不同的具体应用场景中如何保证网络中的每一个节点都能够接收到对应的数据且在不稳定的网络环境中保持数据的实时同步,Gossip数据分发协议实现了两种数据传输方式:推送模式拉取模式

推送模式

  • 网络中的某个节点随机选择N个节点作为数据接收对象
  • 该节点向其选中的N个节点传输相应的信息
  • 接收到信息的节点处理它接收到的数据
  • 接收到数据的节点再从第一步开始重复执行

Gossip

拉取模式

  • 某个节点周期性地选择随机N个节点询问有没有最新的信息
  • 收到请求的节点回复请求节点其最近未收到的信息

Gossip

Gossip优势

Gossip是一种去中心化的分布式协议,网络中的某个节点将指定的数据发送到网络内的一组其他节点,数据通过节点像病毒一样逐个传播。最终,数据传播到系统中的每个节点。从而实现在大型分布式系统中可靠地进行数据的传播。它具备一下优势:

可扩展性(Scalable)

gossip 协议是可扩展的,一般需要 O(logN) 轮就可以将信息传播到所有的节点,其中 N 代表节点的个数。每个节点仅发送固定数量的消息,并且与网络中节点数目无法。在数据传送的时候,节点并不会等待消息的 ack,所以消息传送失败也没有关系,因为可以通过其他节点将消息传递给之前传送失败的节点。系统可以轻松扩展到数百万个进程。

容错(Fault-tolerance)

网络中任何节点的重启或者宕机都不会影响 gossip 协议的运行。

健壮性(Robust)

gossip 协议是去中心化的协议,所以集群中的所有节点都是对等的,没有特殊的节点,所以任何节点出现问题都不会阻止其他节点继续发送消息。任何节点都可以随时加入或离开,而不会影响系统的整体服务质量(QOS)

最终一致性(Convergent consistency)

Gossip 协议实现信息指数级的快速传播,因此在有新信息需要传播时,消息可以快速地发送到全局节点,在有限的时间内能够做到所有节点都拥有最新的数据。

在分布式网络中,网络节点是否具有高扩展性,节点的可用性,数据如何进行传播,且在一个不稳定的分布式网络环境中,如何保证数据的实时同步,是所有开发人员都需要关注并解决的问题。

参考

有用就打赏一下作者吧!