【Java高级工程师蜕变之路】057 分布式一致性协议之Gossip协议
Gossip协议
什么是Gossip协议
Gossip协议,也叫 Epidemic协议(流行病协议)。原本用于分布式数据库中节点同步数据使用,后来被广泛应用于数据库复制、信息扩散、集群成员身份确认、故障探测等。
Gossip协议利用随机方式将信息传播到整个网络,并在一定时间内,使系统内所有节点的数据一致。
Gossip协议是一种去中心化的分布式协议,解决状态在集群中的传播和状态一致性保证两个问题。
Gossip协议的传播方式有两种:反熵传播和谣言传播
1、反熵传播
以固定概率传播随机数据。
所有参与节点只有两种状态:Suspective(病原)和Infective(感染)。过程是种子节点会把所有数据,都跟其他节点共享,以便消除节点之间的数据不一致,他可以保证节点的最终、完全一致性。
缺点是消息数量非常庞大,且无限制,通常用于新加入节点的数据初始化。
2、谣言传播
以固定概率只传播新到达的数据。所有参与节点有三种状态:Suspective(病原)、Infective(感染)、Removed(愈除)。
消息只包含最新update,谣言节点在某个消息之后被标记为removed,并且不再被传播。
缺点是系统有一定的概率会不一致,通常用于节点之间的增量同步。
通信方式
-
push
节点A将数据以及对应的版本(key,value,version)推送到B节点,B节点更新A节点中比自己新的数据。
-
pull
A仅将key,version推送给B,B将本地比A新的数据(key,value,version)推送给A,A更新本地数据。
-
push/pull
与pull类似,多了一步,A再将本地比B新的数据推送给B,B更新本地数据
优缺点
-
优点
- 扩展性:允许节点的任意增加或者减少,新增节点的状态最终会与其他节点一致
- 容错:任意节点的宕机和重启都不会影响Gossip消息的传播,具有天然的分布式系统容错性
- 去中心化:无需中心节点,所有节点都是对等的,任意节点无需知道整个网络状况,只要网络联通,任意节点可把消息散播到全网
- 最终一致性:Gossip协议实现消息的指数级传播,因此,在有新消息传播时,消息可以快速发送到全局节点,在有限时间内能够做到所有节点拥有最新数据
-
缺点
-
消息延迟:节点随机向少数几个节点发送消息,消息最终通过多个轮次的散播而到达全网,不可避免造成消息延迟
-
消息冗余:节点定期随机选择周围节点发送消息,而收到消息的节点也会重复该步骤,不可避免引起同一节点消息被多次接收,增加消息处理压力
-
Gossip是一种去中心化的分布式协议,数据通过节点像病毒一样传播。
因为是指数级传播,所以传播速度非常快。
Gossip协议适用于 AP 场景的数据一致性处理,常见的应用有:P2P网络通信、Redis Cluster、Consul