Redis第7讲——哨兵模式详解

为了解决主从模式的无法自动容错及恢复的问题,Redis在主从复制的基础上加入了哨兵节点,也就是我们熟悉的哨兵模式。但现在基本不会用到哨兵模式,也就是这种模式只存在于面试中。

一、什么是哨兵模式

ps:主从服务器之间的数据同步在上一篇(主从复制)已经详细介绍过了,本节将不再赘述。

Redis的哨兵模式(Sentinel)是一种高可用的部署方式,由一个或多个Sentinel实例组成的Sentinel系统可以监控和管理多个Redis实例。在哨兵模式下,有一个或多个哨兵进程监控Redis主服务器和备份服务器的状态,并在主服务器下线时自动切换到备份服务器,继续处理命令请求。

如果这时Master进入下线状态,那么slave1和slave2对Master服务器的复制操作会被中止,并且Sentinels系统会觉察到Master已下线,当Master的下线时长超过用户设定的下线时长时,Sentinels系统就会对Master执行故障转移操作:

  • Sentinels系统会挑选Master属下的其中一个slave服务器,并把它升级为主服务器。
  • 随后,Sentinels系统会向Master属下的所有从服务器发送新的复制指令,让他们称为新的主服务器的从服务器,当所有从服务器都开始复制新的主服务器时,故障转移操作执行完毕。
  • 如果Master重新上线时,它将变为新主服务器的从服务器。

这里就先简单介绍下大致流程,至于如何进行故障检测、如何选举新的主服务器 、如何执行故障操作转移等细节问题,下面会一一介绍。

二、故障检测

2.1 检测主观下线

在默认情况下,Sentinel会以每秒一次的频率向所有与它创建了命令连接的实例(包括主服务器、从服务器和其它Sentinel)发送PING命令,并通过实例返回的PING命令来判断实例是否在线。

ps:实例返回+PONG,-LOADING,-MASTERDOWN三种之一为有效回复,除此之外都是无效回复。

如果一个实例在Sentinel配置文件选项down-after-milliseconds毫秒内,连续向Sentinel返回无效回复,那么Sentinel会修改这个实例所对应的实例结构,在结构flags属性下打开SRI_S_DOWN标识,以此来标记该实例已经进入主观下线状态。

ps:down-after-milliseconds选项配置,不仅会被Sentinel用来判断主服务器的主观下线状态,还会被用于判断主服务器属下的所有从服务器,以及所有同样监视这个主服务器的其他Sentinel的主观下线状态。

2.2 检测客观下线

当Sentinel将一个主服务器判为主观下线后,为了确认这个主服务器是否真下线了,它会同样监视这一服务器的其它Sentinel进行询问,看它们是否也认为主服务器已经进入下线状态(可以是主观或客观下线)。

当认为主服务器已经进入下线状态的Sentinel数量,超过Sentinel配置中设置的quorum参数的值,那么该Sentinle就会认为主服务器已经进入客观下线状态。比如,如果Sentinle启动时载入了以下配置

sentinel monitor master 127.0.0.1 6379 5

那么包括当前Sentinel在内,总过有5个认为主服务器已经下线,当前Sentinel才会将主服务器判断为客观下线,并在flags上打上SRI_O_DOWN标识,并对主服务器执行故障转移操作。

三、故障转移(主从切换流程)

大致流程上面介绍过,这里就详细介绍一下。

3.1 选举领头Sentinel

当一个主服务器被判断客观下线时,监视这个下线主服务器的各个Sentinel会进行协商,选举出一个领头Sentinel,并由领头Sentinel对下线主服务器执行故障转移操作,下面是选举领头Sentinel过程:

  • 首先会发起一次选举:将current_epoch(集群纪元)加1,向其它监视该master的Sentinel发送拉票命令:SENTINEL is-master-down-by-addr命令,要求目标Sentinel将选票投给自己
  • 目标Sentinel在接收到SENTINEL is-master-down-by-addr命令后,会判断自己是否已经在本次选举中投过票,如果没有则会将选票投给源Sentinel,最后回复leader和leader_epoch,代表自己所投的局部领头Sentinel的运行ID和配置纪元
  • 源Sentinel收到回复后,会检查回复中leader_epoch参数的值是否和自己的配置纪元相同,如果相同,源Sentinel会取leader_runid,如果这也相同,那么标识目标Sentinel将源Sentinel设置成了局部领头Sentinel。
  • Sentinel中同样有自己的时间事件会被定期触发,当Sentinel状态为:SENTINEL_FAILOVER_STATE_WAIT_START,会触发选举的投票结果统计,如果某个Sentinel获得超过半数及以上的选票(>=voters/2+1),那么这个Sentinel将称为领头Sentinel。
  • 如果在给定时限内,没有一个Sentinel成为领头Sentinel,那么会在一段时间后再次进行选举,直到出现领头Sentinel。

ps:因为领头 Sentinel 的产生需要半数以上 Sentinel 的支持,并且每个 Sentinel 在每个配置纪元里面只能投一次票 ,所以在一个配置纪元里面,只会出现一个领头 Sentinel 。

