详解Redis哨兵模式下,主节点掉线而重新选取主节点的流程

⭐最核心的结论:所谓选举的过程不是直接选出新的主节点,而是先在哨兵节点中选出 leader ,再由 leader 负责后续主节点的指定。


假定当前环境:

  • 三个哨兵(sentenal1, sentenal2, sentenal3)
  • 一个主节点(redis-master)
  • 两个从节点(redis-slave1, redis-slave2)

当主节点出现故障,就会触发以下一系列过程:

目录

一、判定主观下线

二、判定客观下线

三、选举出哨兵的 leader

1、每个哨兵节点都给其他所有哨兵节点发起⼀个 “拉票请求”。

2、收到拉票请求的节点会回复⼀个 “投票响应”,响应的结果有两种可能,即投 or 不投。

3、一轮投票完成之后,得票超过半数的哨兵节点将动成为 leader。

***选举leader的流程演示:

4、leader 节点负责挑选一个 slave 成为新的 master。

四、由leader挑选一个从节点作为新的主节点

挑选的规则

*哨兵节点的作用演示 


一、判定主观下线

哨兵节点通过心跳包判定 redis-master 服务器是否正常工作。如果心跳包没有如约而至,那么这个哨兵节点就会认为 redis-master 服务器挂了,这就是主观下线(SDown)。

注意,此时在在某一个哨兵节点的角度,还不能排除网络波动的对心跳包丢失的影响,所以只能是该哨兵节点单方面认为这个 redis-master 节点挂了,是“主观”的。


二、判定客观下线

此时,哨兵 sentenal1,sentenal2,sentenal3 均会对主节点故障这件事情进行投票。当故障得票数 >= 配置的法定票数之后,哨兵们就认为这个主节点确实挂了,即触发客观下线(ODown)。

法定票数可以在哨兵节点的配置文件中查看:

sentinel1.conf是哨兵节点sentinel1的配置文件

有些同学可能会有疑问,是否存在一种情况:出现非常严重的网络波动,导致所有的哨兵都联系不上 redis 主节点从而“误判”成主节点挂了呢?

当然是有的!然而,如果出现这个情况,怕是连用户的客户端也连不上 redis 主节点了,此时这个redis主节点基本也是无法正常工作的。

注意,“挂了”不一定指的就是进程崩了。只要无法正常访问主节点,都可以视为是主节点挂了。


三、选举出哨兵的 leader

接下来需要哨兵把剩余的 slave 中挑选出⼀个新的 master。

这个工作不需要所有的哨兵都参与,只需要选出个代表(称为 leader),由 leader 负责进行 slave 升级到 master 的提拔过程。这个选举的过程涉及到 Raft 算法

假定⼀共三个哨兵节点 S1,S2,S3:

1、每个哨兵节点都给其他所有哨兵节点发起⼀个 “拉票请求”。

即 S1 -> S2,S1 -> S3;S2 -> S1,S2 -> S3;S3 -> S1,S3 -> S2。

2、收到拉票请求的节点会回复⼀个 “投票响应”,响应的结果有两种可能,即投 or 不投。

比如 S1 给 S2 发了投票请求,S2 就会给 S1 返回投票响应。S2 是否要投 S1 ,取决于 S2 是否给别人投过票了. (每个哨兵只有一票). 如果 S2 没有给别人投过票,也就是说 S1 是第一个向 S2 拉票的,那么 S2 就会投 S1,否则则不投。

3、一轮投票完成之后,得票超过半数的哨兵节点将动成为 leader。

如果出现平票的情况 (如 S1 投 S2,S2 投 S3,S3 投 S1,每人一票),就重新再投一次。

这也是一般建议哨兵节点设置成奇数个的原因:如果是偶数个,就增大了平票的概率,从而带来不必要的开销。

***选举leader的流程演示:

leader选举总结:Raft 算法的核心是 “先下手为强”,谁率先发出了拉票请求,谁就有更大的概率成为 leader。这里的决定因素是 “网络延时”,网络延时本身就带有一定的随机性。

4、leader 节点负责挑选一个 slave 成为新的 master。

当其他的 sentenal 发现新的 master 出现了, 就说明选举结束了。


四、由leader挑选一个从节点作为新的主节点

举个栗子:

假设一个情景:学校里有一位任课老师请假不能来给学生上课,需要由别的任课老师从众多助教老师中选择一位来代替他上课。 

  • 任课老师有很多,谁来当负责人来负责挑选合适的助教老师?  ——即众多哨兵节点选举leader的过程。
  • 如何怎样的助教老师是合适的?  ——即由leader哨兵节点从所有redis-slave节点中选择一个作为新的redis-master的过程。(接下来介绍的)

挑选的规则

