Sentinel故障转移及实现原理

news2024/11/25 13:01:04

Sentinel故障转移及实现原理

      • 一、哨兵模式的基本工作流程
      • 二、判断实例下线
      • 三、选举新主库
      • 四、哨兵模式弊端
      • 五、哨兵集群判断实例下线
      • 六、哨兵集群判断实例下线详细工作过程
      • 七、哨兵集群的通信
      • 八、哨兵和客户端的通信
      • 九、总结

一、哨兵模式的基本工作流程

redis在运行时会开启一个哨兵进程,主要负责监控实例、选举主实例、通知其他实例新的主实例的工作。
ꞏ 监控实例
判断实例是否正常,主要就是通过哨兵的监控,他会周期性的给所有的实例发送PING命令,如果实例没有在对应的时间响应,那么哨兵就会把该实例标记为下线状态。如果该实例为主实例,那么哨兵在把该实例标记为下线状态后,开始进行重新选举主实例的工作。
ꞏ 选举主实例
主实例挂了后,会由哨兵进行重新选举主实例的工作,哨兵会根据具体的规则和算法选择一个健康的从实例作为新的主实例。具体的规则在下文中会提到。
ꞏ 通知实例
选举完实例后哨兵会通知其他实例谁是新的主实例。哨兵主要通过将新的主实例的连接信息发送给其他从实例,在从库中执行replicaof命令以此来成为新主库的从库,并从主库中进行数据复制。
另外哨兵也会把新的主库的信息同步给客户端,让客户端把新的请求操作发送给新主库。

二、判断实例下线

实例的下线状态分为主观下线和客观下线。哨兵会通过PING命令检测所有的实例,没有响应的实例就会被哨兵标记为主观下线状态。如果该实例为从库,哨兵会直接将他标记为主观下线。

如果实例为主库,如果是单哨兵模式的情况下,该主库会被哨兵直接标记为主观下线,然后开始新主库的选举工作。如果是哨兵集群模式,需要多个哨兵一起判断该主库是否无响应,如果超过一定值的哨兵实例判断该主库为主观下线,那么这个主库就正式被标记为客观下线,开始进行新主库的选举工作。哨兵集群模式会在下文进行分析。

三、选举新主库

ꞏ 筛选
选举新主库的第一步会进行筛选操作,主要是为了筛选出正常运行且运行良好的从库,目的是为了防止选举出来的新主库又由于网络故障等原因导致哨兵又得重新选举新出库的现象。所以要对这些从库当前的在线状态和之前的网络状态进行筛选。
筛选规则:
配置项sentinel.conf中的down­after­milliseconds表示设置的主从库断连的最大连接超时时间,默认为30秒。
如果在30秒内,主从节点都没通过网络连接和响应并且发生的次数超过了10次,就说明该从库的网络状况不好,不适合作为新主库。
ꞏ 打分
接下来就需要对剩余的从库进行打分,打分的目的是通过规则来选举出分数最高的从库作为新主库。

(1)第一轮打分:配置项slave­priority最高的从库得分最高通过从库配置的优先级来进行打分,默认都是100,如果有一个从库的优先级最高,那么该从库就是新的主库了,不需要进行第二轮打分比拼。如果当前打分都一样,那么进行第二轮打分。

(2)第二轮打分:和原主库数据同步进度最接近的从库得分最高上篇文章提到过主从复制之间存在增量复制缓冲区(repl_backlog_buffer),可以用于当从库出现闪断恢复后将闪断前的数据恢复到从库的操作。

repl_backlog_buffer是一个环形缓冲区,并且有2个指针表示主库写的位置和从库读的位置分别是master_repl_offset和slave_repl_offset。判断从库和原主库同步进度就是通过这两个指针的位置来判断,只有从库的slave_repl_offset最接近master_repl_offset位置,表示同步进度最接近,得分就最高,获得最高分数的从库就可以被选举作为新主库。
如果还是存在相同打分情况的从库,那么就会进入下一轮打分选举。

(3)第三轮打分:从库id最小的得分最高第三轮应该属于兜底的选举场景,只有第一轮和第二轮选举时的分数都完全一样时,才会进入第三轮打分。

通过从库中的id来进行比较,id最小的从库得分最高,就会被选举为新主库。

四、哨兵模式弊端

哨兵主要的工作在于监控、选举和通知。但是单个哨兵模式也会有一定的弊端和问题,
比如:
1、单个哨兵虽然可以判断主库主管下线,但是否可以减少误判情况?
2、这个哨兵如果挂了,redis的主库选举和切换该如何工作?
因此在实际应用中,我们可以选择哨兵集群的方式来进行部署,多个哨兵之间通过少数服从多数的原则来进行判断工作。

