10.3.1 通信流程

常见的元数据维护方式分为: 集中式和 P2P 方式。Redis 集群采用 P2P 的 Gossip (流言) 协议, Gossip 协议工作原理就是节点彼此不断通信交换信息, 一段时间后所有的节点都会知道集群完整的信息, 这种方式类似流言传播:

image.png

通信过程:

  1. 集群中的每个节点都会单独开辟一个 TCP 通道, 用于节点之间彼此通信, 通信端口号在基础端口上加10000
  2. 每个节点在固定周期内通过特定规则选择几个节点发送 ping 消息
  3. 接收到 ping 消息的节点用 pong 消息作为响应

10.3.2 Gossip 消息

常用的 Gossip 消息可分为: ping 消息、pong 消息、meet 消息、fail 消息等

image.png

  1. meet 消息: 用于通知新节点加入。消息发送者通知接收者加入到当前集群, meet 消息通信正常完成后, 接收节点会加入到集群中并进行周期性的 ping、pong 消息交换
  2. ping 消息: 集群内交换最频繁的消息, 集群内每个节点每秒向多个其他节点发送 ping 消息, 用于检测节点是否在线和交换彼此状态信息。ping 消息发送封装了自身节点和部分其他节点的状态数据
  3. pong 消息: 当接收到 ping、meet 消息时, 作为响应消息回复给发送方确认消息正常通信。pong 消息内部封装了自身状态数据。节点也可以向集群内广播自身的 pong 消息来通知整个集群对自身状态进行更新
  4. fail 消息: 当节点判定集群内另一个节点下线时, 会向集群内广播一个 fail 消息, 其他节点接收到 fail 消息之后把对应节点更新为下线状态

消息格式:

  • 消息头, 包含发送节点自身状态数据
    • 集群内所有的消息都采用相同的消息头结构 clusterMsg

image.png

  • 消息体, 在 Redis 内部采用 clusterMsgData 结构声明

image.png
image.png

消息体 clusterMsgData 定义发送消息的数据, 其中 ping、meet、pong 都采用 clusterMsgDataGossip 数组作为消息体数据, 实际消息类型使用消息头的 type 属性区分。

每个消息体包含该节点的多个 clusterMsgDataGossip 结构数据, 用于信息交换:

image.png

image.png

10.3.3 节点选择

Redis 集群的 Gossip 协议需要兼顾信息交换实时性和成本开销, 通信节点选择的规则:

image.png

  1. 10-15 选择通信节点的规则和消息携带的数据量