Redis(设计与实现):60---集群之集群的消息(MEET、PING、PONG、FAIL、PUBLISH、struct clusterMsg)

本文详细介绍了Redis集群中的节点通信机制,包括MEET、PING、PONG、FAIL和PUBLISH消息的实现及作用。MEET消息用于节点加入集群,PING/PONG消息用于节点心跳检测和状态确认,FAIL消息用于快速传播节点故障信息,PUBLISH消息则用于集群内的发布订阅功能。文章通过Gossip协议解释了消息的结构和传播过程,并给出了具体的示例场景。
摘要由CSDN通过智能技术生成

集群的消息

集群中的各个节点通过发送和接收消息(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];
    //发送者目前的槽指派信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值