五、哨兵集群判断实例下线

上文在第二段”判断实例下线“中提到的主观下线和客观下线。主观下线是指某个哨兵通过ping的响应超时来判断主实例下线状态,而客观下线是指超过一定数量的哨兵实例都认为主库已下线,那么该主库就是客观下线状态。而客观下线一般存在哨兵集群中。
ꞏ 哨兵集群如何投票判断主库下线
(1)哨兵集群中某一个实例判断主库为主观下线后,就会给其他哨兵实例发送is­masterdown­by­addr命令。
(2)其他哨兵实例接收到命令后,会根据自己和主库的连接情况作出响应,投出赞成票或反对票。
(3)判断该主库为主观下线的哨兵实例如果获得了一定数值的赞成票,就会将该主库标记为客观下线。
这里赞成票的阈值可配,可通过sentinel.conf中的quorum配置数量决定。
(4)判断主库为客观下线的哨兵会向其他哨兵发送命令,表示由他自己来执行主从切换。
该哨兵想成为执行主从切换的主哨兵,得由其他哨兵赞成才行,并且赞成数量得大于一半的
哨兵数量。
(5)如果赞成数量小于一半的哨兵数量,就不会操作主从切换,哨兵集群会等待一段时间
再重新选举主哨兵进行主从切换。

六、哨兵集群判断实例下线详细工作过程

假设有三个哨兵S1、S2、S3。并且quorun配置数量为2。
(1)S1判断主库为主观下线状态,向其他哨兵发送is­master­down­by­addr命令,并且其他哨兵也同意主库为主观下线,S1将主库判断为客观下线开始进行主从切换。

(2)同时,S2也判断主库为主观下线状态,并且也向其他哨兵发送is­master­down­byaddr命令,其他哨兵也同意主库为主观下线,S2也将主库判断为客观下线开始进行主从切换。

(3)判断主库为客观下线的S1,想成为主哨兵,向其他哨兵发送命令,表示想成为主哨兵。

(4)判断主库为客观下线的S2,也想成为主哨兵,向其他哨兵发送命令,表示想成为主哨兵。

(5)S3收到了S1想成为主哨兵的命令,由于S3没有投过票,所以会返回同意。S2收到了S1想成为主哨兵的命令,由于S2自己投给了自己,所以会返回不同意。此时S1已经获得了2票同意票,赞成票大于一半的哨兵数量,可成为主哨兵,进行主从切换。

(6)后续S3收到了S2想成为主哨兵的命令,由于S3已经将票投给了S1,所以会返回不同意。S1也收到了S2想成为主哨兵的命令,由于S1自己投给了自己所以也返回不同意。此时S2只获得了1票同意票,赞成票小于一半的哨兵数量,不能成为主哨兵。

(7)最后,如果S1获得的同意票小于一半的哨兵数量,会导致S1和S2的选举结果不会产生主哨兵,哨兵集群会等待一段时间再重新选举。

七、哨兵集群的通信

在这里插入图片描述

如上图所示,就是哨兵集群的通信机制,主要是通过redis提供的pub/sub机制,即发布/订阅机制。

哨兵如果想要在主库上发布消息,需要和主库建立连接。从上图中可以看到主库中有一个订阅频道“sentinel:hello”的频道,不同的哨兵之间就是通过这个默认频道来进行发布/订
阅通讯。

比如,上图中哨兵S2和哨兵S3是如何与S1建立网络连接的,假设S1的ip和端口分别是192.168.23.01和6379。
(1)哨兵S1通过+sentinel sentinel 192.168.23.01:6379命令将自己的ip和端口发布到“sentinel:hello”频道中。

(2)哨兵S2和哨兵S3由于已经订阅了该频道,因此可以获取这个订阅消息(+sentinel sentinel 192.168.23.01:6379),获取到S1的ip和端口。

(3)哨兵S2和哨兵S3和哨兵S1建立网络连接。

(4)任何一个哨兵可以通过向主库发送INFO命令获得所有主库对应的从库信息,和从库进行连接并进行监控。

(5)其余的哨兵也是根据相同的INFO命令和从库进行连接。

(6)至此,哨兵之间组成了集群并进行通信。哨兵也和主从库之间建立了连接并进行监控。

八、哨兵和客户端的通信

