Redis配置哨兵及其机制

news2025/7/15 1:20:51

目录

  • 一、Redis哨兵诞生背景
  • 二、关于哨兵
  • 三、哨兵机制的基本流程
    • 3.1 监控
    • 3.2 选主
    • 3.3 通知
  • 四、关于主观下线和客观下线
    • 4.1 主观下线
    • 4.2 客观下线
  • 五、选主规则
    • 3.1 优先级最高的从库得分高
    • 3.2 和旧主库同步程度最接近的从库得分高
    • 3.3 ID 号小的从库得分高
  • 六、配置流程
  • 七、总结

一、Redis哨兵诞生背景

在Redis主从复制的场景下,如果从库宕机,主库以及其它从库可以正常工作。但是主库挂掉后,虽然从库可以继续为客户端提供读请求,但是,却没有实例来继续完成读请求了。

在这里插入图片描述
主库挂掉后数据该往哪写?如何保证业务的可持续运行?

这儿就需要Redis的哨兵来解决了。

二、关于哨兵

哨兵是一个独立的 Redis 进程,示例:

[root@iZ2zehs3cdd8rznk6ueeisZ ~]# ps aux | grep redis
redis    3040441  0.0  0.1  61984  4376 ?        Ssl  Nov11   3:21 /www/server/redis/src/redis-server 127.0.0.1:6379
root     3419825  0.0  0.3  61984 12832 pts/1    Sl+  08:52   0:00 /www/server/redis/src/redis-sentinel *:26379 [sentinel]
root     3419889  0.0  0.0  12132  1144 pts/2    S+   08:52   0:00 grep --color=auto redis

Sentinel(哨兵) 是用于监控 Redis 的主从实例,是 Redis 高可用的一个解决方案。当 Master 服务宕机后,能通过其余的 Slave 服务来选举出新的 Master 服务。解决了主从同步过程中主库宕机的问题。

三、哨兵机制的基本流程

哨兵主要的三个任务:监控、选主(选举新的主库)、通知。

在这里插入图片描述

3.1 监控

监控是指哨兵在运行的过程中,周期性的给所有主从库发送 PING 命令,检测它们是否在线。

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

同样,如果主库没有在规定时间相应哨兵的 PING 命令,哨兵就会判断主库下线,然后进行 自动切换主库 的流程。

3.2 选主

这个流程是哨兵的第二个任务。

当主库挂掉后,哨兵会在多个从库中,按照一个规则选出一个新的主库。

3.3 通知

通知是哨兵执行的最后一个任务。

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

四、关于主观下线和客观下线

哨兵的第一个任务就是监控,在监控的过程中有两个概念:主观下线和客观下线。

4.1 主观下线

哨兵进程会使用 PING 命令检测它自己和主、从库的网络连接情况,用来判断实例的状态。如果哨兵发现主库或从库对 PING 命令的响应超时了,那么,哨兵就会先把它标记为 主观下线

如果检测的是从库,那么,哨兵简单地把它标记为 主观下线 就行了,因为从库的下线影响一般不太大,集群的对外服务不会间断。

4.2 客观下线

但是如果检测的是主库,那么就不能简单的标记为客观下线了,因为在特殊的情况下哨兵会误判,导致进行主从切换,本来主库没问题的,一旦进行切换,会造成多余的计算及开销。

关于造成误判的原因:

  • 集群网络压力较大
  • 主库读写压力大
  • 网络延迟

如何避免这个问题呢?那就需要标记为客观下线了。

客观下线是所有哨兵一起判断,多数人认为主库下线了,才算真下线,才能进行后续切换。

引入多个哨兵实例一起来判断,就可以避免单个哨兵因为自身网络状况不好,而误判主库下线的情况。同时,多个哨兵的网络同时不稳定的概率较小,由它们一起做决策,误判率也能降低。

在这里插入图片描述

多数服从少数,当有 N 个哨兵实例时,最好要有 N/2 + 1 个实例判断主库为 主观下线,才能最终判定主库为 客观下线

五、选主规则

选主的时候,主要过程是:筛选 + 打分

先筛选掉一部分不符合规则的从库,在对剩下的从库进行打分,得分高者将成为主库。

在这里插入图片描述

在筛选的过程中,不但要看当前从库的状态,如果从库当前的状态是连接状态,那么不能说明当前从库的状态就是好的。例如,选了这个当前正在连接状态的从库,但是以前的网络状态不好,导致它成为了主库后,很快就宕机了,这就不符合我们的预期了。

