集群的消息
集群中的各个节点通过发送和接收消息(message)来进行通信,我们称发送消息的节点为发送者(sender,接收消息的节点为接收者(receiver),如下图所示
节点发送的消息主要有以下五种:
- MEET消息: 当发送者接到客户端发送的CLUSTER MEET命令时,发送者会向接收者 发送MEET消息,请求接收者加入到发送者当前所处的集群里面
- PING消息: 集群里的每个节点默认每隔一秒钟就会从已知节点列表中随机选出五个节 点,然后对这五个节点中最长时间没有发送过PING消息的节点发送PING消息,以此来检测被选中的节点是否在线。除此之外,如果节点A最后一次收到节点B发送的PONG消息的时
间,距离当前时间已经超过了节点A的cluster-node-timeout选项设置时长的一半,那么节点A也会向节点B发送PING消息,这可以防止节点A因为长时间没有随机选中节点B作为PING消
息的发送对象而导致对节点B的信息更新滞后- PONG消息: 当接收者收到发送者发来的MEET消息或者PING消息时,为了向发送者 确认这条MEET消息或者PING消息已到达,接收者会向发送者返回一条PONG消息。另外,
一个节点也可以通过向集群广播自己的PONG消息来让集群中的其他节点立即刷新关于这个节点的认识,例如当一次故障转移操作成功执行之后,新的主节点会向集群广播一条PONG消息,以此来让集群中的其他节点立即知道这个节点已经变成了主节点,并且接管了已下线
节点负责的槽- FAIL消息:当一个主节点A判断另一个主节点B已经进入FAIL状态时,节点A会向集群 广播一条关于节点B的FAIL消息,所有收到这条消息的节点都会立即将节点B标记为已下线
- PUBLISH消息:当节点接收到一个PUBLISH命令时,节点会执行这个命令,并向集群 广播一条PUBLISH消息,所有接收到这条PUBLISH消息的节点都会执行相同的PUBLISH命 令
一、消息的结构
一条消息由消息头(header)和消息正文(data) 组成
消息头(struct clusterMsg)
- 节点发送的所有消息都由一个消息头包裹,消息头除了包含消息正文之外,还记录了消息发送者自身的一些信息,因为这些信息也会被消息接收者用到,所以严格来讲,我们可以认为消息头本身也是消息的一部分.
每个消息头都由一个cluster.h/clusterMsg结构表示://消息的长度(包括这个消息头的长度和消息正文的长度) uint32_t totlen; //消息的类型 uint16_t type; //消息正文包含的节点信息数量 //只在发送MEET 、PING 、PONG 这三种Gossip 协议消息时使用 uint16_t count; //发送者所处的配置纪元 uint64_t currentEpoch; //如果发送者是一个主节点,那么这里记录的是发送者的配置纪元 //如果发送者是一个从节点,那么这里记录的是发送者正在复制的主节点的配置纪元 uint64_t configEpoch; //发送者的名字(ID ) char sender[REDIS_CLUSTER_NAMELEN]; //发送者目前的槽指派信息