Gossip协议,也称为Epidemic Protocol(流行病协议),是一种分布式算法,用于在节点之间传递信息。
简介
Gossip协议是一种P2P的分布式协议,其核心是在去中心化结构下,通过将信息部分传递,达到全集群的状态信息传播。传播的时间收敛在O(Log(N))以内,其中N是节点的数量。基于Gossip协议,可以构建出状态一致的各种解决方案
● 信息的传播可以看作二叉树结构,一个周期里,一个已经知道信息的节点会随机选择一个尚未知道信息的节点传递信息,类似二叉树的层级扩展,这样是指数式增长的,所以传播时间logn
适用场景
Gossip协议适用于AP场景的数据一致性处理,如分布式数据库中节点同步数据使用(例如Apache Cassandra、Redis Cluster);其他场景如信息扩散、集群成员身份确认、故障探测等(例如Consul)
● AP场景指的是在分布式系统里优先保证系统的可用性(Availability)和分区容错性(Partition Tolerance)比如社交网络、电商网站;与之对应的是CP场景,优先保证系统的一致性(Consistency),比如金融系统、实时交易系统。
● redis cluster的应用 ,主要用于交换各自关于不同节点的状态信息
优点
简单性:实现简单
扩展性:允许节点的任意增加和减少,新增节点的状态最终会与其他节点一致。
容错性:任意节点的宕机和重启都不会影响Gossip消息的传播,具有天然的分布式系统容错特性。可以在一定程度上避免网络分割带来的问题。
去中心化:无需中心节点,所有节点都是对等的,任意节点无需知道整个网络状况,只要网络连通,任意节点可把消息散播到全网。
性能:指数级一致性收敛。消息会以“一传十的指数级速度”在网络中传播,因此系统状态的不一致可以在很快的时间内收敛到一致。消息传播速度达到了logN
工作原理
Gossip协议的工作原理主要通过节点之间的谈话来实现信息传递。以下是关于它的工作原理的详细解释:
- 节点之间的谈话:每个节点定期选择一些随机的邻居节点,这些邻居节点可以是系统中的其他任何节点。选定的邻居节点之间进行信息交换,包括将节点自身拥有的信息传递给邻居,并接收邻居节点传递的信息。选择邻居节点的过程通常是随机的,这种随机性有助于防止信息在系统中的传播路径过于固定
- 信息的传递规则:节点定期选择邻居进行信息交换,以确保系统中的所有节点都能及时获得最新的信息。通常情况下,节点将自己的信息传递给邻居节点,邻居节点也可以将其拥有的信息传递给当前节点。这种双向传递有助于确保整个系统中的一致性
通信方式
Gossip协议中两个节点之间存在三种通信方式:Push、Pull以及Push&Pull:
● Push:发起信息交换的节点随机选择联系节点,并向其发送自己的信息,节点在收到信息后更新比自己新的数据。
● Pull:发起信息交换的节点随机选择联系节点,并从对方获取信息。
● Push&Pull:发起信息交换的节点向选择的节点发送信息,同时从对方获取数据,用于更新自己的本地数据