返回目录
消息结构
消息头部 消息数据(可选) 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和其他可变长的消息,总长度会在其他地方得到修正。