Gossip 协议也叫 Epidemic Protocol(流行病协议),主要用于消息传播,是一种一致性算法。协议也非常好理解,正如协议的名称,如流行病一样靠“感染”节点进行持续传播。使用 Gossip 协议的有:Redis Cluster、Consul、Apache Cassandra等。
六度分隔理论
要说 Gossip 就不得不提“六度分隔理论”,简单的说:你和任何一个陌生人之间所间隔的人不会超过五个,也就是说,最多通过五个人你就能够认识任何一个陌生人。由时任哈佛大学的心理学教授 Stanley Milgram 在1967年提出。
Facebook 研究了已注册的15.9亿使用者资料,在2016年公布标题为 “Three and a half degrees of separation” 的研究结果。发现世界比人们想象的更紧密,世界上的每个人(至少在 Facebook 活跃的15.9亿人)平均通过3.57个人就可以与任意另外一个人产生联系。
基于六度分隔理论,信息的传播会非常迅速,而且网络交互次数不会很多。Gossip 协议是基于六度分隔理论的很好实现。
协议原理
Gossip协议基本思想就是:一个节点想要分享一些信息给网络中的其他的节点,于是随机选择一些节点进行信息传递。这些收到信息的节点接下来把这些信息传递给其他一些随机选择的节点。整体过程描述如下。
- Gossip 是周期性的散播消息
- 被感染节点随机选择 k 个邻接节点(fan-out)散播消息,假设把 fan-out 设置为2,每次最多往2个节点散播
- 每次散播消息都选择尚未发送过的节点进行散播
- 收到消息的节点不再往发送节点散播,比如 A -> B,那么 B 进行散播的时候,不再发给 A
协议优点
扩展性
Gossip 协议的可扩展性极好,一般只需要 O(LogN) 轮就可以将信息传播到所有的节点,其中 N 代表节点的个数。即使集群节点的数量增加,每个节点的负载也不会增加很多,几乎是恒定的。这就允许集群管理的节点规模能横向扩展到几千几万个,集群内的消息通信成本却不会增加很多。
容错
网络中任何节点的宕机和重启都不会影响 Gossip 消息的传播,Gossip 协议具有天然的分布式系统容错特性。
健壮性
Gossip 协议是去中心化的协议,所以集群中的所有节点都是对等的,任何节点出现问题都不会阻止其他节点继续发送消息。任何节点都可以随时加入或离开,而不会影响系统的整体服务质量。
最终一致性
消息传播是指数级的快速传播,因此当有新信息传播时,消息可以快速地发送到全局节点。系统状态的不一致可以在很快的时间内收敛到一致。
协议缺点
消息延迟
节点随机向少数几个节点发送消息,消息最终是通过多个轮次的传播而到达全网,不可避免的造成消息延迟。不适合于对实时性要求较高的场景。
消息冗余
节点会定期随机选择周围节点发送消息,而收到消息的节点也会重复该步骤,因此就不可避免的存在消息重复发送给同一节点的情况,造成了消息的冗余,同时也增加了收到消息的节点的处理压力。
拜占庭问题
如果有一个恶意传播消息的节点,Gossip协议的分布式系统就会出问题。