Redis7【⑦ Redis哨兵(sentinel)】

news2024/9/21 14:45:56

Redis哨兵

Redis Sentinel(哨兵)是 Redis 的高可用性解决方案之一,它可以用于监控和管理 Redis 主从复制集群,并在主节点发生故障时自动将从节点升级为新的主节点,从而保证系统的高可用性和可靠性。

Redis Sentinel 的主要功能如下:

  1. 监控 Redis 主节点和从节点的状态,包括节点的可用性、延迟等情况。
  2. 自动发现和识别 Redis 主从复制集群的拓扑结构。
  3. 在主节点发生故障时,自动将从节点升级为新的主节点,并将其他从节点重新连接到新的主节点。
  4. 支持 Redis 集群的自动故障转移、故障恢复和配置管理等功能。
  5. 提供监控和管理 Redis 集群的 API 和命令行工具。


在这里插入图片描述

1. 环境配置

(1)配置三个哨兵实例

三个哨兵实例需要三台虚拟机,考虑到机器性能有限,这里将三个哨兵实例配置到一台虚拟机上(这里配置到主节点的那台虚拟机),配置三份不同的哨兵配置文件即可:sentinel26379.conf、sentinel26380.conf、sentinel26381.conf,将它们存放到/myredis下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ec26k4md-1687955266273)(img/2023-04-15_030538.png)]

(2)修改哨兵配置文件的内容

  • 基础配置
    在这里插入图片描述

    • 关闭保护模式:protected-mode no
    • 开启后台运行:daemonize yes
    • 配置哨兵服务端口号:port 26379 (三个文件要不一样)
    • 日志文件路径:logfile "/myredis/sentinel26379.log"
    • pid文件路径:pidfile /var/run/redis-sentinel26379.pid
    • 工作目录:dir /myredis
  • 主要配置

    • 设置要监控的master:master monitor <master-name> <ip> <redis-port> <quorum>

      master-name:给master取的名字。

      quorum:同意故障迁移的法定票数。即表示有几个哨兵认可主观下线。达到一定票数后认定为客观下线(宕机、不可用)

    • 配置连接master服务的密码:sentinel-auth-pass <master-name> <password>

  • 其他配置(使用默认即可,重点是主观下线)

    • sentinel down-after-milliseconds <master-name> <milliseconds>

      指定多少毫秒之后,主节点没有应答哨兵,此时哨兵主观上认为主节点下线 — 主观下线

    • sentinel parallel-syncs <master-name> <nums>

      表示允许并行同步的slave个数,当master挂了后,哨兵会选出新的master,剩余的slave会向新的master发起同步数据

    • sentinel failover-timeout <master-name> <milliseconds>

      故障转移的超时时间,进行故障转移时,如果超过设置的毫秒,表示故障转移失败,相当于选举成功,但是数据转移失败了

    • sentinel notification-script <master-name> <script-path>

      配置当某一事件发生时所需要执行的脚本

    • sentinel client-reconfig-script <master-name> <script-path>

      客户端重新配置主节点参数脚本

去除配置文件的注释,最终配置文件sentinel26379.conf的内容如下,sentinel26380.conf和sentinel26381.conf稍作修改即可

bind 0.0.0.0
daemonize yes
protected-mode no
port 26379
logfile "/myredis/sentinel26379.log"
pidfile /var/run/redis-sentinel26379.pid
dir /myredis
sentinel monitor mymaster 192.168.101.110 6379 2
sentinel auth-pass mymaster 123456

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aL2cW66P-1687955266274)(img/2023-04-15_035110.png)]

(3)配置主节点的访问密码

主节点宕机后,哨兵会选举一个从节点作为主节点,而之前的主节点会变成从节点,所以需要配置访问新主节点的密码。

这里所有节点都设置为同一密码,方便操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YYxVO1h5-1687955266275)(img/2023-04-15_040008.png)]

2. 实操演示

2.1 启动三个redis实例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FaNL8fJL-1687955266275)(img/2023-04-15_041926.png)]

2.2 启动三个哨兵实例

