• Redis Cluster Gossip Protocol: Message


    返回目录

    消息结构

    1. 消息头部
    2. 消息数据(可选)
    3. extension(可选)

    消息头部

    字段定义
    • Signature: “RCmb” 这4个字符(Redis Cluster message bus 的简称)
    • totalLen: 消息的总字节数
    • version:当前为1
    • port: TCP 端口
    • type: 消息类型
      • 0:PING
      • 1:PONG
      • 2:MEET
      • 3:FAIL
      • 4:PUB/SUB 传递
      • 5:FAILOVER_AUTH_REQUEST
      • 6:FAILOVER_AUTH_ACK
      • 7:UPDATE
      • 8:MFSTART
      • 9:MODULE
      • 10:PUB/SUB Publish Shard 传递
    • count:gossip条目数量(对PING/PONG等有效)
    • currentEpoch
    • configEpoch
    • offset:如果是master,表示复制偏移;如果是slave,表示已处理的复制偏移
    • sender:发送放的节点ID
    • myslots:发送方的slots信息
    • slaveof:发送方的master
    • myip:发送方的IP,如果为全0,则需要从socket获取
    • extensions:消息附带的extension个数
    • pport:如果port是TLS端口,则此为TCP的plaintext端口
    • cport:发送方的cluster总线端口
    • flags:发送方的标记
      • 1: NODE_MASTER(节点是mater)
      • 2: NODE_SLAVE (节点是slave)
      • 4: PFAIL(待确认的failure,一般是timeout)
      • 8: FAIL(已确认的failure)
      • 16: MYSELF (标识这实体是本节点)
      • 32: HANDSHAKE (处于handshake阶段)
      • 64: NOADDR(地址未知)
      • 128: MEET(收到了MEET指令)
      • 256: MIGRATE_TO(master可以参与副本迁移)
      • 512: NOFAILOVER(slave不会尝试failover)
    • state:在发送方看来,cluster当前的状态
      • 0:OK
      • 1:FAIL (cluster不能工作,通常是某个partition已无法访问)
    • mflags:消息标记。用于指定消息的内容或者提供关于节点状态的信息
      • 1:PAUSED(master停止了manual failover)
      • 2:FORCEACK(即使master还运作,也返回ACK给AUTH_REQUEST)
      • 4:EXT_DATA(消息包含extension数据)
    • 数据:根据消息类型而定
      • 对于PING, PONG, MEET,是0到多个的gossip
      • 对于FAIL,是处于FAIL状态的node的ID
      • 对于UPDATE,是需要update的node的ID,configEpoch和slots
    • extension:(当前只有一种extension)
      • 对于PING,是pingExtension,存放node的cluster-announce-hostname
    字段填充
    1. Signature:RCmb
    2. type:PING/PONG/MEET
    3. sender: 填入myself的ID
    4. myip:如果配置了 cluster-announce-ip 则使用,否则设为全0,指示对方需要从socket获取此节点的IP
    5. myslots:如果myself是master,则使用myself的slots,否则使用所属master的slots
    6. slaveof:如果myself是master,则设为全0,否则填入所属master的ID
    7. 计算basePort: 用于推导port/pport/cport,不填入消息头。
    if tls-cluster == yes:
    	basePort = tls-port
    else:
    	basePort = 配置文件中的port
    
    • 1
    • 2
    • 3
    • 4
    1. port:
    if tls-cluster == yes && cluster-announce-tls-port:
    	port = cluster-announce-tls-port
    else if cluster-announce-port:
    	port = cluster-announce-port
    else:
    	port = basePort			
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. pport:
    if tls-cluster == yes && cluster-announce-tls-port:
    	pport = cluster-announce-port
    else:
    	pport = tls-cluster ? 配置文件中的port : 0
    
    • 1
    • 2
    • 3
    • 4

    10.cport:

    if cluster-announce-bus-port:
    	cport = cluster-announce-bus-port
    else if cluster-port:
    	cport = cluster-port
    else:
    	cport = basePort + 10000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. flags: 自身的标记
    2. state:myself看来cluster的状态,OK与否
    3. currentEpoch:自身的currentEpoch
    4. configEpoch:如果myself是master,则使用myself的configEpoch,否则使用所属master的configEpoch
    5. offset:如果myself是master,则使用当前的复制偏移;如果myself是slave,则使用已处理的复制偏移
    6. mflags:
      如果myself是master,而且正处于manual failover,则设置PAUSED;
      如果这是一个manual failover的请求,则设置FORCEACK
    7. totalLen:估算总长度。对于PING,PONG,MEET和其他可变长的消息,总长度会在其他地方得到修正。
  • 相关阅读:
    vue3项目中使用富文本编辑器
    嵌入式系统编程实现485串口收发数据
    C++&QT 作业9
    2415. 反转二叉树的奇数层-层次遍历
    HAL库STM32串口开启DMA接收数据
    虚拟机与主机(win10之间的通信)
    Selenium浏览器自动化怎么上传文件
    虹科分享 | 简单实用的CANopen介绍,看完你就明白了(2)——CANopen框架与七种服务类型
    查看ThinkPad主机编号的五种方法
    kubernetes集群基于kubeadm部署以及常见问题解决
  • 原文地址:https://blog.csdn.net/helowken2/article/details/127985027