因此,除了判断当前实例的网络状态,还要要先进行判断之前的网络状态。

接下来就要给剩余的从库打分了。

3.1 优先级最高的从库得分高

用户可以通过 slave-priority 配置项,给不同的从库设置不同优先级。

在选主时,哨兵会给优先级高的从库打高分,如果有一个从库优先级最高,那么它就是新主库了。如果从库的优先级都一样,那么哨兵开始第二轮打分。

3.2 和旧主库同步程度最接近的从库得分高

主从库同步时有个命令传播的过程。在这个过程中,主库会用 master_repl_offset 记录当前的最新写操作在 repl_backlog_buffer 中的位置,而从库会用 slave_repl_offset 这个值记录当前的复制进度。

此时,我们想要找的从库,它的 slave_repl_offset 需要最接近 master_repl_offset。如果在所有从库中,有从库的 slave_repl_offset 最接近 master_repl_offset,那么它的得分就最高,可以作为新主库。

就像下图所示,旧主库的 master_repl_offset 是 1000,从库 1、2 和 3 的 slave_repl_offset 分别是 950、990 和 900,那么,从库 2 就应该被选为新主库。

在这里插入图片描述

如果有两个从库的 slave_repl_offset 值大小是一样的(例如,从库 1 和从库 2 的 slave_repl_offset 值都是 990),我们就需要给它们进行第三轮打分了。

3.3 ID 号小的从库得分高

每个实例都会有一个 ID,这个 ID 就类似于这里的从库的编号。目前,Redis 在选主库时,有一个默认的规定:在优先级和复制进度都相同的情况下,ID 号最小的从库得分最高,会被选为新主库。

六、配置流程

首先,先搞好主从同步,我搞了四台服务器,配置了一主三从。

关于 Redis 搭建主从同步:链接: Redis 搭建主从同步

修改四台服务器中的配置文件:sentinel.conf(通常该文件和 redis.conf 同目录)

四台服务器中配置相同几乎一样,本示例只为了实现该效果,如果在生产环境中搭建,需要根据自己的业务需求来配置不同的参数项。

sentinel.conf

sentinel announce-ip 39.101.1.111 #很多人测试是用的一台服务器,多个不同端口的redis服务,我这边是多个服务器,因此要指定当前ip,不同服务器用不同的当前IP。
sentinel monitor mymaster 39.101.1.111 6379 2 # 指定主库IP地址以及端口

四台服务器的 sentinel.conf 编辑完后,各自启动:/www/server/redis/src/redis-sentinel sentinel.conf

在这里插入图片描述

七、总结

Redis 哨兵是为了解决 Redis 主从同步的时候宕机问题,是 Redis一种高可用的实现方案。

但是哨兵也会宕机,这时候又需要 Redis集群来解决了……

参考文档:https://time.geekbang.org/column/article/274483

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

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

相关文章

网络面试-0x10地址栏输入URL敲入回车后发生了什么?

一、 URL解析 1、 首先判断你输入的是一个合法的URL还是待搜索的关键字 2、如果是URL,对URL进行解析 二、 DNS查询 1、设备 —— 本地DNS服务器 —— xx 递归过程 2、DNS服务器和 顶级域名服务器、二级域名服务器、权威域名服务器之间是迭代过程。 三、 TCP连接 …

redis和selery相关知识点

目录标题一:redis字符串操作二:redis hash操作三:redis列表操作四:redis管道1.redis数据库,是否支持事务?2.redis代码实现事务五:redis其他操作六:django中集成redis1.方式一:直接使…

用python就获取到照片拍摄时的详细位置【源码公开】