这里在redis(6379)那台机器上启动三个哨兵实例。

启动哨兵服务有两种方式:

  • 使用redis-sentinel程序启动:redis-sentinel sentinel.conf
  • 使用redis-server程序启动:redis-server sentinel.conf --sentinel

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9xlzgWHZ-1687955266275)(img/2023-04-15_043016.png)]

lsof -i|grep redis 可以看到哨兵之间也是有通信的

2.3 测试主从复制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DdqMFZ0g-1687955266276)(img/2023-04-15_044818.png)]

2.4 查看sentinel日志文件

工作中排查问题肯定是要去查日志文件,这里可以发现,每个哨兵都会在日志把主机和从机记录,也会把所有其他哨兵一并记录,日志中写明他们保存在 disk,也就是磁盘里,那么我们要去哪里找到他们呢?
其实这里是重写了conf的配置文件,把相应的关系和信息都写入配置文件里了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rLqEPtBC-1687955266276)(img/2023-04-15_045331.png)]

下面查看sentinel26379.log文件的主要内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gJdCbHD4-1687955266276)(img/2023-04-15_045716.png)]
了解 Broken pipe
在这里插入图片描述

新配置保存到磁盘的意思就是新配置信息写入到sentinel.conf文件中,下面查看sentinel26379.conf文件新增的内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NzSsauLI-1687955266277)(img/2023-04-15_065615.png)]

2.5 模拟master节点宕机

关闭master节点后,哨兵会重新选举一个从节点作为新的主节点。

首先三个哨兵实例会投票选举一个哨兵实例作为领导者,然后由该哨兵实例来选举一个新的主节点并且进行故障迁移(failover)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cb3tik0Z-1687955266277)(img/2023-04-15_055113.png)]

  • 查看sentinel26379.log日志文件了解哨兵选举的过程:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s13RKcNI-1687955266277)(img/2023-04-15_052907.png)]

  • 查看redis(6379)实例的redis.conf文件哨兵leader新增的内容:

    redis(6379)实例由之前的主节点变成从节点

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dEbWv15C-1687955266278)(img/2023-04-15_062500.png)]

  • 查看redis1(6380)实例的redis.conf文件哨兵leader修改的内容:

    redis1(6380)实例由之前的从节点变成主节点

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m2edawX3-1687955266278)(img/image-20230415063454674.png)]

  • 查看redis2(6381)实例的redis.conf文件哨兵leader修改的内容:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4EKYRvr8-1687955266278)(img/2023-04-15_064629.png)]


3. 哨兵选举的流程

  1. 哨兵检测到主节点不可用:当哨兵检测到主节点不可用时,会将主节点标记为下线状态(sdown),并向其他哨兵发送通知,通知其他哨兵主节点已经下线,其他哨兵也标记主节点下线后(odown),确定主节点不可用。

    主观下线(sdown):指的是单个Sentinel实例对服务器做出的下线判断,即单个sentinel认为某个服务下线(有可能是接收不到订阅,之间的网络不通等等原因)。主观下线就是说如果服务器在sentinel down-after-milliseconds给定的毫秒数之内没有回应PING命令或者返回一个错误消息, 那么这个Sentinel会主观的(单方面的)认为这个master不可以用了。默认30秒。
    在这里插入图片描述

    客观下线(odown):客观下线需要多个哨兵达成一致意见才能认为主节点真正不可用。
    quorum(票数)这个参数是进行客观下线的一个依据。法定人数/法定票数(quorum)。
    在这里插入图片描述

  2. 哨兵投票选举哨兵leader:哨兵在检测到主节点不可用后,会进入选举状态,此时哨兵将开始选举哨兵的领导者。(哨兵中选出一个兵王)

    监视该主节点的所有哨兵都有可能被选为领导者,选举使用的算法是Raft算法;Raft算法的基本思路是先到先得:
    1要票,23没有投过,要票成功,2要票,只能要到1,3要票,要不到,都投过,应该是没人手里一张票,具体高级篇会细致讲解

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dDxMmiLj-1687955266278)(img/哨兵选举.png)]

  3. 哨兵leader开始推动故障切换流程并选举出一个新的master
    在这里插入图片描述

    在从节点中选出新的master的规则:
    ①redis.conf中优先级slave-priority或replica-priority高的从节点优先(数值越小优先级越高)
    在这里插入图片描述

    ②复制偏移量(offset)大的从节点优先。
    ③Run ID最小的从节点优先(按字典顺序、ASCII码值比较),每个redis实例启动后都会随机生成一个40位的run id。

  4. 选举出新的master后由Sentinel leader完成failover工作(故障切换)

    • 执行slaveof no one命令让选出来的从节点成为新的主节点,并通过slaveof命令让其他节点(包括原来的master)成为新主节点的从节点。
    • Sentinel leader会向被重新配置的实例发送一个 CONFIG REWRITE 命令, 从而确保这些配置会持久化在硬盘里(写入配置文件)。
    • 将之前已下线的老master设置为新选出的新master的从节点,当老master重新上线,它会成为新master的从节点,sentinel leader会让原来的master降级为slave并恢复正常工作。不用上线,就已经在log中写为slave,下次上线会对它重新配置。

