Redis 7.x 系列【29】集群原理之自动故障转移

news2024/11/15 12:34:02

有道无术,术尚可求,有术无道,止于术。

本系列Redis 版本 7.2.5

源码地址:https://gitee.com/pearl-organization/study-redis-demo

文章目录

    • 1. 概述
    • 2. 案例演示
    • 3. 工作原理
      • 3.1 故障检测
      • 3.2 排名
      • 3.3 延迟等待
      • 3.4 投票
      • 3.5 上位

1. 概述

官方文档

Redis 集群的某些节点出现故障时,可以自动进行故障转移,地将从节点提升为主节点,保证服务的连续性和数据的可用性。

也可以手动进行故障转移,会在集群命令篇进行讲解

2. 案例演示

当前环境中,有一个三主三从的 Redis 集群(一台机器部署),主从节点的对应关系如下:

主节点从节点
192.168.56.101:6379192.168.56.101:6382
192.168.56.101:6380192.168.56.101:6383
192.168.56.101:6381192.168.56.101:6390

192.168.56.101:6379 节点上,使用 cluster nodes 命令可以看到,当前是一个主节点:

主节点(192.168.56.101:6379)>cluster nodes
724c7b874dc0c37a462cd5ab59325203344f8008 192.168.56.101:6379@16379 myself,master - 0 1720733735000 1 connected 0-5460

直接使用 kill 命令关闭 192.168.56.101:6379 节点:

[root@localhost bin]# ps -ef | grep  redis
root      2586     1  1 7月11 ?       00:07:00 ./redis-server *:6379 [cluster]
root      7921  7683  0 06:01 pts/2    00:00:00 grep --color=auto redis
[root@localhost bin]# kill -9 2586

立即查看节点信息,可以看到 192.168.56.101:6379 节点被标记为失败状态,之前对应的从节点 192.168.56.101:6382 自动升级为主节点:
在这里插入图片描述
192.168.56.101:6379 节点再次上线后,可以看到变成了从节点:
在这里插入图片描述

3. 工作原理

集群中所有节点,都会包含一下两个 Epoch 信息,并在心跳数据包中进行传播,类似于 Raft 中的 term ,用于解决节点信息、配置的冲突问题。

这里简要概括下,具体在官方文档有详细说明:

  • Current Epoch:当多个节点提供相互冲突的信息时,用于够判断出哪个状态是最新的,值越高越新
  • Config Epoch :翻译为配置时期、配置版本,它主要用于解决节点间配置冲突和确保配置的一致性,值越高越新

3.1 故障检测

Redis Cluster 会通过心跳检测迅速感知到节点故障,并且在节点故障时自动进行恢复,以确保数据在集群中的可用性。当心跳检测到节点不能被大多数节点访问时,会通过提升从节点为主节点来自动修复,当从节点无法升级时,集群将进入错误状态,停止接收客户端的查询操作。

每个集群节点内部都维护一个与其他已知节点相关的标记映射表,用于进行故障检测和状态管理。
在这里插入图片描述

在故障检测中,使用了两个标记:

  • PFAILPossibly FAILed):可能的故障,是一种未确认的故障类型,类似于哨兵中的主观下线
  • FAIL:真正的故障,由集群中大多数主节点确认,类似于哨兵中的客观下线

当一个节点在超过 NODE_TIMEOUT (默认为 15 秒)时间后仍然无法访问时,该节点会将另一个节点标记为 PFAIL。 检测到其他节点为 PFAIL 状态的信息首先会保存在本地,然后通过 Gossip 发送到其他所有节点,最终,每个节点,都会收到某个节点的 PFAIL 标记。

PFAIL 标记并不足以触发从节点的提升,需要升级为 FAIL 状态。例如, B 宕机后,整个状态升级过程如下:

  • AB 节点发送 Ping 后, 在 15 秒后还没有返回响应,则将 B 标记为 PFAIL ,并存储在本地信息文件中。
  • 其他节点也检测到 B 的状态,并在本地标记为 PFAIL
  • A 节点通过 Gossip 获取到其他节点关于 B 节点的 PFAIL 状态
  • NODE_TIMEOUT * FAIL_REPORT_VALIDITY_MULT (超时时间 * 有效性因子)时间内,比如有效性因子设置为 2 ,那么在 30 秒内,大多数主节点都标记了 B 节点为 PFAIL 状态,A 节点会将 B 升级为 FAIL 状态
  • A 向所有节点发送 B 已经 FAIL 的信息,其他节点收到消息后,也将 B 更新为 FAIL

FAIL 状态可以在以下情况下被清除:

  • 节点已经可达且是从节点,因为从节点不会被故障转移。
  • 节点已经可达且是主节点,但是没有分配哈希槽,因为没有槽位的主节点实际上并不参与集群,并正在等待被配置以加入集群。