哨兵不仅需要和主从库之间进行通信,还需要和客户端进行连接通信,因为如果主库宕机后通过哨兵选举出来的新主库的信息也需要推送给客户端。
哨兵和客户端的通信实际上也是基于发布/订阅机制来进行的。
比如,当哨兵把新主库选举出来后,客户端可以收到switch­master事件(switch­master ),来表示主库已经切换。客户端就可以使用该事件中的新ip和新端口信息来进行与新主库的通信。
哨兵和客户端通信事件的一些重要频道:

(1)+sdown(实例进入主观下线状态)
(2)­sdown(实例退出主观下线状态)
(3)+odown(实例进入客观下线状态)
(4)­odown(实例退出客观下线状态)
(5)+swtich­master(主库地址发生变化)
(6)+slave­reconf­sent(哨兵发送SLAVEOF命令重新配置从库)
(7)+slave­reconf­inprog(从库配置了新主库,但尚未同步)
(8)+slave­reconf­done(从库配置了新主库,和新主库完成同步)

九、总结

aof和rdb的存在保证了数据的持久性。redis集群模式的存在,是数据可靠的基础保证。而哨兵模式的存在,是redis高可用的保证,即在主库发生故障时可通过选举和主从切换来保证redis服务不间断的可用性。
ꞏ 问题一

假设一个redis集群,是一主四从,同时配置了5个哨兵实例的集群,quorum值设为2。在运行过程中,如果有3个哨兵实例都发生故障了,此时,redis主库如果故障,还能正确地判断主库客观下线吗?如果可以的话,还能进行主从库自动切换吗?

首先哨兵判断主库客观下线是通过quorum值来进行的,只有认为主库主管下线的哨兵数量大于等于quorum值时,该哨兵才可以判断主库为客观下线。所以redis主库如果故障,仍可以正确的判断主库客观下线。
在哨兵集群中想要进行主库切换,需要选举出一个主哨兵来进行主从切换,但是主哨兵的选举的要求是同意该哨兵为主哨兵的赞成票要大于哨兵数量的一半,由于可运行哨兵只只有2个了,所以无法选举主哨兵,无法进行主从自动切换

ꞏ 问题二
哨兵实例是不是越多越好?
不一定,哨兵实例越多,虽然可以减少误判率。但是在判断主库客观下线和选举主哨兵时,该哨兵实例所需要拿到的赞成票也会越来越多,所以总体投票的时间也会增加,导致整体主从切换的时间变长,导致客户端堆积较多请求操作,导致请求溢出造成请求丢失。

ꞏ 问题三
如果调大down­after­milliseconds值,对减少误判是不是也有好处?
不一定,调大的结果可能会导致实际上已经发生故障的主库,由于值的调大导致哨兵过了down­after­milliseconds值的时间才能判断出来,反而会影响redis对业务的可用性。

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

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

相关文章

vue基础知识十五:说说你对slot的理解?slot使用场景有哪些?

一、slot是什么 在HTML中 slot 元素 &#xff0c;作为 Web Components 技术套件的一部分&#xff0c;是Web组件内的一个占位符 该占位符可以在后期使用自己的标记语言填充 举个栗子 <template id"element-details-template"><slot name"element-na…

(2022|ECCV,图像分割,VQ-SEG,AR Transformer)Make-A-Scene:利用人类先验进行基于场景的文本到图像生成

Make-A-Scene: Scene-Based Text-to-Image Generation with Human Priors 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2.相关工作 2.1. 图像生成 2.2. 图像标…

2023年汉字小达人区级自由报名明天开赛,3个新问题和往年真题练一练

明天9月25日&#xff0c;备受关注的2023年第十届上海小学生汉字小达人区级自由报名的比赛就要开始了&#xff0c;最近还是有几个“小迷糊”家长刚听说这个活动&#xff0c;问了几个问题&#xff0c;我觉得挺有普遍性的&#xff0c;所以再次给大家回答一下&#xff0c;希望能够帮…

redis漏洞修复:CVE-2022-35977、CVE-2023-22458、CVE-2023-28856

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、漏洞内容二、现状三、更新redis下载镜像停止已有的容器启动新的容器 四、更新后的版本1. 查看日志2. 查看版本 总结 前言 漏扫发现机器上的redis版本有点低…

图像识别-YOLO V8安装部署-window-CPU-Pycharm

前言 安装过程中发现&#xff0c;YOLO V8一直在更新&#xff0c;现在是2023-9-20的版本&#xff0c;已经和1月份刚发布的不一样了。 eg: 目录已经变了&#xff0c;旧版预测:在ultralytics/yolo/v8/下detect 新版&#xff1a;ultralytics/models/yolo/detect/predict.py 1.安…

九、多项式朴素贝叶斯算法(Multinomial NB,Multinomial Naive Bayes)(有监督学习)

