redis cluster源码研究--failover

Redis cluster 从库自动failover需要两轮投票的分析 从库自动failover,有三种情况 1.由存活的主节点判断挂掉的主节点为客观下线(fail),即其他主节点抢先收集够了pfail数,然后广播fail信息到从库,从库clusterCron检查到挂掉主库的fail并发起投票时,其他主节点会正常投票 从库的日志是: 76803:S 09 Jun 12:21:09.240 * FAIL message received from bb7664a96fc83d3f31c2649ec37894a4944ed38b about 64cdc10096644b5bc362 阅读详情

    failover是redis cluster的容错机制,是redis cluster最核心功能之一;它允许在某些节点失效情况下,集群还能正常提供服务。

    redis cluster采用主从架构,任何时候只有主节点提供服务,从节点进行热备份,故其容错机制是主从切换机制,即主节点失效后,选取一个从节点作为新的主节点。在实现上也复用了旧版本的主从同步机制。

    从纵向看,redis cluster是一层架构,节点分为主节点和从节点。从节点挂掉或失效,不需要进行failover,redis cluster能正常提供服务;主节点挂掉或失效需要进行failover。另外,redis cluster还支持manual failover,即人工进行failover,将从节点变为主节点,即使主节点还活着。下面将介绍这两种类型的failover。


一、主节点失效产生的failover

1、(主)节点失效检测 

     一般地,集群中的节点会向其他节点发送PING数据包,同时也总是应答(accept)来自集群连接端口的连接请求,并对接收到的PING数据包进行回复。 

当一个节点向另一个节点发PING命令,但是目标节点未能在给定的时限(node timeout)内回复时,那么发送命令的节点会将目标节点标记为PFAIL(possible failure)。 

由于节点间的交互总是伴随着信息传播的功能,此时每次当节点对其他节点发送 PING 命令的时候,就会告知目标节点此时集群中已经被标记为PFAIL或者FAIL标记的节点。 

相应的,当节点接收到其他节点发来的信息时, 它会记下那些被其他节点标记为失效的节点。 这称为失效报告(failure report)。 

如果节点已经将某个节点标记为PFAIL,并且根据节点所收到的失效报告显式,集群中的大部分其他主节点(n/2+1)也认为那个节点进入了失效状态,那么节点会将那个PFAIL节点的状态标记为FAIL。 

      一旦某个节点被标记为FAIL,关于这个节点已失效的信息就会被广播到整个集群,所有接收到这条信息的节点都会将失效节点标记为FAIL。

2、选举主节点

     一旦某个主节点进入 FAIL 状态, 集群变为FAIL状态,同时会触发failover。failover的目的是从从节点中选举出新的主节点,使得集群恢复正常继续提供服务。

    整个主节点选举的过程可分为申请、授权、升级、同步四个阶段: 

(1)申请 

    新的主节点由原已失效的主节点属下的所有从节点中自行选举产生,从节点的选举遵循以下条件: 

a、这个节点是已下线主节点的从节点; 

b、已下线主节点负责处理的哈希槽数量非空;

c、主从节点之间的复制连接的断线时长有限,不超过 ( (node-timeout * slave-validity-factor) + repl-ping-slave-period )。

    如果一个从节点满足了以上的所有条件,那么这个从节点将向集群中的其他主节点发送授权请求,询问它们是否允许自己升级为新的主节点。

   从节点发送授权请求的时机会根据各从节点与主节点的数据偏差来进行排序,让偏差小的从节点优先发起授权请求。

(2)授权 

   其他主节点会遵信以下三点标准来进行判断: 

a、 发送授权请求的是从节点,而且它所属的主节点处于FAIL状态 ;

b、 从节点的currentEpoch〉自身的currentEpoch,从节点的configEpoch>=自身保存的该从节点的configEpoch;

c、 这个从节点处于正常的运行状态,没有被标记为FAIL或PFAIL状态;

   如果发送授权请求的从节点满足以上标准,那么主节点将同意从节点的升级要求,向从节点返回CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK授权。

(3)升级 

    一旦某个从节点在给定的时限内得到大部分主节点(n/2+1)的授权,它就会接管所有由已下线主节点负责处理的哈希槽,并主动向其他节点发送一个PONG数据包,包含以下内容: 

