• Redis Cluster Gossip Protocol: FAIL, UPDATE


    返回目录

    FAIL的发送

    过程

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

    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的身份,所以忽略此消息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    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 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    LDA(Fisher)线性判别分析
    最新定制的安卓项目及设计报告——仿番茄小说APP
    网络安全行业现在好混吗,工资水平怎么样?
    Python实现连连看11
    Linux下 Mysql 互为主从
    JavaScript 18 JavaScript 字符串
    支持4KHz回报还能无线充电,简约不简单的雷柏VT3S游戏鼠标上手
    困在赛博世界里的“仿生机器人”
    基于Unity引擎利用OpenCV和MediaPipe的面部表情和人体运动捕捉系统
    c++ ftplib 连接ftp与创建文件夹
  • 原文地址:https://blog.csdn.net/helowken2/article/details/128004407