Multinomial Naive Bayes&#xff1a;用于多项式模型的Naive Bayes分类器 一、算法思路 多项式Naive Bayes分类器适用于离散特征分类&#xff08;如文本分类中的字数&#xff09; 多叉分布通常需要整数特征计数 不过&#xff0c;在实际应用中&#xff0c;分数计数&#xff08…

LeetCode刷题

一 【移除元素】 原题链接&#xff1a;27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用…

SLAM从入门到精通(机器人建模和仿真环境)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多同学学了ros&#xff0c;以为把publish、subscribe、消息、服务这些接口学好了就行。其实这是很大的误区。因为这些通信机制只是帮我们了解ros…

bean加载properties文件(spring)

1.开启Context命名空间 复制一下第二行的信息,然后粘贴一下,把粘贴过来的所有beans替换成context 2.使用context命名空间,加载指定的properties文件 3,使用#{}占位符读取加载的属性值 实际实例(在配置文件xml中写) 补充: 不加载系统属性的解释: 如果你在配置文件中配置的变量…

MyBatis友人帐之缓存

一、概述 1.1简介 什么是缓存 [ Cache ]&#xff1f; 存在内存中的临时数据。 将用户经常查询的数据放在缓存&#xff08;内存&#xff09;中&#xff0c;用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询&#xff0c;从缓存中查询&#xff0c;从而提高查询效率&…

【SoC基础】硬件起源之晶体管的诞生

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

Go语言入门篇

目录 一、基础数据类型 1.1 变量的定义方式 1.2 用%T输出变量的类型 二、复合数据类型 2.1 数组 2.1.2、数组的遍历 2.1.3 数组传参 2.2. 切片slice 2.2.1. 初始化切片 2.2.2. append向切片中追加元素 2.2.3. 切片的截取 2.3. map 2.3.1. map初始化 2.3.2. 添加和…

CSS3有哪些新特性

CSS3 引入了许多新特性&#xff0c;以增强样式设计和页面布局的能力&#xff0c;提供更多的视觉效果和交互性。以下是一些 CSS3 中的新特性&#xff1a; 圆角边框&#xff08;Border Radius&#xff09;&#xff1a;圆角的边框&#xff0c;而不是传统的方形边框。 <!DOCTY…

GLTF编辑器告诉你凹凸贴图的作用

什么是凹凸贴图 凹凸贴图&#xff08;Bump Mapping&#xff09;是一种计算机图形学中的技术&#xff0c;用于在表面上模拟微小的凹凸形状&#xff0c;从而增加了物体的细节和真实感。它可以在不改变物体几何形状的情况下&#xff0c;通过修改光照的反应&#xff0c;使表面看起来…

华为云云耀云服务器L实例评测 | WebVR性能测试

随着最近几年Web技术的快速发展&#xff0c;Web3D和WebVR在网页端效果越来越好。 本文讲述如何在云耀云服务器L实例上部署WebVR服务器&#xff0c;服务器代码里添加一个3D模型&#xff0c;然后再使用本地浏览器作为客户端来查看模型加载和交互情况&#xff0c;并体验WebVR。 …

猴赛雷 ! 上次我见过这么厉害的安全测试实战演练还是上次!

01、概念介绍 1.1 xss XSS 攻击通常指的是通过利用网页开发时留下的漏洞&#xff0c;通过巧妙的方法注入恶意指令代码到网页&#xff0c;使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是 JavaScript&#xff0c;但实际上也可以包括 Java、 VBScript、Acti…

Python绘制二元函数图像

1 问题 利用python来解决绘制二元函数图像的问题。 2 方法 用文字描述解题思路&#xff0c;可配合一些图形以便更好的阐述。解决问题的步骤采用如下方式&#xff1a; 注意下述步骤全部使用(1)格式。 需要调用两个第三方库;Matplotlib、numpy编写代码绘制f(x,y)(sin(x)*sin(y))/…

云上亚运:所使用的高新技术,你知道吗?

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 前言 一.什么是云上亚运会 二.为什么要使用云…

Python字典的增删改查以及嵌套

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&#xff0c;直接在文末名片自取就可 字典 基础数…

Java客户端_Apache Curator操作Zookeeper

Curator是 Netflix公司开源的一套ZooKeeper客户端框架。和ZkClient一样&#xff0c;Curator解决了很多ZooKeeper客户端非常底层的细节开发工作&#xff0c;包括连接重连、反复注册Watcher和 NodeExistsException异常等&#xff0c;目前已经成为了Apache的顶级项目,是全世界范围…