文章目录一.引言1.读取照片信息,获取坐标2.通过baidu Map的API将GPS信息转换成地址。二.源码附上!!!注意事项一.引言 先看获取到的效果 拍摄时间:2021:12:18 16:22:13 照片拍摄地址:(内蒙古自治区包头市昆都仑区, 内…

pytorch从零开始搭建神经网络

目录 基本流程 一、数据处理 二、模型搭建 三、定义代价函数&优化器 四、训练 附录 nn.Sequential nn.Module model.train() 和 model.eval() 损失 图神经网络 基本流程 《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibili1. 数据预处理(Dataset、…

由浅入深,一起来刷Java高级开发岗面试指南,明年面试必定无忧!

前言 我只想面个CV工程师,面试官偏偏让我挑战造火箭工程师,加上今年这个情况更是前后两男,但再难苟且的生活还要继续,饭碗还是要继续找的。在最近的面试中我一直在总结,每次面试回来也都会复盘,下面是我根…

为啥50岁以后,病就增多了?中老年人想要少生病,该做些什么?

人到中年,生活会有很多变化,很多男性朋友从以前别人口中的小伙子,变成现在家里的顶梁柱,很多以前别人口中的小姑娘,变成现在的贤妻良母,或者拥有自己的一番事业。角色在变化的同时,身体情况也发…

高压电气系统验证

纯电和混合动力汽车中的高压电气系统关乎整车的能耗和安全,需要在部件及整车开发阶段做全面的测试与验证。符合ISO 21498*标准的电压、电流一体式测量模块CSM HV BM系列产品,可以直接串联在整车级别的高压电气线缆中,安全可靠的完成高压电气系…

java面试强基(2)

字符型常量和字符串常量的区别? 形式 : 字符常量是单引号引起的一个字符,字符串常量是双引号引起的 0 个或若干个字符。 含义 : 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置)。 占内存大小 &…

SpringCloud 核心组件Feign【远程调用自定义配置】

目录 1,Feign远程调用 1.1:Feign概述 1.2:Feign替代RestTemplate 1):引入依赖 2):添加注解 3):编写Feign的消费服务,提供服务 4):测…

C. Discrete Acceleration(浮点二分)

Problem - 1408C - Codeforces 题意: 有一条长度为l米的道路。路的起点坐标为0,路的终点坐标为l。 有两辆汽车,第一辆站在路的起点,第二辆站在路的终点。它们将同时开始行驶。第一辆车将从起点开到终点,第二辆车将从终点开到起…

通俗易懂的React事件系统工作原理

前言 React 为我们提供了一套虚拟的事件系统,这套虚拟事件系统是如何工作的,笔者对源码做了一次梳理,整理了下面的文档供大家参考。 在 React事件介绍 中介绍了合成事件对象以及为什么提供合成事件对象,主要原因是因为 React 想…

【附源码】Python计算机毕业设计图书商城购物系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

MongoDB学习一:相关概念和单机部署

目录一、MongoDB 应用场景:二、什么时候使用MongoDB:三、MongoDB简介:四、体系结构:五、数据模型:六、MongoDB的特点:七、MongoDB单机部署一、MongoDB 应用场景: 二、什么时候使用MongoDB&#…

对FD描述符(包括inode以及三张表)的一点理解

文件描述符,简单来说是一个从0开始递增的非负整数。 具体来说是linux/unix对文件系统的一种底层抽象,这种抽象是通过三张表来实现的。 这三张表分别是: 1.进程级的文件描述符表;(文件标志位/文件指针) 2.系统级的打开文件描述…

Android Studio App开发之下载管理器DownloadManager中显示、轮询下载进度、利用POST上传文件讲解及实战(附源码)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、在通知栏显示下载进度 利用GET方式读取数据有很多缺点比如1:无法端点续传 一旦中途失败只能重新获取 2:不是真正意义上的下载操作 无法设置参数 3:下载过程中无法在界面上上展示下…

NAFNet(ECCV 2022)-图像修复论文解读

文章目录解决问题算法背景Simple BaselinePlain Block归一化激活函数Attention机制总结NAFNetSimpleGate替换GELUSCA替换CA总结实验应用RGB图像去噪图像去模糊RAW图像去噪结论论文: 《Simple Baselines for Image Restoration》github: https://github.com/megvii-research/NAF…

同事:这个页面的逻辑没什么能复用的,不抽组件也没什么影响吧?

前言 最近在维护同事的一个项目时,发现有不少单个vue文件一千余行,同一个文件上有倒计时、有输入信息的表单; 当时我就在想:是不是策划经常改需求或者排期紧急,所以没抽组件呢。 沟通过程 以下同事称为阿A 我&#…

【附源码】计算机毕业设计JAVA家庭理财管理系统

项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: Springboot mybatis Maven Vue 等等组成,B/…

Java基础—Document类型的变化

Document类型的变化 Document类型的变化中唯一与命名空间无关的方法是importNode()。这个方法的用途是从一个文档中取得一个节点,然后将其导入到另一个文档,使其成为这个文档结构的一部分。需要注意的是,每个节点都有一个ownerDocument属性&…

G1D13-Apt论文阅读fraudgitKGbookrce33-36php环境搭建

一、APT论文 今天终于把6个模型论文和一篇综述读完了!!! 今天主要读了一篇论文写了个总表。发现之前读的论文都忘了,所以 明天要复习一下模型,记录在文档中,并完善模型对比的总表,并且把代码下…