redis源码之:cluster集群故障处理

news2024/11/18 1:34:38

在redis源码之:集群创建与节点通信(1)分析clusterCron定时任务及在redis源码之:集群创建与节点通信(2)分析**clusterReadHandler处理ping请求与pong响应时(clusterProcessPacket)**时,我们跳过了故障处理的部分,现在我们回过头学习这两部分的内容:

一、下线与疑似下线标记

在clusterCron中,会检测cluster->nodes中的每个节点的nodedelay,看是否超过node time out,超过则标记为疑似下线:
在这里插入图片描述在这里插入图片描述
同时会把所有的疑似下线节点,通过gossip协议发布出去:
在这里插入图片描述

再回到redis源码之:集群创建与节点通信(2)看看在处理gossip节点时,如何标记下线在这里插入图片描述

因此下线是有个先对某个节点记录疑似下线,最后收集其他主节点的下线报告,超过半数认为该节点下线,才真正标记该几点下线。

二、clusterCron定时任务故障处理

在这里插入图片描述

clusterCron首先会收集孤立主节点,以备后续的从节点迁移,并且对cluster->nodes中的每个节点检测ping和pong的延迟时间,并在超时情况下会尝试重ping,并对超时的节点,标记疑似下线。最后,当本方节点是个slave时,会检查自身主从复制的偏移量,并通过clusterHandleSlaveFailover处理尝试处理故障转移,竞争成为新的master:
在这里插入图片描述
在这里插入图片描述

redis cluster中的每个node的主从选举,是个变形的raft,它不是直接在node本身的主从集群里发起选举,而是在cluster集群里,通过cluster中其他的node的主节点对当前node投票,超过半数以上的其他主节点确认,当前节点才能成为本主从集群的主节点。这里区分下主从集群和cluster集群。clusterRequestFailoverAuth()会向集群所有的节点发消息,不管是主节点还是从节点,但只有主节点会回应

clusterHandleSlaveFailover方法时会多次进入的,而且每个阶段进入执行的部分不一样,需要仔细区分

笔误:在上面的图解中,在设置clusterDoBeforeSleep状态后,写的cron时执行clusterbeforesleep,其实不是在执行main()->aeMain()->aeProcessEvents()->eventLoop->beforesleep()->beforeSleep()->if (server.cluster_enabled) clusterBeforeSleep();这个流程在后面第五章节还会涉及到。

接下来,看看主节点收到投票请求后如何回复投票:

三、主节点投票
其他的主节点收到投票请求后,通过epoll读事件处理,最终进入clusterReadHandler->clusterProcessPacket->clusterSendFailoverAuthIfNeeded(sender,hdr);
在这里插入图片描述
在这里插入图片描述

四、收集投票处理
再回到发送投票请求的slave节点,看接收到failover_auth_ack响应后如何处理,同样接收响应也是通过epoll读事件处理,进入clusterReadHandler->clusterProcessPacket在这里插入图片描述

