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

news2024/11/15 11:07:05

⭐最核心的结论:所谓选举的过程不是直接选出新的主节点,而是先在哨兵节点中选出 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.coloradmin.cn/o/1440346.html

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

相关文章

Unity类银河恶魔城学习记录5-1.5-2 P62-63 Creating Player Manager and Skill Manager源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili PlayerManager.cs using System.Collections; using System.Collections.G…

Bpmn-js自定义Palette元素

Bpmn-js作为一个流程编辑器,常规的我们可以将其划分为几个功能区域,每个区域对应的负责不同的功能实现,bpmn-js的设计给我们留下了大量的留白和可扩展区域,其每一部分都可进行组合拼装,同时也支持我们的各种不同层次需…

DevOps落地笔记-20|软件质量:决定系统成功的关键

上一课时介绍通过提高工程效率来提高价值交付效率,从而提高企业对市场的响应速度。在提高响应速度的同时,也不能降低软件的质量,这就是所谓的“保质保量”。具备高质量软件,高效率的企业走得更快更远。相反,低劣的软件…

【CV论文精读】【MVDet】Multiview Detection with Feature Perspective Transformation

0.论文摘要 合并多个摄像机视图进行检测减轻了拥挤场景中遮挡的影响。在多视图检测系统中,我们需要回答两个重要问题。首先,我们应该如何从多个视图中聚合线索?第二,我们应该如何从空间上相邻的位置聚集信息?为了解决…

自定义搜狗输入法日期时间格式设置

目录 引言具体操作方法1方法2 效果展示 引言 根据搜狗官方指导:https://pinyin.sogou.com/help.php?list3&q11 【插入当前日期时间】的功能可以方便的输入当前的系统日期、时间、星期。并且你还可以用插入函数自己构造动态的时间。例如在回信的模版中使用。此…

Pandas 数据处理-排序与排名的深度探索【第69篇—python:文本数据处理】

文章目录 Pandas 数据处理-排序与排名的深度探索1. sort_index方法2. sort_values方法3. rank方法4. 多列排序5. 排名方法的参数详解6. 处理重复值7. 对索引进行排名8. 多级索引排序与排名9. 更高级的排序自定义10. 性能优化技巧10.1 使用nsmallest和nlargest10.2 使用sort_val…

io三个练习:

练习一: 使用 四种方式拷贝文件,并统计各自用时 1字节流的基本流:一次读写一个字节 2字节流的基本流:一次读写一个字节数组 3字节缓冲流:一次读写一个字节 4字节缓冲流:一次读写一个字节数组 public clas…

TCP的连接和断开详解

目录 1.TCP基础知识 1.1.TCP 头格式 1.2.TCP协议介绍 1.3.UDP协议介绍 1.4.TCP 和 UDP 区别 1.5.TCP 和 UDP 应用场景 1.6.计算机网络相关术语(缩写) 2.TCP 连接建立:三次握手 2.1.TCP 三次握手过程 2.2.三次握手原理 2.3.异常分析…

JavaScript 入门 完整版

目录 第一个知识点:引入js文件 内部引用: 外部引用: 第二个知识点:javascript的基本语法 定义变量: 条件控制(if - else if - else) 第三个知识点:javascript里的数据类型、运算符: 数字类型 字符串类型 布尔…

【蓝桥杯单片机记录】IO基础与LED控制

目录 一、IO基础 1.1 IAP15F2K61S2芯片原理图 1.2不同工作模式 二、新建工程的一些补充 2.1 keil中没有IAP15F2K61S2的头文件 解决:在isp软件中找到如下​编辑 2.2keil中的芯片选择 2.3推荐字体 三、sbit关键字 四、LED控制 4.1原理图 4.2不能直接通过IO…

【深度学习:掌握监督学习】掌握监督学习综合指南

【深度学习:掌握监督学习】掌握监督学习综合指南 监督学习的定义和简要说明监督学习在人工智能中的重要性和相关性概述什么是监督学习?基本概念主要组件:输入要素和目标标签 训练监督式学习模型监督学习算法的类型分类回归每个类别中的流行算…

洞察 Electric Capital 2023 年开发者报告,找准未来 Web3 开发趋势

作者:Electric Capital 编译:TinTinLand 原文链接:https://www.developerreport.com/developer-report 近期,Electric Capital 发布了 2023 年年度加密开发者报告,对 818k 开源存储库中的 4.85 亿次代码提交进行分析…

C#上位机与三菱PLC的通信04--MC协议之A-1E报文测试

到目前为止,还没有网上有哪个文章有我如此的报文分析,操作实例,一大批都是抄来抄去,没有截图,没有说明,没有实例,有卵用呀,仅以此文章献给最爱的粉丝,希望对各位大师有些…

vue教程-介绍与使用

vue介绍 介绍 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。 安装 最简单的例子就是,创建一个htm…

2024年【广东省安全员B证第四批(项目负责人)】考试及广东省安全员B证第四批(项目负责人)考试题

题库来源:安全生产模拟考试一点通公众号小程序 广东省安全员B证第四批(项目负责人)考试考前必练!安全生产模拟考试一点通每个月更新广东省安全员B证第四批(项目负责人)考试题题目及答案!多做几…

代码随想录算法训练营第二十五天 |216.组合总和III,17.电话号码的字母组合(已补充)

剪枝操作讲解:(已观看) 带你学透回溯算法-组合问题的剪枝操作(对应力扣题目:77.组合)| 回溯法精讲!_哔哩哔哩_bilibili 216.组合总和III(已观看) 1、题目链接&#xf…

文件上传-Webshell

Webshell简介 webshell就是以aspphpjsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页木马后门。 攻击者可通过这种网页后门获得网站服务器操作权限,控制网站服务器以进行上传下载文件、查看数据库、执行命令等… 什么是木马 …

设计模式2-对象池模式

对象池模式,Object Pool Pattern,当你的应用程序需要频繁创建和销毁某种资源(比如数据库连接、线程、socket连接等)时,Object Pool 设计模式就变得很有用。它通过预先创建一组对象并将它们保存在池中,以便在…

压敏电阻简介

压敏电阻 原理 压敏电阻器是一种具有瞬态电压抑制功能的元件,可以用来代替瞬态抑制二极管、齐纳二极管和电容器的组合。压敏电阻器可以对IC及其它设备的电路进行保护,防止因静电放电、浪涌及其它瞬态电流(如雷击等)而造成对它们…

什么是GitOps

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 GitOps 改变了软件和基础设施的管理方式,以 Git 作为管理和自动化应用程序和基础设施整个生命周期的中心枢纽。 它建立在版本控制、协作以及持续集成和…