3.2 选出新的主服务器

在选举出领头Sentinel后,领头Sentinel将对已下线的主服务器执行故障转移操作。而故障转移操作的第一步要做的就是在已下线主服务器属下的所有从服务器中,挑选出一个状态良好、数据完整的从服务器,然后向这个从服务器发送SLAVEOF no one命令, 将这个从服务器转为主服务器。

领头Sentinel会将已下线的主服务下所有从服务器保存到一个列表里,然后按照以下规则逐一过滤:

  • 删除列表中所有处于下线或者断线状态的从服务器:保证剩余从服务器都是正常在线的。
  • 删除列表中所有最近5秒内没有回复过领头Sentinel的INFO命令的从服务器:保证剩余从服务器都是最近成功进行过通信的。
  • 删除所有与已下线主服务器连接断开超过down-after-milliseconds*10毫秒的从服务器:保证剩余从服务器保存的数据都是比较新的。
  • 之后,将根据从服务器的优先级对列表服务器进行排序,并选出优先级最高的从服务器。
  • 如果优先级一样,则按照从服务器的复制偏移量,最大的当选(越大保存的数据越完整,可以参考上一篇文章主从复制)。
  • 如果偏移量也一样,那就对运行ID排序,选出其中运行ID最小的从服务器。

被选出的从服务器发送SLAVEOF no one命令后,领头Sentinel会以每秒一次的频率,向被升级的从服务器发送INFO命令,并观察回复中的角色(role)信息,当role从原来的slave变为master时,从服务器就已经顺利升级为主服务器了。

3.3 修改从服务器的复制目标

当新的主服务器升级完成后,下一步走的就是让已下线主服务器下的所有从服务器去复制新的主服务器,这一操作主要用SLAVEOF <master_ip> <master_port>来实现。

3.4 将旧的主服务器变为从服务器

故障转移最后要做的是将已下线的主服务器设置为新的主服务器的从服务器,过程也很简单,就是当旧的主服务器再次上线时,Sentinel就会向他发送SLAVEOF命令,让它成为新的主服务器的从服务器。

四、优缺点

优点:

  • 哨兵模式是基于主从模式的,解决可主从模式中master故障不可以自动切换故障的问题。

缺点:

  • 是一种中心化的集群实现方案:始终只有一个Redis主机来接收和处理写请求,写操作受单机瓶颈影响。
  • 集群里所有节点保存的都是全量数据浪费内存空间,没有真正实现分布式存储。数据量过大时,主从同步严重影响master的性能。
  • Redis主机宕机后,哨兵模式正在投票选举的情况之外,因为投票选举结束之前,谁也不知道主机和从机是谁,此时Redis也会开启保护机制,禁止写操作,直到选举出了新的Redis主机。

End:希望对大家有所帮助,如果有纰漏或者更好的想法,请您一定不要吝啬你的赐教🙋。 

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

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

相关文章

ping多个IP的工具

Ping Tool 项目地址 python开发的IP搜索小工具 ping一个网段所有IP&#xff0c;显示结果查看某个ip地址开放监听的端口配置可保存

Python基于opencv的人脸识别上课签到考勤系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

MATLAB环境下基于图像处理的计算病理学图像分割(MATLAB R2021B)

人工智能是病理学诊断和研究的重要新兴方法&#xff0c;其不仅可用于病理形态数据分析&#xff0c;还可整合免疫组化、分子检测数据和临床信息&#xff0c;得出综合的病理诊断报告&#xff0c;为患者提供预后信息和精准的药物治疗指导。计算病理学是病理学与AI、计算机视觉等信…

vant van-field 密码输入框小程序里隐藏、显示密码bug总结

老规矩先上效果图: vant 输入框组件 密码的隐藏与显示功能&#xff1a; 注: 用password属性控制密码的显示与隐藏 不要用type属性&#xff0c;type属性在真机上有时会没有效果 1、当然如果只用typepassword 不需要切换显示、隐藏也可以使用。 2、如果用到了密码的显示与…

面试问答之Spring进阶

文章目录 &#x1f412;个人主页&#xff1a;信计2102罗铠威&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;说说你对Spring的认识与理解&#x1f415;Bean的分类&#x1f415; BeanFactory 接口和ApplicationContex 接口 的区别&#x1f415;SpringBe…

CIA402协议笔记

文章目录 1、对象字典1.1 Mode of Operation&#xff08; 606 0 h 6060_h 6060h​)1.2 Modes of opration display( 606 1 h ) 6061_h) 6061h​) 2、状态机2.1 控制字&#xff08;ControlWord、6040h&#xff09;2.2 状态字&#xff08;StatusWord、6041h&#xff09;2.3 shutd…

视频扩散模型介绍 Video Diffusion Models Introduction

视频扩散模型介绍 Video Diffusion Models Introduction Diffusion 扩散模型中的一些概念DDPMDDIMCLIPLatent DiffusionStable DiifusionLoRADreamBoothControlNet 视频生成评估标准图片层面视频层面 前人的工作Make-A-VideoAlign your Latents 开源视频生成模型ModelScopeT2V&…

