Redis 之六:Redis 的哨兵模式(Sentinel)
Redis 哨兵(Sentinel)模式是一种高可用性解决方案,用于监控和自动故障转移的集群系统。
在 Redis Sentinel 架构中,哨兵是一组运行在特殊模式下的 Redis 进程,它们可以监控一个或多个主从复制结构中的 Redis 主服务器以及其他从服务器的状态。
sentinel 哨兵模式已经被集成在 redis2.4 之后的版本中,哨兵的核心功能是主节点的自动故障转移
特点与工作原理
以下是Redis哨兵模式的主要特点与工作原理:
- 监控功能:
- 哨兵会持续不断地通过心跳检测机制检查主节点和其他从节点的健康状态。
- 如果主节点无法响应,哨兵会根据预设的超时规则判断主节点是否宕机。
- 自动故障转移:
- 当哨兵确定主节点不可达后,它会执行自动故障转移操作。
- 选择一个从节点提升为主节点,并负责更新其他从节点的配置,让它们切换到新的主节点进行同步。
- 协商机制:
- 在多个哨兵组成的集群中,哨兵间会相互通信并达成共识,确保只有在足够数量的哨兵同意的情况下才会执行故障转移。
- 这种多哨兵集群设计增强了系统的鲁棒性和正确性。
- 通知机制:
- 哨兵不仅负责故障转移,还会通过发布订阅功能向客户端或者其他系统发送通知,告知Redis主节点的状态变化。
- 配置持久化:
- 哨兵会将集群的当前配置信息持久化存储,即使哨兵自身重启也能恢复其监控状态。
通过这种模式,Redis能够实现无中心化的、高可用的服务部署,当主节点出现故障时,能够在无需人工干预的情况下快速恢复服务,保证了Redis服务的稳定性和可靠性。
架构
哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的 Redis 节点,不存储数据。
数据节点:主节点和从节点都是数据节点
作用
哨兵模式在Redis中主要用于提供高可用性和故障恢复功能。具体作用如下:
- 监控:哨兵(Sentinel)进程会持续监控主服务器和从服务器的运行状态,包括但不限于检查服务是否正常响应、判断主从复制是否正常进行等。
- 自动故障检测与转移:当主服务器发生故障(如宕机或网络断开),哨兵能及时发现并确定主服务器是否真的不可达。如果达到预设条件,哨兵将自动执行故障转移操作,选择一个从服务器升级为主服务器,并通知其他从服务器开始复制新的主节点。
- 配置更新:哨兵不仅负责切换主从角色,还会自动更新相关的配置信息,确保整个集群中的所有节点都知道新的主服务器是谁,从而维持集群的正确配置和数据同步。
- 系统通知:哨兵可以向管理员或者其他应用程序发送报警信息,报告关于Redis服务器的各种状态变化,通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机。
配置步骤
主要操作的文件是 /usr/local/bin/redis-sentinel ;
修改启动配置文件:sentinel.conf
配置文件
复制和修改配置文件
到原 redis 解压目录下复制 sentinel.conf
[root@localhost bin]# ls
dump.rdb redis81.conf redis82.conf redis-benchmark redis-check-aof redis-check-rdb redis-cli redis.conf redis-sentinel redis-server sentinel.conf
[root@localhost bin]# cd /opt/soft/redis-6.0.6/
[root@localhost redis-6.0.6]# ls
00-RELEASENOTES CONTRIBUTING deps Makefile README.md runtest runtest-moduleapi sentinel.conf tests utils
BUGS COPYING INSTALL MANIFESTO redis.conf runtest-cluster runtest-sentinel src TLS.md
[root@localhost redis-6.0.6]# cp sentinel.conf /usr/local/bin ## 把哨兵配置文件 拷贝到 安装目录
cp: overwrite ‘/usr/local/bin/sentinel.conf’? y
[root@localhost redis-6.0.6]# #### 切换到安装目录 检查
[root@localhost redis-6.0.6]# cd /usr/local/bin/
[root@localhost bin]# ls
dump.rdb redis81.conf redis82.conf redis-benchmark redis-check-aof redis-check-rdb redis-cli redis.conf redis-sentinel redis-server sentinel.conf
[root@localhost bin]#
监控主节点
编辑修改配置文件,监控主节点
sentinel monitor mymaster 127.0.0.1 6379 1 ###注意监控主节点
修改 把 2 修改为 1。如果有一个哨兵节点认为主节点宕机了,则开始选举机制。
启动哨兵进程
思路:启动三个节点 > 并指定主从关系 > 然后启动哨兵节点来监控主节点
[root@localhost bin]# redis-server redis.conf
2417:C 05 Aug 2021 20:50:27.725 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2417:C 05 Aug 2021 20:50:27.725 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=2417, just started
2417:C 05 Aug 2021 20:50:27.725 # Configuration loaded
[root@localhost bin]# ^C
[root@localhost bin]# redis-cli -p 6379#### 上面启动成功后,下面查看自己当前角色
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=56,lag=1
slave1:ip=127.0.0.1,port=6382,state=online,offset=56,lag=0
master_replid:2a3410fe212ea06a10413e6c93b59b9746a55d7a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:56
指定主从节点
启动 6381 端口和6382 端口,并指定从节点:
[root@localhost bin]# redis-cli -p 6381
127.0.0.1:6381> slaveof 127.0.0.1 6379 ####指定主从节点####
OK
127.0.0.1:6381> info replication
# Replication
role:slave #####从节点#####
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:42
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:2a3410fe212ea06a10413e6c93b59b9746a55d7a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:42
启动6382 并指定主从节点
[root@localhost bin]# redis-server redis82.conf
2441:C 05 Aug 2021 20:51:19.197 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2441:C 05 Aug 2021 20:51:19.197 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=2441, just started
2441:C 05 Aug 2021 20:51:19.197 # Configuration loaded
127.0.0.1:6382> slaveof 127.0.0.1 6379
OK
127.0.0.1:6382> info replication
启动哨兵节点
redis-sentinel sentinel.conf
[root@localhost bin]# redis-sentinel sentinel.conf
2485:X 05 Aug 2021 20:54:16.497 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2485:X 05 Aug 2021 20:54:16.497 # Redis version=6.0.6, bits=64, commit=00000000, modified=0, pid=2485, just started
2485:X 05 Aug 2021 20:54:16.497 # Configuration loaded
2485:X 05 Aug 2021 20:54:16.497 * Increased maximum number of open files to 10032 (it was originally set to 1024).
选举机制
Redis Sentinel(哨兵)模式下的选举
在Redis Sentinel系统中,确实存在一种高级的选举和故障转移机制:
- 主观下线(Subjectively Down, SDOWN):单个Sentinel监控到主节点不可达时,标记该节点为SDOWN。
- 客观下线(Objectively Down, ODOWN):多个Sentinel(通常是一个多数派集合)都确认主节点不可达时,将主节点状态改为ODOWN。
- Leader Sentinel选举:当主节点被确定为ODOWN后,Sentinel集群内部会进行一次Leader Sentinel的选举。这个选举通常是通过协商一致的方式达成,其中一个Sentinel充当领导者并负责执行故障转移操作。
- 新主节点选举:Leader Sentinel会根据预定义的规则选择一个从节点作为新的主节点。这可能基于优先级、复制偏移量等因素决定,选择最优的从节点晋升为主节点。
- 故障转移与配置更新:选定从节点升级为主节点后,Leader Sentinel会通知其他Sentinel及从节点更新配置信息,使得整个集群重新达到一致状态。
总之,在Redis Sentinel模式下,选举机制主要用于确保即使在主节点发生故障时,也能快速地选出一个新的主节点以恢复服务的可用性,并保证数据的一致性和完整性。
测试选举机制:停止主节点后,哨兵节点会输出日志,监控到变化和启动选举机制
127.0.0.1:6379> shutdown
not connected> quit
2485:X 05 Aug 2021 20:55:34.787 # +sdown master mymaster 127.0.0.1 6379
2485:X 05 Aug 2021 20:55:34.787 # +odown master mymaster 127.0.0.1 6379 #quorum 1/1
2485:X 05 Aug 2021 20:55:34.787 # +new-epoch 1
2485:X 05 Aug 2021 20:55:34.787 # +try-failover master mymaster 127.0.0.1 6379
2485:X 05 Aug 2021 20:55:34.788 # +vote-for-leader fe3f7dda47b7a9ca63194aeaeb31660c30a7316a 1
2485:X 05 Aug 2021 20:55:34.788 # +elected-leader master mymaster 127.0.0.1 6379
2485:X 05 Aug 2021 20:55:34.788 # +failover-state-select-slave master mymaster 127.0.0.1 6379
2485:X 05 Aug 2021 20:55:34.860 # +selected-slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6379
2485:X 05 Aug 2021 20:55:34.860 * +failover-state-send-slaveof-noone slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6379
2485:X 05 Aug 2021 20:55:34.919 * +failover-state-wait-promotion slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6379
2485:X 05 Aug 2021 20:55:35.924 # +promoted-slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6379
2485:X 05 Aug 2021 20:55:35.924 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379
2485:X 05 Aug 2021 20:55:35.999 * +slave-reconf-sent slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
2485:X 05 Aug 2021 20:55:36.992 * +slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
2485:X 05 Aug 2021 20:55:36.992 * +slave-reconf-done slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
2485:X 05 Aug 2021 20:55:37.093 # +failover-end master mymaster 127.0.0.1 6379
2485:X 05 Aug 2021 20:55:37.093 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6382
2485:X 05 Aug 2021 20:55:37.093 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6382
2485:X 05 Aug 2021 20:55:37.093 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6382
2485:X 05 Aug 2021 20:56:07.186 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6382
多哨兵模式
然而一个哨兵进程对 Redis 服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。 各个哨兵之间还会进行监控,这样就形成了多哨兵模式。
多哨兵模式通常指的是在Redis Sentinel(哨兵)系统中部署多个Sentinel节点,以实现对主从复制集群的高可用性和故障转移功能。
优缺点
以下是多哨兵模式的优缺点:
优点:
- 高可用性:通过部署多个Sentinel节点,即使有个别Sentinel发生故障,其他Sentinel也能继续监控和管理Redis集群,确保系统的整体稳定性和可用性。
- 自动故障检测与恢复:当主服务器出现故障时,多个Sentinel可以通过协商机制达成一致意见,并选举出一个Leader Sentinel执行故障转移操作,将新的主服务器推举出来,从而实现快速恢复服务。
- 容错能力增强:由于有多个哨兵并行工作,可以减少单点故障的风险,增加对网络波动、机器宕机等异常情况的容忍度。
- 分布式决策:通过投票机制确定主服务器是否下线以及选择哪个从服务器升级为主服务器,避免了单一节点决策可能带来的误判或延迟。
缺点:
- 复杂性增加:配置和维护多哨兵架构会比单个哨兵更为复杂,需要考虑哨兵之间的通信、配置一致性等问题。
- 资源消耗:每个哨兵都是一个独立运行的进程,因此需要额外的计算资源和网络带宽来支持其运行。
- 潜在的问题点增多:随着哨兵数量的增加,可能出现更多潜在的故障点,例如如果所有哨兵同时无法正确监测到主节点状态,可能会导致集群不能正常进行故障切换。
- 一致性问题:虽然Sentinel之间通过协议保证了一致性,但在实际部署中,如若配置不当或网络分区等因素,仍有可能引发一致性问题,比如脑裂现象,即不同哨兵群组认为不同的节点是主服务器。
总结来说,多哨兵模式增强了Redis集群的健壮性和可靠性,但也相应增加了管理和运维的复杂度,因此在设计和部署时需要权衡这些因素,确保系统的稳健运行。
相关文章:

