分布式系统 - Gossip 协议
1、 什么是Gossip协议?
Gossip 协议,运用到了流行病学的原理,采用一种随机的、带有感染性的方式将信息传播到整个集群网络中,并在O(logN)的时间将系统内使系统内所有节点数据保持一致性的这么一个协议。它在分布式中被广泛的运用。
2、Gossip执行过程:
Gossip 过程是由种子节点发起,当一个种子节点有状态需要更新到网络中的其他节点时,它会随机的选择周围几个节点散播消息,收到消息的节点也会重复该过程,直至最终网络中所有的节点都收到了消息。这个过程可能需要一定的时间,由于不能保证某个时刻所有的节点都收到消息,但是能够保证最终所有节点都会收到消息,因此它是一个最终一致性协议。
Gossip 是周期性的散播消息
被感染节点随机选择k个邻接节点(fan-out)散播消息
每次散播消息都选择尚未发送的节点进行散播
收到消息的节点不再往发送节点散播,例如 A -> B , B在散播的时候回,不再发给A
注意:Gossip 过程是异步的,是UDP的传输协议,也就是说发消息的节点不会关注对方是否收到,即不等待响应;不管对方有没有收到,它都会每隔一个周期向周围节点发消息。异步是其优点,但这样会消息冗余。
3、Gossip 优势
可扩展性(Scalable)
gossip协议是可扩展的,一般需要O(logN)轮就可以将信息传播到所有的节点。每个节点仅发送固定数量的消息,并且与节点中数目无关。数据在发送的时候,节点不会等待消息的 ack(确定接受无误,基于UDP的传输协议),所以消息传送失败也没有关系,因为可以通过其他节点将消息传递给之前传送失败的节点。
容错(Fault-tolerance)
集群中任何节点的重启或者宕机都不会影响gossip协议的运行。
健壮性
Gossip协议是一种去中心化思想的分布式协议。所谓去中心化的意思是,整个系统集群中没有特殊的节点,所有节点都是对等的,例如在地球整个系统中的人,在病毒感染的时候,不会管你这个人是否存在特殊身份,普通百姓也好,科学家政治家也罢,都会进行一个无差别的感染。所以任何节点出现问题都不会组织其他的节点继续发布消息,任何节点都可以随时加入或离开,而不会影响系统的整体服务质量。
最终一致性(Convergent consistency)
Gossip协议实现信息指数级的快速传播,因此在有新信息需要传播时,消息可以快速的发送到全局节点,在有限的时候内能够做到所有节点都拥有最新的数据。
简单
Gossip协议的过程及其简单,实现起来几乎没有太多复杂性。
4、Gossip 的缺陷
分布式网络中,没有一种完美的解决方案,Gossip协议和其他协议一样,也有一些不可避免的缺陷,主要有两个方面:消息的延迟和消息冗余。
消息的延迟:
由于Gossip协议中,节点知会随机向少数几个节点发送消息,消息最终是通过多个轮次的散播而到达全网的,因此使用Gossip协议会造成不可避免的消息延迟。不适合用在实时性要求较高的场景下。
消息冗余:
Gossip协议规定,节点会定期随机选择周围节点发送消息,而收到消息的及诶点也会重复该步骤,因此不可避免的存在消息重复发送给同一节点的情况,造成了消息的冗余,同时也增加了收到消息的节点的处理压力。而且由于是定期发送,因此即使收到了消息的节点还会反复收到重复消息,加重了消息的冗余。
5、Gossip 三板斧
Gossip 的三板斧分别是: 直接邮寄(Direct Mail)、反熵(Anti-entropy) 和谣言传播(Rumor mongering)。
直接邮寄: 直接发送更新数据,当数据发送失败时会将数据缓存,然后重新传播;
缺点:虽然实现上比较容易,数据同步也很及时,但可能会因为缓存队列满了而丢数据。也就是说直接邮寄无法实现最终一致性。
反熵: 集群中的节点,每隔一段时间就随机选择某个其他节点,然后通过互相交换自己的所有数据来消除两者之间的差异,实现数据的最终一致性;
实现反熵主要有推、拉和推拉三种方式:
- 推方式:就是将自己的所有副本数据推给对方,修复对方副本的熵;
- 拉方式:就是拉取对方的所有副本数据,修复自己副本中的熵;
- 推拉方式:就是同事修复自己副本和对方副本中的熵,
反熵就是指消除不同节点中数据的差异,提升节点间数据的相似度,降低熵值。
注意:反熵需要节点两两交换和比对数据,执行反熵时通讯成本很高,不建议频繁执行反熵,并且可以通过引入校验和(CheckSum)等机制,降低需要对比的数据量和通讯消息等。
虽然反熵很实用,但是执行反熵时,相关的节点都是已知的,而且节点数量不能太多,如果一个动态变化或节点数比较多的分布式环境,这时反熵就不适用了。
谣言传播: 广泛的散播谣言,它指的是当一个节点有了新数据后,这个节点编程活跃状态,并周期性的联系其他节点向其发送新数据,知道所有的节点都存储了该新数据。
谣言传播非常具有感染性,它适合动态变化的分布式系统。
6、复杂度分析
对于一个节点数为N的网络来说,假设每个Gossip周期,新感染的节点都能再感染至少一个新节点,那么Gossip协议退化成一个二叉树查找,经过 logN 个周期后,感染全网,时间复杂度为O(logN)。由于每个周期每个节点都会至少发出一次消息,因此,消息复杂度(消息数量 = N * N)是O(N^2)。注意,这是Gossip理论上最优的收敛速度,但是在实际情况中,最优的收敛速度是很难达到的。
假设某个节点在第 i 个周期被感染的概率为 pi,第 i + 1个周期被感染的概率为 pi + 1,
则 pull 的方式:p i+1 = pi^2
push方式: pi+1 = pi ( 1- 1/n)^n(1-pi)
显然 Pull 的收敛速度大于 Push,而每个节点在每个周期被感染的概率都是固定的 p(0<p<1),因此 Gossip 算法是基于 p 的平方收敛,也称为概率收敛,这在众多的一致性算法中是非常独特的。
posted on 2022-06-12 18:14 torotoise512 阅读(523) 评论(0) 收藏 举报
浙公网安备 33010602011771号