Redis 哨兵模式的实现详解

news2025/1/1 22:58:00

文章目录

  • 高可用(HA)
  • 哨兵模式概述
  • 哨兵的搭建
    • 伪集群 + 哨兵
    • 1. 复制sentinel.conf文件
    • 2. 修改sentinel.conf文件
    • 3. 新建sentinel26380.conf
    • 4. 启动并关联Redis集群
    • 5. 启动Sentinel集群
    • 6. 查看 Sentinel 信息
    • 7. 查看 Sentinel 配置文件
  • 哨兵优化配置

高可用(HA)

所谓的高可用,也叫HA(High Availability),是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果在实际生产中,redis只部署一个节点,当机器故障时,整改服务都不能提供服务了。这就是我们常说的单点故障。如果redis部署了多台,当一台或几台故障时,整个系统依然可以对外提供服务,这样就提高了服务的可用性。

Redis的主从架构主要是为了提高并发量,主写从读。那么现在问题来了,现在Master机器挂掉了,其他机器都是Slave,没办法写,我们只能读缓存数据了。等下运维发现机子挂了,赶紧帮忙重启,那这段时间的写请求怎么办?手动解决响应是高延迟的一个操作啊。这么一说,你就会发现这样解决问题很蠢。所以Redis的哨兵机制就是为了解决这个愚蠢的问题。在Redis服务器集群出现问题时及时处理,及时进行故障转移(主备切换),减少系统不能提供服务的时间,这就是哨兵模式要解决的最重要的问题。

哨兵模式概述

哨兵模式是Redis的高可用方式,哨兵节点是特殊的redis服务,不提供读写服务,主要用来监控所有的redis节点。 哨兵架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过sentinel代理访问redis的主节点,当redis的主节点挂掉时,哨兵会第一时间感知到,并且在slave节点中重新选出来一个新的master,然后将新的master信息通知给client端,从而实现高可用。这里面redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息。

哨兵的搭建

伪集群 + 哨兵

下面将会搭建如下架构的哨兵集群

image-20230512203440068

1. 复制sentinel.conf文件

将 Redis 安装目录中的 sentinel.conf 文件复制到 cluster 目录(该目录是上次搭建伪集群建立的一个目录)中。该配置文件中用于存放一些 sentinel 集群中的一些公共配置。

2. 修改sentinel.conf文件

修改 cluster/sentinel.conf 配置文件。

  • sentinel monitor
    image-20230518090014810
    该配置用于指定 Sentinel 要监控的 master 是谁< ip >< redis-port >,并为 master 起了一个名字< master-name >。该名字在后面很多配置中都会使用。同时指定 Sentinel 集群中决定该master“客观下线状态”判断的 sentinel 数量 < quorum >。< quorum >的另一个用途与sentinel 的 Leader 选举有关。要求中至少要有 max(quorum, sentinelNum/2+1)个 sentinel 参与,选举才能进行。

    这里将该配置注释掉,因为要在后面的其它配置文件中设置,如果不注释就会出现配置冲突。

  • sentinel auth-pass
    image-20230518091116090
    如果 Redis 主从集群中的主机设置了访问密码,那么该属性就需要指定 master 的主机名与访问密码。以方便 sentinel 监控 master。

3. 新建sentinel26380.conf

在 redis 目录下的 cluster 目录中新建 sentinel26380.conf 文件作为 Sentinel 的配置文件,并在其中键入如下内容:
image-20230518092144664

include sentinel.conf
pidfile /var/run/sentinel_26380.pid
port 26380
sentinel monitor mymaster 192.168.11.10 6380 2
# 192.168.11.10是Redis服务器的IP地址
# logfile access26380.log

sentinel26380.conf文件保存退出后,在新建sentinel26381.conf和sentinel26382.conf这两个文件,文件内容就是上面的内容,只不过要把所有的26380改为26381和26382即可。最后结果如下:
image-20230518094802486

4. 启动并关联Redis集群

详见:Redis的主从集群搭建与配置
image-20230518095801879
image-20230518100058427
image-20230518100223102
image-20230518100334945

