Redis Cluster Gossip Protocol: FAIL, UPDATE

返回目录

FAIL的发送

过程

  1. 构建消息头
  2. 把处于FAIL状态的node的ID填入消息的数据部分
  3. 广播消息
遍历cluster节点字典:
	跳过还没有创建连接的node
	跳过myself和处于handshake的node
	给node发送FAIL消息

FAIL的接收处理

过程

第1 ~ 3步是涵盖所有类型的消息,详细请参考PING/PONG/MEET。

  1. 合法性检查
  2. 根据link和消息头,从cluster节点字典中查找实体sender
  3. 通用处理
  4. 处理FAIL消息
if sender存在:
	根据FAIL消息数据中的nodename,在cluster节点字典中查找node
	if node存在 && 
			node != myself &&	/* 我们都收到消息了,不可能FAIL */
			node没有处于FAIL状态:  /* 没FAIL才需要更新状态 */
		把node更新成FAIL		/* 如果原本处于PFAIL,则先需要清除PFAIL */
		设置node的failTime为当前时间
else: /* sender不存在 */
	不清楚sender的身份,所以忽略此消息

UPDATE的发送

过程

  1. 构建消息头
  2. 把需要update的node的ID,configEpoch和slots填入消息的数据部分
  3. 给node发送UPDATE消息

UPDATE的接收处理

过程

第1 ~ 3步是涵盖所有类型的消息,详细请参考PING/PONG/MEET。

  1. 合法性检查
  2. 根据link和消息头,从cluster节点字典中查找实体sender
  3. 通用处理
  4. 处理UPDATE消息
if sender不存在:		/* 不清楚sender的身份,丢弃消息 */
	return
根据消息数据中的hostname,在cluster节点字典中查找node
if node不存在:	/* 没有node的信息,不需要更新 */
	return
if node的configEpoch >= 消息数据中的configEpoch:	/* 消息是旧的,丢弃掉 */
	return
if node原本是slave:	/* UPDATE消息是用来更新slot的归属,所以只针对master节点 */
	把node转换成master	/* 参考PING/PONG/MEET的 Point-3 */
/* 更新node的configEpoch */
node的configEpoch = 消息数据中的configEpoch
重新绑定消息数据中的slots到node /* 参考PING/PONG/MEET的 Point-6 */

你可能感兴趣的:(redis,redis,cluster,gossip)