草庐IT

Redis核心技术与实战-学习笔记(七)哨兵机制

孔汤姆 2023-08-01 原文

一.主库挂了,如何不间断服务?

主库挂了,需要运行一个新的主库:将从库切换为主库。这就涉及到三个问题:

主库真的挂了吗?

选择哪个从库作为主库?

如何把新主库相关信息通知给从库和客户端

      Redis主从集群中,哨兵是实现主从库自动切换的关键机制,有效解决主从复制模式故障转移的上面这些问题。

二.哨兵机制的基本流程

哨兵是一个运行在特殊模式下的Redis进程,主从库实例运行时,他也在运行。

哨兵负责三个任务:监控选主(选择主库)和通知

监控

监控是指哨兵进程运行时,周期性给所有主从库发送PING命令检测他们是否仍然在线运行

从库没有在规定时间内响应哨兵的PING命令,哨兵就会把它标记为"下线状态";

主库没有在规定时间呢响应哨兵的PING命令,哨兵就会判定主库下线启动选主流程

选主

   哨兵在主库挂了以后,按照一定规则从从库中选出作为新的主库。

通知

     通知:哨兵将选出的新主库连接信息发给其他从库,让他们执行replicaof命令,和新主库建立连接复制数据。同时,哨兵会把新主库的连接信息通知给客户端,让它们将操作请求发送给新主库上。

    

通知任务简单,哨兵只需要把新主库信息发给从库和客户端。通知他们和新主库建立连接就成,不涉及决策逻辑。

监控和选主需要哨兵做出决策:

    监控任务哨兵需要判断主库是否处于下线状态

    选主任务哨兵决定选主哪个从库实例作为主库

二.主管下线和客观下线

       哨兵进程会使用PING命令检测主和从库的连接情况,用来判断实例状态;

       如果哨兵发现主库或者从库对PING命令响应超时,那么哨兵就会把它标记为"主观下线"

       从库,哨兵可以简单标记为"主观下线",因为从库下线影响不大,集群对外服务不会中断。

      主库,哨兵不能简单标记为"主观下线",开启主从切换。因为可能存在一种情况:哨兵误判,主库没有故障,可是一旦启动选主和通知操作后续的选主和通知操作都会带来额外的计算和通信开销。还可能产生脑裂。

   什么是误判

        主库实际没有下线,但是哨兵以为它下线了。误判产生原因:集群网络压力较大,网络拥塞主库本身压力较大

        一旦哨兵判断主库下线,就会开始重新选择主库,并让从库和新主库进行数据同步,这个过程中本身就会有开销。

       哨兵也要花时间选出新主库。因此我们需要减少误判。

 少数服从多数

        哨兵集群:哨兵多实例组成的集群模式进行部署。引入哨兵实例判断,避免单哨兵因为自身网络状况不好,误判主库下线的情况。同时,多搜啊并网络同时不稳定的概率较小,它们一起决策让误判率降低。

      只有大多数哨兵实例判断主库都已经"主观下线",主库才会被标记"客观下线"-----少数服从多数

      

      

 "客观下线":N个哨兵实例,最好要有N/2+1个实例判断主库为"主观下线",才能判断为"客观下线"。

减少误判的概率,避免误判带来无谓的主从切换。

三.选定新主库

   筛选+打分

  

筛选条件:

     检查从库的当前在线状态,判断他之前的网络连接状态

     如果从库总是和主库断连,断连次数超过一定阈值,该从库网络状态不好。

判断方式:

    使用配置项down-after-milliseconds*10down-after-milliseconds是我们认定主从库短链的最大连接超时时间

   断连次数超过10次,说明从库网络状态不好,不适合作为新主库。

从库打分:

      按照三个规则依次进行三轮打分,这三个规则分别是从库优先级从库复制进度从库ID号。只要在某一轮中从库得分最高,他就是主库了。选主过程结束。如果没有出现得分最高的从库,那就会继续进行下一轮