leader如何挑选新的主节点?按照优先级 > offset > run id的次序依次筛选:

  1. 优先级最高的从节点胜出。每个redis数据节点都会在配置文件中有一个优先级配置(slave-priority,默认情况下都相同)。【某个助教老师是校长钦定的,那就选他代替上课。】

  2. offset最大的从节点胜出。offset代表从节点从主节点这里同步数据的进度。数值越大,说明从节点的数据和主节点就越接近。【哪个助教老师的备课进度更多,哪个助教老师就来代替上课。】

  3. run id值更小的胜出。run id是每个redis节点启动的时候随机生成的一串数字(大小全凭缘分)。此时意味着优先级和offset都一样,那么选谁都可以,其实就是随便挑一个。【看哪个助教老师名字好听,就选谁来代替上课。】

把新的主节点指定好了之后:

  1. leader就会控制这个这个节点执行slave no one,成为 master;
  2. 再控制其他节点执行 slave of,让这些其他节点认新的 master 为主节点。

*哨兵节点的作用演示 

我们知道,哨兵存在的意义是,在redis主从结构出现问题(比如主节点挂了)时,哨兵节点能够自动重选出一个新的主节点来代替之前挂了的主节点,从而保证整个 redis 仍然是可用状态。

以下是在centos7上,采用docker配置了3个redis数据节点(1个redis-master,2个redis-slave)和3个哨兵节点(redis-sentinel)后的演示过程:

1、首先查看正在运行的容器:docker ps -a

可见所有容器都已启动

2、手动停止主节点,模拟主节点掉线:docker stop redis-master

手动停止redis-master后,再次查看docker运行情况,可见redis-master已停止运行

3、 此时主节点已经是退出状态。事实上当主节点挂了后,哨兵节点就已经开始工作了。查看哨兵节点的日志:docker-compose logs

4、此时连接6379(即刚才手动下线了的主节点),发现连不上,证明原来的主节点确实已经下线:

5、改连redis节点6380,连接成功并查询信息发现,6380仍然是一个slave节点,且其主节点IP已经成为了172.18.0.3(而不再是原来的172.18.0.2):

6、6380无法设置值(只读),说明它确实仍然是一个从节点:

7、退出6380,再连接redis节点6381,查看info replication发现,本来是从节点的6381已经变成了主节点:

8、此时也就可以顺利地在6381上进行值的写入操作,进一步证明6381已经具备了主节点的功能:

9、此时如果再把原来挂了的主节点6379恢复正常,虽然6379恢复上线,但它的主节点身份在挂了的时候就失去了,已经变成了一个从节点,即使重新启动也不会变回主节点:

10、查看当前新主节点6381的信息,可见现在有两个从节点(6380和6379)连接在它身上:

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

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

相关文章

接口测试框架对比

公司计划系统的开展接口自动化测试,需要我这边调研一下主流的接口测试框架给后端测试(主要测试接口)的同事介绍一下每个框架的特定和使用方式。后端同事根据他们接口的特点提出一下需求,看哪个框架更适合我们。 需求 1、接口编写…

端到端实现高精地图重建(TopoNet解读和横评)

论文出处 [2304.05277] Graph-based Topology Reasoning for Driving Scenes (arxiv.org)https://arxiv.org/abs/2304.05277 TopoNet TopoNet的目标是从车辆上安装的多视角摄像头获取图像,感知实体并推理出驾驶场景的拓扑关系,实现端到端预测&#xf…

【自动化测试】----Java的单元测试工具Junit5