3.2 排名

当主节点发生故障时,从节点会交换消息建立排名,拥有最新复制偏移量的复制节点排名为 0 ,第二新的排名为 1 ,依此类推,最新的从节点会优先尝试选举。

排名顺序并不是严格执行的(尽力而为),如果排名较高的从节点未能当选,其他从节点将很快尝试选举。

3.3 延迟等待

一旦主节点进入 FAIL 状态,从节点会在尝试选举之前等待一段短暂的时间。确保 FAIL 状态在整个集群中传播,否则某个主节点不知道其他节点的 FAIL 状态,会拒绝投票。

延迟等待时间的计算公式如下:

DELAY = 500 毫秒 + 0到500毫秒之间的随机延迟 + REPLICA_RANK * 1000毫秒

公式各部分说明如下:

  • 随机延迟:用于使从节点的选举时间不同步,以免它们同时开始选举。
  • REPLICA_RANK:从节点在处理来自主节点的复制数据量方面的排名

3.4 投票

从节点的选举和晋升由从节点处理,并通过主节点的投票来支持从节点的升级。

从节点在满足以下条件时才会启动选举:

  • 对应的主节点处于 FAIL 状态
  • 主节点分配了可服务的哈希槽
  • 与主节点的复制连接断开的时间不超过一定的时长,以确保升级后从节点数据是相对较新的

从节点通过向集群中的每个主节点广播一个 FAILOVER_AUTH_REQUEST 数据包来请求投票,超时时间为 NODE_TIMEOUT 时间的两倍(最少 2 秒)。

主节点投票后,会通过 FAILOVER_AUTH_ACK 进行回复,并在接下来 NODE_TIMEOUT * 2 的时间内,不能为同一主节点的其他从节点投票。

3.5 上位

当某个从节点收到了大多数主节点的 ACK 回复,说明赢得了选举。如果在两倍 NODE_TIMEOUT 的时间内未达到多数,选举将被中止,然后将在 NODE_TIMEOUT * 4 后再次尝试。

赢得选举后,从节点将获得一个新的唯一递增的 configEpoch ,该值高于任何现有主节点的 configEpoch ,并通过 Ping 广播到集群中的所有节点,告知自己是主节点,并携带自己分配的哈希槽信息。

对于广播不可达的节点,还会通过心跳机制,传播到其他节点,收到消息后,发现 configEpoch 最高,所以也会及时更新本地信息。

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

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

相关文章

LeetCode:对称的二叉树(C语言)