第一轮:优先级最高的从库得分高

    通过配置slave-priority配置项,给不同从库设置不同优先级。比如两个从库内存大小不一样,可以手动设置内存大的实例设置为一个高优先级。选主时候哨兵会选出优先级最高的打高分作为新主库,如果得分一直,那就开始第二轮打分。

第二轮:和旧主库同步程度最接近的从库得分高

       如果选择与旧主库同步最接近的从库作为主库,那么新主库上就有最新的数据。

       如何判断从库和旧主库间的同步进度?

       从库的slave_repl_offset最接近旧主库的master_repl_offset,那么它的得分最高,可以作为新主库。

       

如果两个从库的slave_repl_offset值大小一样,那么就需要进入第三轮打分了。

第三轮:ID号越小得分越高

每个实例在创建时候都会有一个ID,目前Redsi在选主从库时,有一个默认的规定:在优先级复制进度都相同的情况下,ID号最小的从库得分最高,会被选为新主库。选主完成!

课后提问:

      哨兵机制可以实现主从库的自由切换,这是实现服务不间断的关键支撑,主从切换是需要一定时间,在切换过程中客户端是否可以正常的进行请求操作,如何不感知的实现灰度切换。

     客户端使用读写分离,那么读请求可以在从库上正常执行,不会受到影响。但是由于主库已经挂了,哨兵还没选出新主库,这时候写请求会失败,失败时间=哨兵切换主从时间+客户端感知到新主库时间

    方案1:

      客户端将写失败的请求缓存或者写入消息队列中间件中,等哨兵切换完主从后,再执行这些命令,但是这种场景只适合对写入请求返回值不敏感的业务,而且还需要业务层做适配。如果主从切换时间过长,导致客户端或者消息队列中间件缓存写请求过多,切换完成后重放请求时间过长

   方案2:

      哨兵检测主库多久没有响应就进行主从切换,可以配置down-after-milliseconds参数;

      配置时间越短,哨兵越敏感,可能会导致误判。但是当主库真正故障,因为切换及时,对阢影响最小,如果配置时间越长,哨兵越保守,可以较少哨兵误判概率,主库故障发生时,业务写失败的时间也会较长。

   方案3;

       哨兵通知客户端,让客户端能够及时感知主库变化,将缓存的写请求写入新库中,保证后续写请求不会收到影响。

      哨兵提升一个从库为新主库后,哨兵会把新主库的地址写入自己实例的pubsub。客户端订阅这个主题,当pubsub有数据时将最新主库地址推送给客户端,写请求写到这个新主库即可,这种机制属于哨兵主动通知客户端。

     如果客户端因为某些原因错过推送通知,客户也需要主动回去这个主题信息。

    客户端访问主从库时候,不能直接写死主从库的地址,需要从哨兵集群中获取最新地址(sentinel get-master-addr-by-name命令),这样哨兵切换后,客户端可以从哨兵集群中拿到最新的实例地址。
     一般Redis的SDK都提供了通过哨兵拿到实例地址,再访问实例的方式,我们直接使用即可,不需要自己实现这些逻辑。对于只有主从实例的情况,客户端需要和哨兵配合使用,而在分片集群模式下,这些逻辑都可以做在proxy层,这样客户端也不需要关心这些逻辑了。

有关Redis核心技术与实战-学习笔记(七)哨兵机制的更多相关文章

  1. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  4. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  5. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  6. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  7. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  8. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

  9. ruby-on-rails - 用于门户的 Ruby 技术 - 2

    我刚刚看到whitehouse.gov正在使用drupal作为CMS和门户技术。drupal的优点之一似乎是很容易添加插件,而且编程最少,即重新发明轮子最少。这实际上正是Ruby-on-Rails的DRY理念。所以:drupal的缺点是什么?Rails或其他基于Ruby的技术有哪些不符合whitehouse.org(或其他CMS门户)门户技术的资格? 最佳答案 Whatarethedrawbacksofdrupal?对于Ruby和Rails,这确实是一个相当主观的问题。Drupal是一个可靠的内容管理选项,非常适合面向社区的站点。它

  10. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

随机推荐