5. 启动Sentinel集群

  • 启动命令
    在/usr/local/bin 目录下有一个命令 redis-sentinel 用于启动 Sentinel。不过,我们发现一个奇怪的现象:/usr/local/bin 目录中的 redis-sentinel 命令是 redis-server 命令的软链接。
    image-20230518102748635
    查看 Redis 安装目录中的 src 目录中的 redis-server 与 redis-sentinel 命令,我们发现这两个命令的大小一模一样。其实,这两个命令本质上是同一个命令。
    image-20230518103003138
    之所以可以启动不同的进程,主要是因为在启动时所加载的配置文件的不同。所以在启动 Sentinel 时,需要指定 sentinel.conf 配置文件。

  • 两种启动方式

    Redis 首先会调用 checkForSentinelMode 函数来判断当前是否以哨兵模式来运行,并把标识赋值到 server.sentinel_mode。

    server.sentinel_mode = checkForSentinelMode(argc,argv);
    

    checkForSentinelMode 是如何判断当前是否以哨兵模式来运行:

    int checkForSentinelMode(int argc, char **argv) {
        int j;
        // 判断第一个参数是不是 redis-sentinel
        if (strstr(argv[0],"redis-sentinel") != NULL) return 1;
        // 判断其他的参数是不是 --sentinel
        for (j = 1; j < argc; j++)
            if (!strcmp(argv[j],"--sentinel")) return 1;
        return 0;
    }
    

    可以看出它是通过两个条件来判断的:

    • 执行的命令是否为 redis-sentinel。
    • 命令参数中是否含有 --sentinel。

    这就对应了我们在命令行中启动哨兵实例的两种方式,一是直接运行 redis-sentinel 命令,另一种是运行 redis-server 命令并且参数中含有 --sentinel 参数。

    • 方式一:使用 redis-sentinel 命令:redis-sentinel sentinel26380.conf
    • 方式二:使用 redis-server 命令:redis-server sentinel26380.conf --sentinel

image-20230518104745315
这样Redist的哨兵集群就搭建完成了。

6. 查看 Sentinel 信息

运行中的 Sentinel 就是一个特殊 Redis,其也可以通过客户端连接,然后通过 info sentinel来查看当前连接的 Sentinel 的信息。
image-20230518105807632

7. 查看 Sentinel 配置文件

查看端口号为26830的Sentinel的配置文件
image-20230518105924344

哨兵优化配置

在公共的 sentinel.conf 文件中,还可以通过修改一些其它属性的值来达到对 Sentinel 的配置优化。

  • sentinel down-after-milliseconds
    image-20230518111029266

    该选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。如果服务器在给定的毫秒数之内, 没有返回 Sentinel 发送的 ping 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线

  • sentinel parallel-syncs image-20230518112055724

    该选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。

    如果从服务器被设置为允许使用过期数据集(参见对 redis.conf 文件中对 slave-serve-stale-data 选项的说明), 那么你可能不希望所有从服务器都在同一时间向新的主服务器发送同步请求, 因为尽管复制过程的绝大部分步骤都不会阻塞从服务器, 但从服务器在载入主服务器发来的 RDB 文件时, 仍然会造成从服务器在一段时间内不能处理命令请求: 如果全部从服务器一起对新的主服务器进行同步, 那么就可能会造成所有从服务器在短时间内全部不可用的情况出现。

    你可以通过将这个值设为 1 来保证每次只有一个从服务器处于不能处理命令请求的状态。

  • sentinel failover-timeout
    image-20230518112628090

    指定故障转移超时时间(单位毫秒),默认3分钟,被用于下面四种场景:

    场景1:假设现在某个master节点宕机,并且现在有5个slave节点。Sentinel集群通过选举算法选择3号slave节点晋升为master,但是这个3号slave一直晋升master节点失败(故障转移失败),如果在3分钟之内这个3号slave还是无法晋升为master节点,那么Sentinel集群会重新选择一个slave节点去晋升为master节点。如果重新选择的节点在6分钟之内无法晋升为master,Sentinel集群再次重新选择一个slave节点,以此类推。

    场景2:旧的master已经宕机,新master已经上任。新master在刚开始上任时,slave节点并不会同步新master的数据,从Sentinel检测到相关错误时开始计时,会强制salve同步新master节点的数据,这时slave要在3分钟之内,把原来旧master节点的数据换成新master节点的数据。

    场景3:旧的master已经宕机,Sentinel集群准备选择一个slave节点晋升为master节点。此时晋升master节点的命令已发出,但是在较短的时间内还没有产生任何配置信息的变化,就在这时Sentinel集群突然决定撤销这个slave晋升为新master,取消这个故障转移的时间为3分钟。

    场景4:在进行故障转移时,所有slave节点同步新的master节点的数据所需的最大时间(3分钟)。如果同步时间超过了3分钟,那么sentinel parallel-syncs配置设置的值可能会无效,Sentinel会让更多的slave同时去同步新master节点的数据。

  • sentinel deny-scripts-reconfig
    image-20230518144858590

    指定是否可以通过命令 sentinel set 动态修改 notification-script 与 client-reconfig-script 两个脚本。默认是不能的(设置为yes)。这两个脚本如果允许动态修改,可能会引发安全问题。

  • 动态修改配置
    image-20230518153048350

    通过 redis-cli 连接上 Sentinel 后,通过 sentinel set 命令可动态修改配置信息。例如,上面的命令动态修改了 sentinel monitor 中的 quorum 的值。

    下表是 sentinel set 命令支持的参数(共七个):

    参数示例
    quorumsentinel set mymaster quorum 2
    down-after-millisecondssentinel set mymaster down-after-milliseconds 50000
    failover-timeoutsentinel set mymaster failover-timeout 300000
    parallel-syncssentinel set mymaster parallel-syncs 3
    notification-scriptsentinel set mymaster notification-script /var/redis/notify.sh
    client-reconfig-scriptsentinel set mymaster client-reconfig-script /var/redis/reconfig.sh
    auth-passsentinel set mymaster auth-pass 111
  • Sentinel 模式下的可用命令

    在Sentinel模式下,Redis服务器不能执行诸如SET、DBSIZE、EVAL等等这些命令,因为服务器根本没有在命令表中载入这些命令。PING、SENTINEL、INFO、SUBSCRIBE(订阅频道)、UNSUBSCRIBE(退订频道)、PSUBSCRIBE(订阅模式)和PUNSUBSCRIBE(退订模式)这七个命令就是客户端可以对Sentinel执行的全部命令了。

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

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

