• 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
  • 相关阅读:
    瀑布流布局
    【SCAU数据挖掘】数据挖掘期末总复习题库应用题及解析
    如何使用Python编写脚本来自动获取和保存网络小说
    【大数据之Kafka】十五、Kafka-Kraft模式
    手写promis(1)
    ubuntu系统(11):ubuntu20.04命令行安装vscode
    文件操作及函数
    背包问题---怎么选取物品,可以使得背包装的物品价值最大?
    放弃36年的鞋服业务转而“卖粮”,贵人鸟胜算几何?
    vue补充继上一篇
  • 原文地址:https://blog.csdn.net/helowken2/article/details/128004407