Redis 之六:Redis 的哨兵模式(Sentinel)
Redis 哨兵(Sentinel)模式是一种高可用性解决方案,用于监控和自动故障转移的集群系统。 在 Redis Sentinel 架构中,哨兵是一组运行在特殊模式下的 Redis 进程,它们可以监控一个或多个主从复制结构中的 Redis 主服务器以…...

总线要点笔记
1. AXI/AHB/APB差异 AMBA (Advanced Microcontroller Bus Architecture) 高级处理器总线架构 AHB (Advanced High-performance Bus) 高级高性能总线 ASB (Advanced System Bus) 高级系统总线 APB (Advanced Peripheral Bus) 高级外围总线 AXI (Advanced eXtensible Interface) …...
RK3566 linux iperf网络测试
一、开发环境 系统:buildroot; 在Linux目标板和Windows PC上运行iperf进行测试; 二、调试 1、查询目标板上的iperf 使用终端助手连接目标板,然后输入命令查询iperf的版本: rootrk3566-buildroot:~# iperf -v iperf version …...

【无标题】计算机主要应用于哪些领域
科学计算(或称为数值计算)、数据处理(信息管理)、辅助工程、生产自动化、人工智能。1、科学计算(或称为数值计算):早期的计算机主要用于科学计算。目前,科学计算仍然是计算机应用的一…...