相关文章

【腾讯云Finops Crane集训营】降本增效神器Crane实战记录

本章目录 前言一、Crane是什么&#xff1f;Crane的主要功能&#xff1f;FinOps 是什么Prometheus是什么Grafana是什么 二、不得不面对的问题&#xff1a;云上资源效能挑战&#xff01;三、云原生场景下的成本优化挑战&#xff1f;四、K8s原生能力的不足五、Crane智能调度助力成…

Linux命令之vim/vi

目录 vim/vi简介 vi/vim 的使用 操作实例 总结 vim/vi简介 所有的 Unix Like 系统都会内建 vi 文书编辑器&#xff0c;其他的文书编辑器则不一定会存在。但是目前我们使用比较多的是 vim 编辑器。Vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程…

i.MX6ULL - 远程视频监控方案实现(nginx-rtmp流媒体服务器、ffmpeg推流)

i.MX6ULL - 远程视频监控配置&#xff08;nginx-rtmp流媒体服务器、ffmpeg推流&#xff09; 目录 i.MX6ULL - 远程视频监控配置&#xff08;nginx-rtmp流媒体服务器、ffmpeg推流&#xff09;1、前言2、buildroot文件系统构建2.1 勾选alsa-utils&#xff08;选做&#xff1a;如果…

桥接模式与NAT模式的区别以及设置静态IP

概述 日常我们都会使用到虚拟机&#xff0c;本文章以VMware虚拟机为例&#xff0c;主要介绍下虚拟机设置桥接模式与NAT模式的区别&#xff0c;并通过示意图进行讲解。并且会介绍如何去设置静态IP。 模式介绍 NAT模式NAT模式下 &#xff0c;创建出来的虚拟机只能访问当前主机…

基于ensp的跨地区的校园网组网方案

本博客是基于模拟器ensp的校园网组网方案&#xff0c;有总校区和分校区&#xff0c;主要用了vlan划分、dhcp、nat、ospf、acl、bgp等技术。首先说一下本博客的局限性&#xff1a; 总校区和分校区之间只是使用的传统的bgp建立连接&#xff0c;这样可以在运营商上看到内网的明细&…

HTTP1.1(七)内容协商和资源表述

一 内容协商和资源表述 ① 铺垫 1) 由于一种资源对应许多种状态,所以客户端接收资源表述的转移时需要进行协商比如&#xff1a;[1]、一个来自中国的用户他的浏览器访问一个页面时得到中文页面[2]、一个其它国家的用户访问同一个页面时得到的是他本国的页面补充&#xff1a;…

在线协作助力团队合作:解析多种高效工具实现团队协同

在线协作是通过网络为平台&#xff0c;将团队成员连接起来&#xff0c;使其共同创作、共享讯息&#xff0c;进行团队合作。这种协作方式突破了线下的空间限制性&#xff0c;使团队合作更加及时便捷。因此&#xff0c;越来越多的团队选择了在线协作。 在线协作为团队带来了什么帮…

IDEA 2019.1 与 apache-maven-3.6.3 版本不兼容解决办法

-------IDEA 2019.1 与 apache-maven-3.6.3 版本不兼容 解决办法&#xff1a;降低 Maven版本为 3.3 到底得踩过多少坑&#xff0c;才能让你不再流泪&#xff0c;

接初识HTML中的基础知识,简单明了!!!