1、问题概述:给一个二叉树,看是否按轴对称 2、示例 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 3、分析 (1&a…

MATLAB和Python零模型社会生物生成式结构化图

🎯要点🎯要点🎯启发式方法无标度和前馈拓扑的网络编码🎯随机遗传模型使用布线规则🎯随机遗传算法测试连接组模型🎯确定性地生成分支树和分层网络,同质偏好规则的联系🎯生成随机网络节…

无涯·问知财报解读,辅助更加明智的决策

财报解读就像是给公司做一次全面的体检,是理解公司内部运作机制和市场表现的一把钥匙,能够有效帮助投资者、分析师、管理层以及所有市场参与者判断一家公司的健康程度和发展潜力。 星环科技无涯问知的财经库内置了企业年报及财经类信息,并对…

GateWay网关微服务定位和理论知识

微服务架构的网关在哪里? 概念 SPring Cloud Gateway组件的核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器,隐藏…

linux离线安装mysql8(单机版)

文章目录 一、检查服务器是否有残留mysql资源,有的话就全删除1.1、查询mysql已安装的相关依赖:1.2、查找含有MySQL的目录 二、安装2.1、上传mysql安装包到文件夹下并解压2.2、移动及重命名2.3、mysql用户2.4、配置mysql所需的my.cnf文件2.5、给my.cnf配置…

基于单片机控制的红外热释电家庭防盗报警器硬件系统设计

【摘要】 随着社会的发展和人们安全意识的提高,传统的家庭防盗系统不能适应现代生活中多变的环境。本文设计开发的红外热释电家庭防盗报警器能改善传统防盗系统结构复杂,计算繁琐、价格昂贵、监控盲区等缺陷,主要由单片机模块、复位电路模块、…

pycharm+pytorch2.3.1安装

成功运行 Anaconda简介 Anaconda 就是可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包及其依赖项。 Anaconda安装 去官网地址下载 Download Anaconda Distribution | Anaconda​www.ana…

<数据集>棉花叶片病害识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:5837张 标注数量(xml文件个数):5837 标注数量(txt文件个数):5837 标注类别数:4 标注类别名称:[Bacterial Blight, Curl virus, Fussarium wilt, Healthy] 序号类别名…

springboot3-web-questions-分析

系列文章目录 文章目录 目录 系列文章目录 文章目录 前言 一、问题案例 1、maven项目compile时候出现告警warn 2、java文件打包然后在命令行中运行java会找不到主类 3、程序找不到数据库驱动和配置实例 4、springboot和mybatis-plus版本不兼容导致 5、springboot项目启动的解释…

docker 续 常用命令

ubuntu里的仓库文件使用不了的解决方法: 1.进入仓库文件的目录 cd /etc/apt/sources.list.d/ 2.删除 archive开头的文件 sudo rm -rf archive* 3.重新下载仓库文件 sudo add-apt-repository "deb [archamd64] https://mirrors.ustc.edu.cn/docker-ce/lin…

学术研讨 | 基于区块链的隐私计算与数据可信流通研讨会顺利召开

近日,由国家区块链技术创新中心组织的“基于区块链的隐私计算与数据可信流通研讨会”顺利召开,会议邀请了来自全国高校和科研院所的相关领域专家,围绕基于区块链与隐私计算技术的应用需求、研究现状、发展趋势、重点研究方向与研究进展等内容…

【相机与图像】1. 相机模型的介绍:内参、外参、畸变参数

想着整理下相机模型(内容上参考 slam十四讲)、相机的内外参标定。方便自己的使用和回顾。 不过,内外参标定啥时候记录随缘 -_- 概述 【构建相机模型】 相机将三位世界中的坐标点(单位为米)映射到二维图像平面&#xff…

【LeetCode】71.简化路径

1. 题目 2. 分析 3. 代码 我写了一版很复杂的代码&#xff1a; class Solution:def simplifyPath(self, path: str) -> str:operator [] # 操作符的栈dir_name [] # 文件名的栈idx 0cur_dir_name ""while(idx < len(path)):if path[idx] /:operator.ap…

MT6775(Helio P70)处理器规格参数_MTK联发科平台方案

联发科MT6775(Helio P70)采用台积电12nm工艺制程节省功耗达 15%&#xff0c;搭载了四颗Arm Cortex-A73 2.1GHz和四颗ArmCortex-A53 2.0GHz的八核处理器。 GPU为ARM Mali-G72 MP3&#xff0c;运行时频率高达900MHz&#xff0c;相较于上一代产品HelioP60&#xff0c;效能提升了1…

搜索与下载Stable Diffusion 模型

我只是一个刚开始学习SD没多久小白&#xff0c;拿到别人的工作流想要运行时&#xff0c;很多时候还要下载对应的模型才能正常运行&#xff0c;虽然也可以通过comfyui-manager下载&#xff0c;不过有时候好像会下载失败&#xff0c;而单独下载所需模型&#xff0c;我自己试过&am…

解析西门子PLC的String和WString

西门子PLC有两种字符串类型&#xff0c;String与WString String 用于存放英文数字标点符号等ASCII字符&#xff0c;每个字符占用一个字节 WString宽字符串用于存放中文、英文、数字等Unicode字符&#xff0c;每个字符占用两个字节 之前我搞过一篇解析String的 关于使用TCP-…

SparkSql oom原因以及参数调优+数据倾斜解决方案

1、Spark历史版本对比 spark1 vs spark2 vs spark3 1、spark1引入内存计算的理念&#xff0c;解决中间结果落盘导致的效率低下。在理想状况下性能可达到MR的100倍。虽然提高了一定的计算效率&#xff0c;但也带来了大量的内存管理问题&#xff0c;典型的如内存oom问题频发。…

第124天:内网安全-代理 Sockets协议路由不出网后渗透通讯CS-MSF 控制上线

目录 思维导图 环境配置 案例一&#xff1a;网络通讯&控制上线--CS-路由添加&节点建立&协议生成&正反连接 案例二&#xff1a;网络通讯&控制上线--MSF-路由添加&节点建立&协议生成&正反连接 思维导图 环境配置 这里由于系统内存问题我只设…

79页PDF免费下载 | 全域数字化转型评估模型研究报告

一、前言&#xff1a; 随着数字技术的飞速发展&#xff0c;零售行业正站在转型的十字路口。如何在变革中找到方向&#xff0c;如何通过数字化转型提升企业竞争力&#xff0c;已成为每个零售企业必须面对的课题。腾讯智慧零售与伏羲智库深度合作&#xff0c;推出《2024年全域数…

【Python selenium过极验滑块】用自动化selenium 操作GEETEST极验滑块,简单粗暴

文章日期&#xff1a;2024.07.24 使用工具&#xff1a;Python 文章类型&#xff1a;自动化过极验滑块 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算法&…