a、 告知其他节点自己现在是主节点了 

b、 告知其他节点自己是一个ROMOTED SLAVE,即已升级的从节点;

c、告知其他节点都根据自己新的节点属性信息对配置进行相应的更新 

(4)同步   

    其他节点在接收到ROMOTED SLAVE的告知后,会根据新的主节点对配置进行相应的更新。特别地,其他从节点会将新的主节点设为自己的主节点,从而与新的主节

点进行数据同步。

    至此,failover结束,集群恢复正常状态。

    此时,如果原主节点恢复正常,但由于其的configEpoch小于其他节点保存的configEpoch(failover了产生较大的configEpoch),故其配置会被更新为最新配置,并将自己设新主节点的从节点。

    另外,在failover过程中,如果原主节点恢复正常,failover中止,不会产生新的主节点。


二、Manual Failover

    Manual Failover是一种运维功能,允许手动设置从节点为新的主节点,即使主节点还活着。

    Manual Failover与上面介绍的Failover流程大都相同,除了下面两点不同:

   (1)触发机制不同,Manual Failover是通过客户端发送cluster failover触发,而且发送对象只能是从节点;

   (2)申请条件不同,Manual Failover不需要主节点失效,failover有效时长固定为5秒,而且只有收到命令的从节点才会发起申请。

     另外,Manual Failover分force和非force,区别在于:非force需要等从节点完全同步完主节点的数据后才进行failover,保证不丢失数据,在这过程中,原主节点停止写操作;而force不进行进行数据完整同步,直接进行failover。

    

三、集群状态检测

     集群有OK和FAIL两种状态,可以通过CLUSTER INFO命令查看。当集群发生配置变化时, 集群中的每个节点都会对它所知道的节点进行扫描,只要集群中至少有一个哈希槽不可用(即负责该哈希槽的主节点失效),集群就会进入FAIL状态,停止处理任何命令。 

    另外,当大部分主节点都进入PFAIL状态时,集群也会进入FAIL状态。这是因为要将一个节点从PFAIL状态改变为FAIL状态,必须要有大部分主节点(n/2+1)认可,当集群中的大部分主节点都进入PFAIL时,单凭少数节点是没有办法将一个节点标记为FAIL状态的。 然而集群中的大部分主节点(n/2+1)进入了下线状态,让集群变为FAIL,是为了防止少数存着主节点继续处理用户请求,这解决了出现网络分区时,一个可能被两个主节点负责的哈希槽,同时被用户进行读写操作(通过禁掉其中少数派读写操作,证保只有一个读写操作),造成数据丢失数据问题。


说明:上面n/2+1的n是指集群里有负责哈希槽的主节点个数。    