力扣精选算法100道——颜色分类(双指针和三指针俩种方法解决此题)
目录 🚩了解题意 🚩算法分析 第一种方法:双指针 🚩代码实现一 第二种方法:三指针 🚩代码实现二 🚩了解题意 本题将整数0,1,2代表红白篮,nums中的整数并…...

基于Java SSM springboot+VUE+redis实现的前后端分类版网上商城项目
基于Java SSM springbootVUEredis实现的前后端分类版网上商城项目 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐…...
01——什么是人工智能
学习形式分类 1) 有监督学习 有监督学习(supervised learning),需要你事先需要准备好要输入数据(训练样本)与真实的输出结果(参考答案),然后通过计算机的学习得到一个预测模型,再用…...

AI国漫女神这样画!傻瓜式的云端SD(stable diffusion)部署教程 - 白嫖4090、无需代码、一键启动
一、前言:为什么要云端部署stable diffusion? 前段时间一直在用midjourney进行Ai绘画,但是发现Midjourney绘画的限制有点多很死板,很多图都不能画,懂得都懂。想使用Midjourney可以看这个:( 【推荐】Midjo…...
消息队列、共享内存、信号灯
IPC(Inter-Process Communication,进程间通信) 常用的 IPC 对象包括管道(pipe)、消息队列(message queue)、信号量(semaphore)和共享内存(shared memory&…...

K次取反后最大化的数组和 加油站 分发糖果 柠檬水找零
1005.K次取反后最大化的数组和 力扣题目链接(opens new window) 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。&a…...

Standoff: 独特的基于真实商业基础架构的网络战
Standoff 网络战通常每年进行两次(5 月和 11 月)。该公共活动的核心是由多个良心黑客团队(也称为威胁研究团队、白帽队或红队)对虚拟地区的基础架构进行系列攻击。 下一届 Standoff 将在 2024 年 5 月 23 日至 26 日举行的 Posi…...
如何成为fpga工程师
FPGA的应用领域非常的广,尤其再人工智能,大数据,云计算等等方向非常吃香。加上国家这两年的政策支持,整个芯片行业相比较其他的传统行业来说会好很多,总之前景是光明的,道路是曲折的,想要在人才…...
基础算法(二)#蓝桥杯
文章目录 8、双指针8.1、挑选子串8.2、聪明的小羊肖恩8.3、神奇的数组 9、二分9.1、跳石头9.2、可凑成的最大花朵数9.3、最大通过数9.4、妮妮的月饼广场9.5、基德的神秘冒险9.6、体育健将 10、倍增10.1、快速幂10.2、最近公共祖先LCA查询10.3、理想之城10.4、数的变换 8、双指针…...

运筹学_1.1.4 线性规划问题-解的概念
1.1.4 线性规划问题-解的概念 一、可行解与最优解二、基的概念三、基变量、基向量;非基变量、非基向量;基解、基可行解;四、最优解与可行解、基可行解的关系五、用例题(枚举法)巩固基解、基可行解、最优解三个概念1、例…...

物联网主机:为智能交通赋能
物联网(IoT)技术的发展为智能交通领域带来了许多创新的解决方案。而在物联网应用中,物联网主机起着关键的作用。本文将为大家介绍一款名为E6000的物联网主机,它是一种多协议、多接口的物联网主机,为智能交通系统的建设…...
「Vue3系列」Vue3简介及安装
文章目录 一、Vue3简介二、Vue3安装三、Vue3应用案例四、package.json详解五、相关链接 一、Vue3简介 Vue3是Vue.js框架的第三个主要版本,于2020年9月18日发布,代号为“One Piece”。Vue3在性能、体积、TypeScript支持、API设计等方面都有显著的提升和改…...
Javascript:分支语句
一、前言 关于分支语句的介绍来啦,开始记笔记。 二、正文 1.分支语句if 分支语句就是通过判断已给的表达式的条件来执行语句,表达式为真才能执行. if(条件){满足条件才要执行的代码} 条件为true时,才能进行大括号的代码。 除了空字符串&am…...

从零开始学习PX4源码2(PX4姿态误差计算)
目录 文章目录 目录摘要1.源码1.1源码路径1.2源码程序1.3源码功能 2.源码分析 摘要 本节主要记录PX4姿态误差计算过程,欢迎批评指正。 1.源码 1.1源码路径 PX4-Autopilot/src/modules/mc_att_control/AttitudeControl/AttitudeControl.cpp1.2源码程序 matrix::…...

git安装与使用4.3
一、git的安装 1、下载git包 下载git包url:https://git-scm.com/download/win 下载包分为:64位和32位 2、点击安装包 2、选择安装路径 3、 点击下一步 4、点击next 5、点击next 6、点击next 7、 8、 9、 10、 11、 12、在桌面空白处,右键…...

Python:关于数据服务中的Web API的设计
搭建类似joinquant、tushare类似的私有数据服务应用,有以下一些点需要注意: 需要说明的是,这里讨论的是web api前后端,当然还有其它方案,thrift,grpc等。因为要考虑到一鱼两吃,本文只探讨web ap…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...