共计 1809 个字符,预计需要花费 5 分钟才能阅读完成。
Gossip 的一些特点
在一个有界网络中,每个节点都随机地与其它节点通信,通过一段无序的通信后,最终所有节点的状态都会达成统一,即便是有节点宕机后重启或有新节点退出,但一段时间后这些节点的状态也会与其它节点达成统一,从这一点来说,Gossip 人造具备分布式容错的长处。
依据下面的形容,咱们晓得 Gossip 是一个最终一致性算法,它无奈保障在某个时刻所有节点状态统一,但能够保障最终统一。另外 Gossip 不要求节点晓得所有其它节点,因而又具备去中心化的特点,节点之间齐全对等,不须要任何的核心节点。
但 Gossip 的毛病也很显著,冗余通信会对网络带宽与 CPU 资源造成很大的负载,从有的材料上看到说当集群规模超过百节点级别后,Gossip 协定的效率将会显著降落,通信老本越来越高。
Gossip 节点的三种通信形式
两个节点 (A,B) 之间存在三种通信形式:
- 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 更新本地
如果将两个节点数据同步一次定义为一个周期,则在一个周期内,push 需通信 1 次,pull 需 2 次,push/pull 则需 3 次。但从成果上来讲,push/pull 最好,实践上一个周期能够使两个节点完全一致。
Gossip 在 Redis Cluster 中的作用
在分布式系统中,须要提供保护节点元数据信息的机制,所谓元数据是指节点负责哪些数据、主从属性、是否故障等状态信息。常见的元数据保护形式个别分集中式与无核心式。Redis Cluster 采纳 Gossip 协定实现无核心式。
具体来讲,Redis Cluster 中应用 Gossip 次要有两大作用:
- 去中心化,以实现分布式和弹性扩大
- 失败检测,以实现高可用
节点通信根底
Redis Cluster 中的每个实例监听两个 TCP 端口:6379 用于服务客户端查问;16379 用于集群外部通信。集群中节点通信形式如下:
- 每个节点在固定周期内通过特定规定抉择几个节点发送 Ping 音讯
- 接管到 Ping 音讯的节点用 Pong 音讯作为回应
集群中每个节点通过肯定规定筛选要通信的节点,每个节点可能晓得全副节点,也可能仅晓得局部节点,只有这些节点彼此能够失常通信,最终它们会达到统一的状态。当节点故障、新节点退出、主从关系变动,槽信息变更等事件产生时,通过一直的 Ping/Pong 音讯通信,通过一段时间后所有的节点都会晓得集群全副节点的最新状态,从而达到集群状态同步的目标。
Gossip 在 Redis Cluster 里的音讯品种
- Meet 音讯:用于告诉新节点退出。音讯发送者告诉接收者退出到以后集群,Meet 音讯通信失常实现后,接管节点会退出到集群中并进行周期性的 Ping,Pong 音讯替换
- Ping 音讯:集群内替换最频繁的音讯,集群内每个节点每秒向多个其它节点发送 Ping 音讯,用于检测节点是否在线和替换彼此状态信息。Ping 音讯发送封装了本身节点和局部其它节点的状态数据
- Pong 音讯:当接管到 Ping,Meet 音讯时,作为响应音讯回复给发送方确认音讯失常通信。Pong 音讯外部封装了本身状态数据。节点也能够向集群内播送本身的 Pong 音讯来告诉整个集群对本身状态进行更新
- Fail 音讯:当节点判集群内另一节点下线时,会向集群内播送一个 Fail 音讯,其余节点接管到 Fail 音讯之后会将对应节点更新为下线状态
因为集群外部须要频繁地进行节点信息替换,而 Ping/Pong 音讯携带以后节点和局部其它节点的状态数据,会减轻带宽和计算的累赘。Redis 集群内节点通信采纳固定频率(定时工作每秒执行 10 次),因而,节点每次抉择须要通信的节点列表十分重要。通信节点抉择过多尽管能够做到信息及时替换但老本过高。节点抉择过少则会升高集群内所有节点彼此信息替换的频率,从而影响故障断定、新节点发现等需要的速度。因而 Redis 集群的 Gossip 协定须要兼顾信息替换实时性和老本开销。
最初,redis 集群的故障检测,故障转移与 master 选举能够看之前的文章:redis 学习之集群
参考的文章:Gossip 算法 Gossip 算法
分布式一致性协定 Gossip 和 Redis 集群原理解析