Redis cluster 从库自动failover机制 目录 一、每个节点维护的信息 二、故障发现(主观下线) 三、客观下线 1.下线报告链表 2.pfail到fail的转变 四、从库通过clusterCron发起自动切换 五、主库投票 六、从库执行切换 七、纪元更新 一、每个节点维护的信息 每个节点内的clusterState结构保存集群信息,从库自身视角所维护的一些信息。结构关键属性如下: 在cluster.h文件中: typedef struct clusterState { clusterNode *myself; . 阅读详情

相关推荐

Redis cluster 基于从库自动failover两轮投票的源码修改

目录 一、修改源码 二、测试环境 三、测试结果 可以通过从库广播避免二轮投票 四、切换过程 五、各节点完整日志 一、修改源码 通过前面分析,从库自动failover需要两轮投票的根本原因是,从库认为主库客观下线时,并不广播,无法通知负责投票的存活主库也修改挂掉主库的flgas。各个节点为一个主库所维护的clusterNode->flags是相互独立的。 本文测试目的,是通过修改源码,在从库认为主库客观下线时,也将fail信息广播给其他节点,正常网络情况下可以认为其他节点可以同时收到广

灯火觅阑珊 978

深入理解redis cluster的failover机制

社区版redis cluster是无中心节点P2P的集群架构,内部采用gossip协议传递维护集群的拓扑结构和集群元数据。社区文档地址:https://redis.io/topics/cluster-tutorial failover是redis cluster提供的容错机制,cluster最核心的功能之一。failover支持两种模式: ...

weixin_34366546的博客 5378

redis cluster集群的源码分析(1)

对于cluster.c的源码分析,我将会分两部分介绍。本文主要分析集群通信和通信故障。 先大致归纳下cluster的主要函数 void clusterCron(void);//集群的定时任务 int clusterProcessPacket(clusterLink *link);//消息处理中心 void clusterProcessGossipSection(clusterMsg *hdr...

wade1991的专栏 3993

RedisCluster集群FailOver的几个命令的区别

RedisCluster的故障转移,也就是FailOver分为两大类: 第一类:自动FailOver 集群状态下,Master发生Down的情况了,集群自动的选举,调整,成为一个新的完整的集群状态。 第二类:手动FailOver 我们手动的发送命令给集群,而且只能发送命令给集群中的Slave,迫使集群中这个Slave的Master发生故障转移。 此文,我们关心的就是,手动FailOver的三种情况...

2457

2021-06-29 redis-cluster集群failover的处理

摘要: 在paxos和raft一致性协议中, 选举是分多轮次进行。当本轮选举未达成一致时, 则进行下轮选举。 redis的cluster集群未使用多轮 进行,本文讨论redis的设计。 核心代码: /* It is possible that we received more updated offsets from other * slaves for the same master since we computed our election delay. *

悟世之路 681

PowerBI参数化实战:3分钟搞定动态数据源切换(附常见错误排查)

本文详细介绍了PowerBI参数化实战技巧,教你3分钟实现动态数据源切换。通过创建参数、改造查询和测试切换三步,轻松应对多环境部署与团队协作中的路径问题,并附上常见错误排查指南,有效提升报表的可维护性和工作效率。

p1q2r的博客 585

Redis Cluster故障切换(Failover)机制详解:从源码角度看gh_mirrors/re/Reading-and-comprehense-redis-cluster的实现

Redis Cluster作为分布式NoSQL数据库的核心组件,其高可用机制中的故障切换(Failover)功能是保障系统稳定性的关键。本文将深入解析Redis Cluster如何通过自动故障检测、主从选举和槽位迁移实现无缝故障切换,结合gh_mirrors/re/Reading-and-comprehense-redis-cluster项目的中文注释源码,为新手开发者提供清晰易懂的技术指南。

gitblog_00373的博客 385

ROS2仿真抓取分拣案例,使用myCobot 280机械臂结合ROS2系统搭建机械分拣站

本案例展示了如何利用myCobot 280 urdf模型构建一个对象分类站,并在ROS2 jazzy中完成运动规划。

m0_71627844的博客 2125

终极指南:如何通过gh_mirrors/re/Reading-and-comprehense-redis-cluster轻松理解Redis Cluster工作原理

gh_mirrors/re/Reading-and-comprehense-redis-cluster是一个专注于Redis Cluster源码分析的开源项目,提供了分布式NOSQL Redis源码的中文注释和详细分析,涵盖集群功能、节点扩容、槽位迁移、故障切换等核心机制,是理解Redis Cluster工作原理的绝佳学习资源。 ## 为什么选择这个Redis Cluster学习项目? 对于R

gitblog_00074的博客 936

网络虚拟化介绍(OVS、DVS)

网络虚拟化概念网络虚拟化就是把网络层的一些功能从硬件中剥离出来,建立新的网络虚拟层;该虚拟层可以接管网络服务和配置,实现网络服务与物理层的解耦,打破物理资源限制;通过网络虚拟层能够在一个物理网络上模拟出多个逻辑网络,并且多用户在逻辑网络上相互隔离,保证网络安全网络虚拟化的特点隔离性:不同租户的流量相互之间不能互访;但是IP/MAC地址都可以独立规划可移动性:虚拟机可以跨二层/三层迁移,甚至可以跨广域网迁移(迁移前后虚拟机Vlan和IP地址都不会发生变化)可扩展性:逻辑网络的规模和数量可扩展。

m0_49864110的博客 1万+

gem5 prefetcher

最近在gem5上做预取实验,添加自己的预取算法,这里采用hardware stream prefetcher , 修改了几个bug才给实验调试通过,发文记录下实验过程。 gem5上添加自己的预取算法步骤: (1)路径gem5-master/configs/common/Caches.py下,开启预取:class L1Cache(Cache): assoc = 2 tag_late

编程邦 3843

Redis Cluster节点通信协议解密:基于gh_mirrors/re/Reading-and-comprehense-redis-cluster的源码注释

Redis Cluster作为分布式NoSQL数据库的核心组件,其节点间的通信机制是保证集群稳定性和数据一致性的关键。本文将深入解析Redis Cluster节点通信协议的底层实现,基于**gh_mirrors/re/Reading-and-comprehense-redis-cluster**项目的中文注释源码,帮助开发者快速理解集群节点如何交换信息、协同工作。 ## 一、节点通信的核心数据结

gitblog_00454的博客 1037

实战分享:如何用Java调用Doris FE接口实现高效Stream Load数据导入(附完整代码)

本文详细介绍了如何通过Java调用Doris FE接口实现高效的Stream Load数据导入,包含完整代码示例和性能优化技巧。Stream Load作为Doris的高效数据导入方式,相比传统JDBC提升5-10倍速度,适用于大规模数据处理场景,帮助开发者解决高吞吐量数据导入挑战。

weixin_29304985的博客 416

redis 集群 failover 源码分析

failover 以后都在 github 更新,请戳 redis 集群->failover contents 需要提前了解的知识 PFAIL FAIL ELECT 需要提前了解的知识 cluster->reshard cluster->gossip prerequisites->cluster 中展示了示例集群的配置 如果我们增加一个新的节点 127.0.0.1:7...

zpoint's blog 667

2026 AI Agent Harness Engineering 生态报告:开源工具链的现状与未来趋势

IEEE P2863-2025《通用人工智能自主代理技术架构与评估规范》于2025年11月正式发布,将AI Agent(通用人工智能自主代理)定义为:一种具备感知(Perception)、记忆(Memory)、推理(Reasoning)、规划(Planning)、行动(Action)五大核心能力闭环,能够在无显式指令覆盖全部环节的前提下,自主完成特定领域或开放领域复杂任务的智能实体。

AI 算法实战派 496

1、动作捕捉技术:概述与历史

本博文全面介绍了动作捕捉技术的概念、历史演变、类型分类以及完整的工作流程。从早期的连续摄影技术到现代数字动作捕捉系统,文章深入探讨了光学、磁性和机械动作捕捉系统的优缺点及适用场景,并详细解析了动作捕捉数据的生成原理与数学基础。此外,还涵盖了特殊部位如手部、面部和木偶的动作捕捉方法,并讨论了动作捕捉在动画制作、虚拟现实、医疗康复等领域的广泛应用与发展前景。

apple5的专栏 218

Redis源码解析(21) 集群[4] 故障转移failover与slave迁移

文章目录引言failoverCLUSTER FAILOVERCLUSTERMSG_TYPE_MFSTARTCLUSTERMSG_FLAG0_PAUSEDslave迁移 引言 在redis集群中一般来说我们需要给每个负责至少一个槽位的主节点都配置从节点,因为主节点加入出现某些不可控情况宕机,它的槽上数据就没办法转移了,也就是说这几个槽现在是没有人负责的,这是整个集群就处于下线状态了.所以redis...

李兆龙的博客 2015

ChatTutor:让AI老师“会写会画”,打造可视化、互动式智能教育新范式

ChatTutor是一款突破性的开源AI教学助手,通过可视化电子白板实现"边讲边写"的沉浸式教学体验。该项目支持数学公式手写输入、动态函数绘图、自动生成思维导图等功能,采用多智能体架构实现专业协同。未来将扩展至编程、物理等STEM教育领域,适用于学生自学、教师备课和教育平台集成。作为MIT协议开源项目,ChatTutor通过赋予AI"教学肢体语言",推动教育从信息传递转向可视化互动建构,重新定义了AI助教的可能性。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 420

解决Redis源码中文注释乱码难题:gh_mirrors/re/Reading-and-comprehense-redis-cluster项目Source Insight配置教程

gh_mirrors/re/Reading-and-comprehense-redis-cluster是一个专注于Redis集群源码中文分析的项目,提供了详尽的注释和流程调用说明,特别解决了Source Insight中文注释乱码问题,帮助开发者更轻松地理解Redis集群的核心功能。 ## 为什么会出现中文注释乱码? 在阅读Redis源码时,中文注释乱码是开发者常遇到的问题。这通常是由于Sou

gitblog_00416的博客 234

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

从0到1理解Redis Cluster:gh_mirrors/re/Reading-and-comprehense-redis-cluster项目中的核心组件解析

Redis Cluster是Redis提供的分布式解决方案,能够实现数据分片、高可用和故障自动转移。而gh_mirrors/re/Reading-and-comprehense-redis-cluster项目则为我们深入理解Redis Cluster的内部机制提供了极大的便利,该项目包含了Redis 3.0版本的源码,并带有详尽的中文注释以及相关流程调用注释,对理解Redis源码很有帮助。 ##

gitblog_00759的博客 267

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Kumo-Relational商用必看:OpenMDW 1.1许可证与BSD第三方声明完整解读

Kumo-Relational 是 NVIDIA 发布的预训练结构化数据基础模型,用于跨关联表的分类与回归任务(上下文学习 in-context learning)。在商用之前,你只需要弄清两件事:它自身的权重受 **OpenMDW 1.1 许可证** 保护,而它微调所基于的 TabICLv2 权重则采用 **BSD-3-Clause** 许可证。本文带你逐条读完这两个许可证文件,给出商用合规清单

gitblog_01029的博客 403

初学者必看:gh_mirrors/re/Reading-and-comprehense-redis-cluster项目结构与阅读方法

gh_mirrors/re/Reading-and-comprehense-redis-cluster是一个专注于Redis集群源码分析的学习项目,提供了详尽的中文注释和流程调用说明,特别适合想要深入理解Redis集群功能、节点扩容、槽位迁移、故障切换及一致性选举机制的开发者。 ## 📂 项目核心结构解析 ### 1. 源码主目录:redis-3.0/ 这是项目的核心区域,包含Redis 3

gitblog_00928的博客 315

gh_mirrors/re/Reading-and-comprehense-redis-cluster:Redis集群源码中文注释版深度解析,从入门到精通

Redis作为高性能的分布式NoSQL数据库,其集群功能是构建大规模应用的核心组件。**gh_mirrors/re/Reading-and-comprehense-redis-cluster**项目提供了带详尽中文注释的Redis集群源码,涵盖节点扩容、槽位迁移、故障切换等关键流程,是开发者深入理解Redis内部机制的终极学习资源。 ## 📚 项目核心价值:让Redis源码不再晦涩 对于新手

gitblog_00082的博客 546

【Redis源码】集群之分布式cluster原理(十四)

前言: 接着上一章开始讲,上一章我们讲到如果配置一个cluster,以及cluster的基础命令。以及初始化一个cluster的流程。本章继续讲一些cluster原理。 版本:redis4.0.0 (一)消息结构 1.1 数据包类型 以下是数据包的类型: #define CLUSTERMSG_TYPE_PING 0 /* Ping包类型 */ #define CLUSTERMS...

c-rain 648

深入解析redis cluster gossip机制

社区版redis cluster是一个P2P无中心节点的集群架构,依靠gossip协议传播协同自动化修复集群的状态。本文将深入redis cluster gossip协议的细节,剖析redis cluster gossip协议机制如何运转。协议解析cluster gossip协议定义在在ClusterMsg这个结构中,源码如下: typedefstruct{ charsig[4]; ...

xiaoyaGrace的博客 429

Redis Cluster源码中的设计模式:gh_mirrors/re/Reading-and-comprehense-redis-cluster项目带你领略分布式系统架构之美

Redis Cluster作为分布式NoSQL数据库的经典实现,其源码中蕴含了丰富的设计模式与架构思想。gh_mirrors/re/Reading-and-comprehense-redis-cluster项目通过详尽的中文注释和流程分析,为开发者打开了深入理解Redis Cluster核心机制的大门。本文将带你探索Redis Cluster源码中的关键设计模式,揭示分布式系统的架构之美。 ##

gitblog_00796的博客 261
上一篇: redis cluster--简介
下一篇: redis cluster源码研究--配置一致性保证
whycold
博客等级 码龄19年 280粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值