消息结构
- 消息头部
- 消息数据(可选)
- 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
字段填充
- Signature:RCmb
- type:PING/PONG/MEET
- sender: 填入myself的ID
- myip:如果配置了 cluster-announce-ip 则使用,否则设为全0,指示对方需要从socket获取此节点的IP
- myslots:如果myself是master,则使用myself的slots,否则使用所属master的slots
- slaveof:如果myself是master,则设为全0,否则填入所属master的ID
- 计算basePort: 用于推导port/pport/cport,不填入消息头。
if tls-cluster == yes:
basePort = tls-port
else:
basePort = 配置文件中的port
- 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
- 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
- flags: 自身的标记
- state:myself看来cluster的状态,OK与否
- currentEpoch:自身的currentEpoch
- configEpoch:如果myself是master,则使用myself的configEpoch,否则使用所属master的configEpoch
- offset:如果myself是master,则使用当前的复制偏移;如果myself是slave,则使用已处理的复制偏移
- mflags:
如果myself是master,而且正处于manual failover,则设置PAUSED;
如果这是一个manual failover的请求,则设置FORCEACK - totalLen:估算总长度。对于PING,PONG,MEET和其他可变长的消息,总长度会在其他地方得到修正。