节点间的内部通信机制
基础通信原理
redis cluster节点间采用gossip协议
进行通信。每个节点之间会互相之间不断通信,保持整个集群所有节点的数据是完整的。
维护集群的元数据方式,有两种,一种是集中式存储,一种是gossip
集中式:元数据的更新和读取,时效性非常好。一旦元数据发生了变更,会立即更新到集中式的存储服务中,其他节点读取的时候就能立刻感知到。
goosip:元数据的更新比较分散,不会集中在一个地方,更新会陆陆续续达到所有节点上更新。存在一定延时,但是降低了数据更新的压力。
节点间通信端口
端口信息
每个节点都会有一个专门用于节点间通信的端口,端口号(16379)=提供服务的端口号(6379)+10000。
每隔一段时间,各个节点都会往另外几个节点发送ping消息,其他节点收到ping消息后返回pong消息。
节点间的交换信息
gossip协议
gossip协议包含多种消息,包括ping、pong、meet、fail
等消息。
meet: 节点内部发送一个meet消息,代表是通知新节点加入到cluster集群中。
ping:每个节点会频繁给其他节点发送ping消息,消息内容包含节点自身的状态和节点维护的集群元数据,
通过ping去与其他节点交换元数据,互相进行元数据的更新。
ping消息会很频繁,同时因为会携带一些元数据,所以可能会增加网络的负担。
每个节点每秒会执行10次ping,每次选择5个最久没有通信的其他节点进行通信;
或者是在某个节点的通信延时已经达到了 cluster_node_time/2,就会立即发送ping。
—— 避免数据交换延时过长导致数据落后。
pong:对其他节点发送的ping和meet消息做出响应所发出的消息,包含节点自身的状态和元数据信息等。
同时也可以用于信息广播和更新。
fail:某个节点判断另外一个节点fail后,会发送fail消息给其他节点,通知其他节点哪个节点宕机了。