目录 支持Java的最低版本为8在pom.xml添加依赖Junit提供的注解功能 断言 Assertion类提供的一些方法测试用例执行顺序 (为了预防测试用例执行顺序错误)参数化 (假设登陆操作,用户名和密码很多,尽可能通过一个测试用例…

Java多线程--JDK5.0新增线程创建方式

文章目录 一、新增方式1:实现Callable接口(1)介绍(2)案例(3)总结对比 二、新增方式2:使用线程池(1)问题与解决思路1、现有问题2、解决思路3、好处 &#xff0…

Swift Vapor 教程(查询数据、插入数据)

上一篇简单写了 怎么创建 Swift Vapor 项目以及在开发过程中使用到的软件。 这一篇写一个怎么在创建的项目中创建一个简单的查询数据和插入数据。 注:数据库配置比较重要 先将本地的Docker启动起来,用Docker管理数据库 将项目自己创建的Todo相关的都删掉…

以小猪o2o生活通v17.1为例简要分析SWOOLE加密破解,swoole_loader加密破解swoole加密逆向后的代码修复流程(个人见解高手掠过)

现在用Php加密五花八门除了组件就是混淆,在组件里面响当当的还属swoole,SWOOLEC是不错的国产加密,值得推荐官方宣称是永远无法破解的加密算法,针对swoole compiler的代码修复我谈谈我的看法,以小猪o2o生活通&#xff0…

PyTorch 2.2 中文官方教程(十九)

使用 RPC 进行分布式管道并行 原文:pytorch.org/tutorials/intermediate/dist_pipeline_parallel_tutorial.html 译者:飞龙 协议:CC BY-NC-SA 4.0 作者:Shen Li 注意 在github中查看并编辑本教程。 先决条件: PyTorc…

04-Java建造者模式 ( Builder Pattern )

建造者模式 摘要实现范例 建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象 一个Builder 类会一步一步构造最终的对象,该 Builder 类是独立于其他对象的 建造者模式属于创建型模式,它提供了一种创建对…

深度学习手写字符识别:训练模型

说明 本篇博客主要是跟着B站中国计量大学杨老师的视频实战深度学习手写字符识别。 第一个深度学习实例手写字符识别 深度学习环境配置 可以参考下篇博客,网上也有很多教程,很容易搭建好深度学习的环境。 Windows11搭建GPU版本PyTorch环境详细过程 数…

vcruntime140.dll最新的修复方法,一键修复vcruntime140.dll的手段

在这篇文章中,我们将深入探讨并详细介绍各种修复vcruntime140.dll文件缺失或损坏问题的方法。鉴于此类问题广泛存在并影响了众多用户,本文目的是向大家展示不同的修复策略,希望能够帮助每个人解决这些棘手的技术难题。下面一起来看看vcruntim…

【RT-DETR有效改进】UNetv2提出的一种SDI多层次特征融合模块(细节高效涨点)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本问给大家带来的改进机制是UNetv2提出的一种多层次特征融合模块(SDI)其是一种用于替换Concat操作的模块,SDI模块的主要思想是通过整合编码器生成的层级特征图来增强图像中的语义信息和细节信息。包括皮肤…

黑豹程序员-ElementPlus选择图标器

ElementPlus组件提供了很多图标svg 如何在你的系统中&#xff0c;用户可以使用呢&#xff1f; 这就是图标器&#xff0c;去调用ElementPlus的icon组件库&#xff0c;展示到页面&#xff0c;用户选择&#xff0c;返回选择的组件名称。 效果 代码 <template><el-inpu…

机器学习 - 梯度下降

场景 上一章学习了代价函数&#xff0c;在机器学习中&#xff0c;代价模型是用于衡量模型预测值与真实值之间的差异的函数。它是优化算法的核心&#xff0c;目标是通过调整模型的参数来最小化代价模型的值&#xff0c;从而使模型的预测结果更接近真实值。常见的代价模型是均方…

【Boost】:searcher的建立(四)

searcher的建立 一.初始化二.搜索功能三.完整源代码 sercher主要分为两部分&#xff1a;初始化和查找。 一.初始化 初始化分为两步&#xff1a;1.创建Index对象&#xff1b;2.建立索引 二.搜索功能 搜索分为四个步骤 分词&#xff1b;触发&#xff1a;根据分词找到对应的文档…

架构设计特训

一、考点分布 软件架构风格&#xff08;※※※※&#xff09;层次型软件架构风格&#xff08;※※※※&#xff09;面向服务的软件架构风格&#xff08;※※※※&#xff09;云原生架构风格&#xff08;※※※※&#xff09;质量属性与架构评估&#xff08;※※※※※&#xff…

Transformer实战-系列教程1:Transformer算法解读1

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 Transformer实战-系列教程1&#xff1a;Transformer算法解读1 Transformer实战-系列教程2&#xff1a;Transformer算法解读2 现在最火的AI内容&#xff0c;chatGPT、视觉大模…

Golang切片与数组

在Go语言中&#xff0c;切片&#xff08;Slice&#xff09;和数组&#xff08;Array&#xff09;是两个核心的数据结构&#xff0c;它们在内存管理、灵活性以及性能方面有着显著的区别。接下来将解析Golang中的切片与数组&#xff0c;通过清晰的概念解释、案例代码和实际应用场…

小林Coding_操作系统_读书笔记

一、硬件结构 1. CPU是如何执行的 冯诺依曼模型&#xff1a;中央处理器&#xff08;CPU&#xff09;、内存、输入设备、输出设备、总线 CPU中&#xff1a;寄存器&#xff08;程序计数器、通用暂存器、指令暂存器&#xff09;&#xff0c;控制单元&#xff08;控制CPU工作&am…

[word] word页面视图放大后,影响打印吗? #笔记#学习方法

word页面视图放大后&#xff0c;影响打印吗&#xff1f; word文档的页面视图又叫普通视图&#xff0c;又叫打印视图&#xff0c;是系统默认的视图&#xff0c;是用户用的最多最常见的视图。 问&#xff1a;怎样打开页面视图&#xff1f; 答&#xff1a;两种方法 方法一、点…

JS 基本语句

函数调用&#xff0c;分支&#xff0c;循环&#xff0c;语句示例。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…