蓝桥杯-Set

目录 HashSet类常用方法 1 add(Object obj)方法 2 size() 方法 3 remove(Object obj)方法 4 contains()方法 5 clear() 方法 例题实战 set 一个不允许出现重复的元素&#xff0c;并且无序的集合&#xff0c;主要有HashSet实现类。 在判断重复元素的时候&#xff0c;Set集…

本地知识库搭建成功后,企业效率真的翻倍了

在如今这个快节奏的信息时代&#xff0c;对企业来说&#xff0c;拥有一套高效的知识管理系统早已不再是选项&#xff0c;而是必要。而本地知识库&#xff0c;它这个集信息存储、管理和查询于一体的平台&#xff0c;不仅改变了公司信息资源共享的方式&#xff0c;还帮助进一步提…

OpenCV学习笔记(二)——OpenCV简介

目录 图像基础和简介 OpenCV简介 OpenCV的发展历史 OpenCV的应用 OpenCV的核心模块 图像基础和简介 人们通过肉眼所看见的世界是通过图像来呈现的&#xff0c;那么什么是图像呢&#xff1f;在计算机里面&#xff0c;最基本的组成单元就是像素&#xff0c;图像是很多像素的…

基于单片机的医院输液系统设计

目 录 摘 要 Ⅰ Abstract Ⅱ 引 言 1 1系统方案设计与论证 3 1.1系统硬件结构总体设计方案 3 1.2点滴速度测量电路方案的选择与论证 3 1.3液面检测电路方案的选择与论证 4 1.4通过电机控制滴速电路的方案与论证 4 1.5显示器接口电路方案选择与论证 5 1.6键盘接口电路方案选择与…

(黑马出品_03)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_03&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术Docker 今日目标1.初识Docker1.1.什么是Docker1.1.1.应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2…

【REST2SQL】11 基于jwt-go生成token与验证

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 【REST2SQL】07 GO 操作 Mysql 数据库 【RE…

紧握时代契机链接亿万家庭 创维汽车2024全球经销商大会圆满召开

3月6日&#xff0c;以“极致 见新境”创维汽车2024全球经销商大会在徐州隆重举行。徐州经开区管委会副主任季洪志&#xff0c;缅甸驻华大使馆商务参赞 Win Myat Aung&#xff0c;法国中小企业联盟主席 Xavier Michon-Lehnebach&#xff0c;创维集团、创维汽车创始人黄宏生&…

php常见的45个漏洞及解决方案

[TOC]&#xff08;太多了&#xff0c;目录只列出最重要的几个&#xff0c;剩下的同学们自己翻&#xff09; PHP作为一种广泛应用的服务器端脚本语言&#xff0c;在历史上曾曝出过多种安全漏洞。以下是一些PHP漏洞的类别及其简要解释&#xff0c;以及如何解决这些问题&#xff1…

Java精品项目--第5期基于SpringBoot的高速收费系统的设计分析与实现

项目使用技术栈 SpringBootMavenShiroMySQLMybatis-PlusJavaJDK1.8HTML 系统介绍 项目截图

dolphinscheduler试用(一)(边用边修bug。。。。create tenant error)

&#xff08;作者&#xff1a;陈玓玏&#xff09; 前提&#xff1a;部署好了dolphinscheduler&#xff0c;部署篇见https://blog.csdn.net/weixin_39750084/article/details/136306890?spm1001.2014.3001.5501 官方文档见&#xff1a;https://dolphinscheduler.apache.org/…

JavaEE进阶(13)案例综合练习——博客系统

接上次博客&#xff1a;JavaEE进阶&#xff08;12&#xff09;Spring事务和事务传播机制&#xff1a;事务回顾、Spring中事务的实现、Transactional详解&#xff08;用法、rollbackFor、事务隔离级别、事务传播机制&#xff09;-CSDN博客 目录 项目介绍 准备工作 数据准备 …

如何给Vue项目配置好一个nginx.conf文件?

如何给Vue项目配置好一个nginx.conf文件&#xff1f; 一般前端项目中&#xff0c;会有一个docker/nginx/nginx.conf文件&#xff0c;用于配置DockerFile配置等。 那么&#xff0c;如何给项目写好一个nginx.conf文件&#xff0c;以DockerFile为例&#xff1a; # 使用 Node.js …

《辐射4》是一款什么样的游戏 怎样在mac电脑上玩到《辐射4》辐射4攻略 辐射4开局加点 怎么在Mac电脑玩Steam游戏

辐射4&#xff08;Fallout 4&#xff09;是由Bethesda开发的一款动作角色扮演类游戏&#xff0c;为《辐射》系列游戏作品的第四代&#xff0c;于2015年11月10日发行。游戏叙述了主角一家在核爆当天&#xff08;2077年10月23日&#xff09;&#xff0c;被Vault-Tec&#xff08;避…