续——HTML的基础知识&#xff01;&#xff01;&#xff01; 一、表格 关于HTML中用table表示一个表格&#xff0c;用tr来表示一行&#xff0c;用td来表示一列。 Demo&#xff1a;表示一个二行三列的表格 <!--根--> <html><!--头--> <head><…

瑞吉外卖 - 文件上传与下载功能(15)

某马瑞吉外卖单体架构项目完整开发文档&#xff0c;基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成&#xff0c;有需要的胖友记得一键三连&#xff0c;关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料&#xff1a;https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

pandas dataframe 中 explode()函数用法及效果

最近在使用pyspark处理数据&#xff0c;需要连接各种各样的表和字段&#xff0c;因此记录相关函数的使用情况。今天介绍explode(). 1. explode()函数简介 explode 函数是 pandas.DataFrame 类的一个方法&#xff0c;能够通过pyspark间接调用。 它可以将一个包含list或者其它可…

【零基础学JS - 7 】javaScript 中的8大数据类型

&#x1f468;‍&#x1f4bb; 作者简介&#xff1a;程序员半夏 , 一名全栈程序员&#xff0c;擅长使用各种编程语言和框架&#xff0c;如JavaScript、React、Node.js、Java、Python、Django、MySQL等.专注于大前端与后端的硬核干货分享,同时是一个随缘更新的UP主. 你可以在各个…

Python之selenium关于Chrome驱动位置,闪退的问题和安装路径

目录 零、查看Python的安装路径一、Chromedriver放置的位置二、浏览器闪退 零、查看Python的安装路径 一、Chromedriver放置的位置 背景&#xff1a;之前由于Chrome浏览器自动升级后&#xff0c;导致驱动与浏览器不匹配&#xff0c;自己也不知道问题出在哪儿&#xff0c;花费了…

hadoop和spark配置问题记录

hadoop和spark配置问题记录 Spark的WebUI访问不了 直接启动的start-all.sh是环境变量中配置的hadoop的脚本&#xff0c;不是spark的&#xff0c;因此启动spark的start-all.sh脚本即可。 Spark看不到Worker信息 启动Spark在UI界面上看不到worker节点的信息_潇洒哥WH3的博客-C…

【Java|基础篇】包和访问权限修饰符

文章目录 1. 前言2. 包的概念3. 包的创建以及优点4. 访问权限修饰符5. 总结 1. 前言 包和访问权限修饰符是Java中两个常用的概念&#xff0c;它们都与访问控制有关. 2. 包的概念 在面向对象体系中&#xff0c;提出了一个软件包的概念&#xff0c;即&#xff1a;为了更好的管…

代码随想录算法训练营第四十四天 | 完全背包、完全背包的遍历顺序

完全背包 理论基础 文档讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;带你学透完全背包问题&#xff01; 和 01背包有什么差别&#xff1f;遍历顺序上有什么讲究&#xff1f;_哔哩哔哩_bilibili 完全背包和01背包问题唯一不同的地方就是&#xff0c;每…

品牌战略规划:如何让你的品牌脱颖而出

虽然很多国内企业家都非常重视战略&#xff0c;什么商业战略、渠道战略之类的一通研究&#xff0c;但惟独却缺乏对品牌战略的一个正确理解。 很多时候一把手不参与&#xff0c;也不关心品牌建设&#xff0c;经常上来就让团队实操动作&#xff0c;而自己只看最终结果&#xff0…

LeetCode20.有效的括号

题目 思路 每一个右括号应该与与在它左边最近的左括号相匹配&#xff0c;所以这道题可以通过栈实现 代码 &#x1f4ac;由于博主还没有学习到C&#xff0c;能力有限&#xff0c;所以只能自己实现一个栈&#xff0c;学过C的朋友可以直接使用CSTL中的栈来实现 #define _CRT_S…

深入理解事务的隔离性 —— 多版本并发控制( MVCC )

文章目录 一、数据库并发的三种场景二、多版本并发控制&#xff08;MVCC&#xff09;的初步认识三、事务的隐藏列字段四、UNDO 日志五、Read View 读视图六、深入理解 MVCC —— 隔离级别的实现原理七、RC 与 RR 的本质区别 一、数据库并发的三种场景 数据库并发指的是多个用户…

如何将Shapefile文件导入Sketch Up进行建模

涉及软件&#xff1a;ArcGIS10.4.1&#xff0c;Sketch Up Pro2022 1.shapefile的属性编辑 基于我们已有的shp文件&#xff0c;打开属性表&#xff0c;添加一个高度字段用于存放平面图形高度信息&#xff0c;为后期三维拉伸做好准备&#xff08;如果已有相关信息&#xff0c;请…