节点间的内部通信机制

基础通信原理

redis cluster节点间采用gossip协议进行通信。每个节点之间会互相之间不断通信,保持整个集群所有节点的数据是完整的。
维护集群的元数据方式,有两种,一种是集中式存储,一种是gossip
集中式:元数据的更新和读取,时效性非常好。一旦元数据发生了变更,会立即更新到集中式的存储服务中,其他节点读取的时候就能立刻感知到。
goosip:元数据的更新比较分散,不会集中在一个地方,更新会陆陆续续达到所有节点上更新。存在一定延时,但是降低了数据更新的压力。

节点间通信端口

端口信息

每个节点都会有一个专门用于节点间通信的端口,端口号(16379)=提供服务的端口号(6379)+10000。
每隔一段时间,各个节点都会往另外几个节点发送ping消息,其他节点收到ping消息后返回pong消息。

节点间的交换信息

故障信息,节点的增加和删除,hash slot信息等等。

gossip协议

gossip协议包含多种消息,包括ping、pong、meet、fail等消息。

  1. meet: 节点内部发送一个meet消息,代表是通知新节点加入到cluster集群中。
  2. ping:每个节点会频繁给其他节点发送ping消息,消息内容包含节点自身的状态和节点维护的集群元数据,
  3. 通过ping去与其他节点交换元数据,互相进行元数据的更新。
  4. ping消息会很频繁,同时因为会携带一些元数据,所以可能会增加网络的负担。
  5. 每个节点每秒会执行10ping,每次选择5个最久没有通信的其他节点进行通信;
  6. 或者是在某个节点的通信延时已经达到了 cluster_node_time/2,就会立即发送ping
  7. —— 避免数据交换延时过长导致数据落后。
  8. pong:对其他节点发送的pingmeet消息做出响应所发出的消息,包含节点自身的状态和元数据信息等。
  9. 同时也可以用于信息广播和更新。
  10. fail:某个节点判断另外一个节点fail后,会发送fail消息给其他节点,通知其他节点哪个节点宕机了。