五、执行故障切换
当main()->aeMain()->aeProcessEvents()->eventLoop->beforesleep()->beforeSleep()->`if (server.cluster_enabled) clusterBeforeSleep();不断遍历执行的时候,failover_auth_count也在不断增加,并可能超过半数主节点数:
在这里插入图片描述
此时再次进入到clusterHandleSlaveFailover():

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1438161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea设置terminal为git

要在IntelliJ IDEA中设置终端为Git Bash,请按照以下步骤操作: 打开 Settings(设置)。点击 Tools(工具)选项卡。进入 Terminal(终端)界面。在 Shell Path 下选择 Browse(…

MCU+SFU视频会议一体化,视频监控,指挥调度(AR远程协助)媒体中心解决方案。

视频互动应用已经是政务和协同办公必备系统,早期的分模块,分散的视频应该不能满足业务需要,需要把视频监控,会议,录存一体把视频资源整合起来,根据客户需求,需要能够多方视频互动,直…

机器学习-线性回归法

线性回归算法 解决回归问题思想简单,实现容易许多强大的非线性模型的基础结果具有很好的可解释性蕴含机器学习中的很多重要思想 样本特征只有一个,称为:简单线性回归 通过分析问题,确定问题的损失函数或者效用函数 通过最优化…

相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

【漏洞复现】电信网关配置管理系统SQL注入漏洞

Nx01 产品简介 电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远程监控、配置、升级和故障排除等功能,从而确保网络的正常运行和高效性能。 Nx02 漏洞描述 电信网关配置管理系统存在SQL注入漏洞,攻…

Android CMakeLists.txt语法详解

一.CMake简介 你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MSnmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的…

CV | Medical-SAM-Adapter论文详解及项目实现

******************************* 👩‍⚕️ 医学影像相关直达👨‍⚕️******************************* CV | SAM在医学影像上的模型调研【20240207更新版】-CSDN博客 CV | Segment Anything论文详解及代码实现 本文主要讲解Medical-SAM-Adapter论文及项…

兼容ARM 32位架构的edgeConnector产品为用户提供新的部署选项

Softing工业将ARM 32位兼容性集成到了edgeConnector产品中,以满足用户对ARM处理器的边缘设备日益增长的使用需求。 (兼容ARM 32位架构的edgeConnector产品扩展了其应用部署范围) 用户对采用ARM处理器的紧凑型边缘设备的需求正在大幅增长&…

LC 2641. 二叉树的堂兄弟节点 II

2641. 二叉树的堂兄弟节点 II 难度 : 中等 题目: 给你一棵二叉树的根 root ,请你将每个节点的值替换成该节点的所有 堂兄弟节点值的和 。 如果两个节点在树中有相同的深度且它们的父节点不同,那么它们互为 堂兄弟 。 请你返回修改值之后,…

【动态规划】【子序列除重】【C++算法】1987不同的好子序列数目

作者推荐 【动态规划】【状态压缩】【2次选择】【广度搜索】1494. 并行课程 II 本文涉及知识点 动态规划汇总 LeetCode1987:不同的好子序列数目 给你一个二进制字符串 binary 。 binary 的一个 子序列 如果是 非空 的且没有 前导 0 (除非数字是 “0” 本身&…

Hgame week1 web

1.Bypass it 不准注册,禁用一下js成功注册登录拿到flag 2.ezHTTP 跟着提示走就行 jwt解析一下 3.点击选课发包时候显示已满 一直发包就会选上 每个都一直发包最后就可以全选课成功 后来得知是后天每隔一段时间会放出一些课,一直发包就能在放课的时候选到…

【网站项目】035家居商城系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

使用 git 上传文件时,运行 命令 git pull origin 时未成功,出现报错信息

项目场景: 背景: 使用 git 上传文件时,运行 命令 git pull origin 时未成功,出现报错信息 问题描述 问题: $ git pull origin print --allow-unrelated-histories error: Pulling is not possible because you hav…

从零开始手写mmo游戏从框架到爆炸(六)— 消息处理工厂

就好像门牌号一样,我们需要把消息路由到对应的楼栋和楼层,总不能像菜鸟一样让大家都来自己找数据吧。 首先这里我们参考了rabbitmq中的topic与tag模型,topic对应类,tag对应方法。 新增一个模块,专门记录路由eternity-…

IS-IS P2P网路类型 地址不在同一子网建立邻居关系

拓扑图 由于IS-IS是直接运行在数据链路层上的协议,并且最早设计是给CLNP使用的,IS-IS邻居关系的形成与IP地址无关。但在实际的实现中,由于只在IP上运行IS-IS,所以是要检查对方的IP地址的。如果接口配置了从IP,那么只要…

使用navicat导出mysql离线数据后,再导入doris的方案

一、背景 doris本身是支持直接从mysql中同步数据的,但有时候,客户不允许我们使用doris直连mysql,此时就需要客户配合将mysql中的数据手工导出成离线文件,我们再导入到doris中 二、环境 doris 1.2 三、方案 doris支持多种导入…

万万没想到,又被问ThreadLocal了

我待ThreadLocal如初恋,ThreadLocal虐我千百遍。但这一次,要彻底搞懂ThreadLocal 回顾一下面试名场面: 面试官:Handler如何做到与线程绑定的? 我:每个Handler只有一个相关联的Looper,线程绑定…

【MySQL进阶之路】SpringBoot 底层如何去和 MySQL 交互了呢?

SpringBoot 底层如何去和 MySQL 交互了呢? 我们在写做 Java 项目时,一般都是引入 MyBatis 框架来和 MySQL 数据库交互,如果需要在 MySQL 上执行什么语句,只需要在 Mapper.xml 文件中定义对应的 SQL 语句即可 那么他底层到底是如…

学习Android的第六天

目录 Android TextView 文本框 TextView 基础属性 范例 带阴影的TextView 范例 带边框的TextView 范例 带图片(drawableXxx)的TextView 范例1 范例2 使用autoLink属性识别链接类型 范例 TextView 显示简单的 HTML 范例1 范例2 SpannableString & Spannable…

Git合并多个commit

git rebase -i commitId 假设想要合并最后3个commit, git log显示 commit id 1 commit id 2 commit id 3 commit id 4 则执行git rebase -i commitId4. 注意是4,不是3. 然后,pick最老的commit (commit id 3). https://blog.csdn.net/qiao…