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. 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. pport:
if tls-cluster == yes && cluster-announce-tls-port:
	pport = cluster-announce-port
else:
	pport = tls-cluster ? 配置文件中的port : 0

10.cport:

if cluster-announce-bus-port:
	cport = cluster-announce-bus-port
else if cluster-port:
	cport = cluster-port
else:
	cport = basePort + 10000
  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和其他可变长的消息,总长度会在其他地方得到修正。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值