4. 小总结

  • 哨兵实例的数量应为多个,哨兵本身应该集群,保证高可用

  • 哨兵实例的个数应该为奇数,方便投票选出Sentinel Leader

  • 各个哨兵实例的配置应该一致

  • 哨兵集群+主从复制,并不能保证数据零丢失(引出集群cluster,集群可以解决这一问题)

    master宕机后,哨兵需要在一定时间内选出新的master并执行failover操作,这段时间内从节点无法写入数据,造成数据丢失。

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

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

相关文章

v8-tc39-ecma262:数组push执行了什么?

v8开发文档介绍 v8新特性 tc39-ecma262-push函数执行步骤 上图步骤&#xff0c;解释如下&#xff1a; 如果是对象&#xff0c;则当作对象调用设置该值如果是类数组&#xff0c;则执行类数组调用设置该值如果参数有多个参数&#xff0c;则&#xff1a;如果&#xff0c;参数长度…

golang,OpenGL,计算机图形学(二)

代码仓库 https://github.com/phprao/go-graphic 变换 矩阵操作与向量操作&#xff1a;https://learnopengl-cn.github.io/01%20Getting%20started/07%20Transformations/ 在OpenGL中&#xff0c;由于某些原因我们通常使用44的变换矩阵&#xff0c;而其中最重要的原因就是大…

uniapp的表单校验方式整理

uniapp的表单校验方式整理 这里我使用的模板为&#xff1a; 第一种&#xff1a; uniapp本身自带表单校验的js文件&#xff0c;代码写的很简洁&#xff0c;也是比较全面的 只要按照规则校验即可&#xff0c;下面是对应的校验代码&#xff1a; /** 数据验证&#xff08;表…

Jenkins 2.4 创建子节点

在 Dashboard > 系统管理 > 节点列表 页面&#xff0c;选择 New Node 按钮&#xff0c;新建节点 windows_10&#xff0c;节点类型选择 固定节点&#xff0c;点击 Create 创建&#xff1a; 将 远程工作目录 设置子节点电脑上的执行工作目录&#xff0c;例如在D盘创建一个 …

Django框架-3

使用admin后台管理数据 创建模型类 模型类&#xff1a;应用中的models.py文件中 from django.db import models# Create your models here. # 模型类必须要继承models.Model class doogs(models.Model):# 属性create_time models.DateTimeField(auto_now_addTrue, verbose_…

新闻丨INDEMIND荣获2023年北京市朝阳区创新型中小型企业认定

近日&#xff0c;北京市朝阳区科学技术和信息化局公布了“朝阳区2023年度第五批创新型中小企业名单”&#xff0c;INDEMIND凭借专业研发和创新能力等优势&#xff0c;成功入选。 创新型中小企业名单依据工业和信息化部2022年6月发布《优质中小企业梯度培育管理暂行办法》&#…

Golang每日一练(leetDay0111) 摆动排序II\I Wiggle Sort

目录 324. 摆动排序 II Wiggle Sort ii &#x1f31f;&#x1f31f; 280. 摆动排序 I Wiggle Sort i &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每…

威胁建模之绘制数据流图

0x00 前言 1、什么是威胁建模&#xff1a; 以结构化的方式思考、记录并讨论系统存在的安全威胁&#xff0c;并针对这些威胁制定相应的消减措施。 2、为什么要威胁建模&#xff1a; &#xff08;1&#xff09;在设计阶段开展威胁建模&#xff0c;一方面可以更全面的发现系统存…

数据结构--静态链表

数据结构–静态链表 单链表 VS 静态链表 单链表:各个结点在内存中星罗棋布、散落天涯。 静态链表:分配一整片连续的内存空间&#xff0c;各个结点集中安置。 代码定义 代码一&#xff1a; #define MaxSize 10 //静态链表的最大长度 typedef struct //静态链表结构类型的定…

无限容量分布式文件存储解决方案

常见分布式文件系统 常见分布式文件系统比较 常见的分布式文件系统有GFS、HDFS 、Ceph 、GridFS 、TFS、FastDFS等。各自适用于不同的领域。 类 Google FS 都支持文件冗余备份&#xff0c;例如 Google FS、TFS 的备份数是 3。一个文件存储到哪几个存储结点&#xff0c;通常采…

《计算机系统与网络安全》第一章 计算机系统与网络安全概述

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

java的注解方式和xml方式这两种方式对数据库进行操作详解

首先需要引入mybatisplus包 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.1</version> </dependency>第一种注解方式&#xff1a;参数是通过#{}来接收的 p…

腾讯云服务-云点播:删除腾讯云点播录制的视频文件(保存在腾讯云是需要收费的)

文档地址&#xff1a;登录 - 腾讯云https://console.cloud.tencent.com/api/explorer?Productvod&Version2018-07-17&ActionDeleteMedia 使用python后端删除&#xff1a; import json from tencentcloud.common import credential from tencentcloud.common.profile…

kafka入门,数据有序、数据乱序(十)

数据有序 数据乱序 max.in.flight.requests.per.connection指定了生产者在接收到服务器相应之前可以发送多个消息。 kafka在1.x版本之前保证单分区有序&#xff0c;条件如下 max.in.flight.requests.per.connection1 2) kafka在1.x及以后版本保证数据单区间分区有序&#xff0…

vue 函数式(编程式) render (functional:true)

文章目录 一、文档二、区别三、使用h函数的参数解释&#xff1a;参数一&#xff1a;使用导入的组件名 参数二&#xff1a;绑定css绑定事件往组件里面传递参数动态绑定值props动态绑定值datafunctional:true到底是做什么的&#xff1f;动态绑定props 非functional:true版本 参数…

JSONUtil.toJsonStr 时间变成了时间戳

问题描述 我的接口是以Date来接收日期的&#xff0c;然后我在拿到这个对象参数后&#xff0c;通过hutool当中的JSONUtil.toJsonStr将其序列化成json字符串&#xff0c;然后存储到数据库。然后存储到数据库当中发现这个字段是时间戳。 DateTimeFormat和JsonFormat 前者是控制 请…

动态规划详解Python

动态规划 动态规划&#xff08;Dynamic Programming&#xff09;是一种用于解决复杂问题的算法设计方法。它通常用于优化问题&#xff0c;其中问题可以被分解成一系列重叠子问题&#xff0c;通过存储并重复使用已经解决过的子问题的解&#xff0c;可以避免重复计算&#xff0c…

区块链的简单认识

比特币作为区块链的应用&#xff0c;让区块链广为人知&#xff0c;如果比特币作为第一代区块链&#xff0c;则以太坊则称为第二代区块链。我们知道&#xff0c;区块链的最主要目的就是去中心化&#xff0c;比特币则成为了decentralized currency&#xff0c;去中心化在技术上依…

跨注册中心服务同步实践

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面…

助你丝滑过度到 Vue3 创建工程 ②③

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; VUE3~TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f449;…