当前位置: 首页 > news >正文

Redis 哨兵模式学习笔记

Redis 哨兵模式学习笔记

一、核心概念

Redis 哨兵模式(Redis Sentinel)是 Redis 官方提供的高可用解决方案,主要用于监控 Redis 主从集群,自动检测主节点故障,并实现故障转移,确保服务的连续性,避免单点故障。

二、原理详解

(一)监控(Monitoring)

  • 哨兵节点通过向主节点和从节点定期发送PING命令来监控其健康状态,默认每 1 秒发送一次。

  • 若在down-after-milliseconds(默认 30 秒)内未收到节点的有效响应(PONG),哨兵会将该节点标记为主观下线(SDOWN)。主观下线仅代表单个哨兵的判断,并不意味着节点真的不可用。

(二)通知(Notification)

  1. 当一个哨兵判断主节点为主观下线后,会通过发布 / 订阅(PUBLISH/SUBSCRIBE)机制向其他哨兵发送消息,询问是否也认为该主节点下线。

  2. 当同意主节点下线的哨兵数量达到配置的quorum(仲裁数量)时,主节点会被标记为客观下线(ODOWN)。

  3. 此时,哨兵会通过发布 / 订阅机制通知所有相关节点和客户端主节点已下线的消息。

(三)自动故障转移(Automatic Failover)

  1. 领导者选举:多个哨兵会进行领导者选举,采用 Raft 算法,最先达到半数以上支持的哨兵成为领导者,负责后续的故障转移操作。

  2. 新主选举:领导者哨兵从原主节点的从节点列表中,按照以下规则选举新的主节点:

  • 首先选择优先级(replica-priority,值越小优先级越高,默认为 100,设置为 0 则排除在选举外)最高的从节点;

  • 若优先级相同,选择复制偏移量(master_repl_offset,表示从节点复制主节点数据的进度,偏移量越大说明数据越新)最大的从节点;

  • 若仍相同,则选择运行 ID(runid,每个 Redis 节点启动时生成的唯一标识)较小的从节点。

  1. 故障转移执行
  • 领导者哨兵向选中的从节点发送SLAVEOF NO ONE命令,将其提升为新的主节点;

  • 然后向其他从节点发送SLAVEOF 命令,让它们开始复制新主节点的数据;

  • 最后,当原主节点恢复后,将其设置为新主节点的从节点。

三、工作流程

(一)启动阶段

  1. 部署 Redis 主从集群,包括 1 个主节点和多个从节点,并配置好主从复制关系。

  2. 部署多个哨兵节点(建议至少 3 个且为奇数个,防止脑裂),每个哨兵节点通过配置文件中的sentinel monitor 指令,指定要监控的主节点信息及仲裁数量。

  • 例如:sentinel monitor mymaster 192.168.1.100 6379 2,表示监控名为mymaster,IP 为192.168.1.100,端口为6379的主节点,仲裁数量为 2。

(二)运行与监控阶段

  1. 哨兵节点启动后,会与被监控的主从节点建立连接,定期发送PING命令进行健康检查,并通过INFO命令获取节点的复制状态、角色等信息。

  2. 哨兵节点之间通过发布 / 订阅机制,在__sentinel__:hello频道上交换彼此的信息(包括 IP、端口、运行 ID 等),建立通信网络。

(三)故障检测阶段

  1. 当某个哨兵节点发现主节点在down-after-milliseconds时间内未响应PING命令,将其标记为主观下线,并通过SENTINEL is-master-down-by-addr命令向其他哨兵询问对该主节点状态的判断。

  2. 当同意主节点主观下线的哨兵数量达到quorum时,主节点被标记为客观下线,触发故障转移流程。

(四)故障转移阶段

  1. 多个哨兵进行领导者选举,选举出的领导者负责执行故障转移。

  2. 领导者按照选举规则确定新的主节点,并向其发送SLAVEOF NO ONE命令,使其成为主节点。

  3. 领导者向其他从节点发送SLAVEOF命令,让它们开始复制新主节点的数据。

  4. 当原主节点恢复后,领导者会将其设置为新主节点的从节点,整个集群恢复到正常的主从状态。

四、配置与使用要点

  1. 哨兵配置文件:除了sentinel monitor指令,还需关注以下参数,合理配置以平衡性能和可用性:
  • down-after-milliseconds(主观下线超时时间)

  • failover-timeout(故障转移超时时间)

  • parallel-syncs(故障转移时同时同步数据的从节点数量)

  1. 客户端适配:客户端需要连接哨兵节点,通过sentinel.master_for(‘master-name’)等方法获取主节点信息进行读写操作,实现故障转移后的自动重连。

  2. 监控与报警:建议对哨兵节点和 Redis 主从节点进行监控,设置合理的报警阈值,及时发现并处理潜在问题。

如果你还希望对这份笔记在内容深度、格式排版上做调整,或是补充更多案例,都能随时和我说。

五,示例

1.环境准备

主机描述
192.168.10.101哨兵模式
192.168.10.102哨兵模式
192.168.10.103哨兵模式
192.168.10.104master
192.168.10.105slave
192.168.10.106slave

2.部署redis主从模式

该操作在104 105 106三台主机上操作

# 安装Redis编译依赖:GCC编译器和zlib开发库
[root@master ~]# dnf -y install gcc zlib-devel# 解压Redis源码包(假设已下载redis-6.2.4.tar.gz)
[root@master ~]# tar xf redis-6.2.4.tar.gz # 进入Redis源码目录
[root@master ~]# cd redis-6.2.4# 编译并安装Redis到指定目录:
# 1. make - 编译Redis源码(生成可执行文件)
# 2. make PREFIX=/usr/local/redis/ install - 将编译结果安装到指定目录
#    PREFIX参数指定安装路径,默认会创建bin、etc、lib等子目录
[root@master redis-6.2.4]# make && make PREFIX=/usr/local/redis/ install
[root@master redis-6.2.4]# cp redis.conf /etc/redis/6379.conf  ###复制这个配置文件到我们自己创建的配置文件内 也可以直接使用自带的初始化脚本执行
[root@master bin]# ln -s /usr/local/redis/bin/* /usr/local/bin/  ###链接文件方便操作[root@master bin]# vim /etc/redis/6379.conf # 绑定Redis服务监听的IP地址
# 127.0.0.1允许本地回环访问,192.168.10.104允许外部网络访问(请替换为实际服务器IP)
bind 127.0.0.1 192.168.10.104 ###ip是本地自己主机ip# 以守护进程方式运行(后台运行)
# yes表示启用,no表示前台运行(调试模式)
daemonize yes ###开启守护进程# 指定Redis进程ID文件位置
# 用于systemd或脚本管理Redis进程状态
pidfile /var/run/redis_6379.pid  ###进程文件# 设置日志级别(从低到高:debug、verbose、notice、warning)
# notice:适合生产环境,记录重要事件但不包含调试信息
loglevel notice  ###日志级别格式# 指定日志文件路径
# 生产环境建议输出到单独日志文件,便于监控和分析
logfile "/var/log/redis_6379.log"  ###日志文件
2.1配置使用systemctl的方式启动

在104.105.106主机上操作

# 编辑Redis的systemd服务配置文件
[root@master bin]# vim /lib/systemd/system/redis.service# [Unit]部分:定义服务的元数据和依赖关系
[Unit]
# 服务描述信息,会在systemctl命令的输出中显示
Description=Redis
# 确保在网络服务启动后再启动Redis
After=network.target# [Service]部分:定义服务的启动方式和行为
[Service]
# Type=forking表示服务会以守护进程方式启动(后台运行)
Type=forking
# 指定启动Redis服务的命令,使用配置文件6379.conf
ExecStart=/usr/local/redis/bin/redis-server  /etc/redis/6379.conf# [Install]部分:定义服务的安装信息
[Install]
# WantedBy=multi-user.target表示服务会在多用户模式下被启动WantedBy=multi-user.target
2.2在两台从主机(105.106)配置文件添加主库

[root@slave01 ~]# vim /etc/redis/6379.conf # 设置该Redis实例为从节点,并指定主节点的IP和端口
# 192.168.10.104:主节点的IP地址(需替换为实际主节点IP)
# 6379:主节点的端口号
replicaof 192.168.10.104 6379

在主库上查看信息

# 连接到本地 Redis 服务(默认端口 6379)
[root@master bin]# redis-cli 
# 查看 Redis 复制状态信息
127.0.0.1:6379> info replication# 复制信息部分
# Replication# 当前节点角色:master(主节点)
role:master# 已连接的从节点数量:2 个
connected_slaves:2# 从节点 0 详情
slave0:ip=192.168.10.106,port=6379,state=online,offset=336,lag=0
# ip:从节点 IP 地址
# port:从节点端口
# state:连接状态(online 表示正常)
# offset:从节点复制偏移量(与主节点同步的字节数)
# lag:从节点与主节点的延迟(0 表示实时同步)# 从节点 1 详情
slave1:ip=192.168.10.105,port=6379,state=online,offset=336,lag=0# 主节点故障转移状态:无故障转移正在进行
master_failover_state:no-failover# 当前主节点的复制 ID(唯一标识当前主节点)
master_replid:87dfed6005aebc39274a5f5ff8365bc652d1c62f# 上一个主节点的复制 ID(初始值为全 0,表示没有历史主节点)
master_replid2:0000000000000000000000000000000000000000# 主节点当前的复制偏移量(主节点写入的总字节数)
master_repl_offset:336# 第二个复制 ID 的偏移量(-1 表示未使用)
second_repl_offset:-1# 复制积压缓冲区状态:1 表示启用
repl_backlog_active:1# 复制积压缓冲区大小:1MB(默认值)
repl_backlog_size:1048576# 复制积压缓冲区中第一个字节的偏移量
repl_backlog_first_byte_offset:1# 复制积压缓冲区中历史数据的长度(当前为 336 字节)
repl_backlog_histlen:336

3.部署哨兵模式(在主从模式基础上)

以下操作在三台sentinel上操作(101.102.103)

# 安装Redis编译依赖:GCC编译器和zlib开发库(用于编译Redis源码)
[root@sentinel01 ~]# dnf -y install gcc zlib-devel# 列出当前目录文件,确认Redis源码包已下载
[root@sentinel01 ~]# ls
anaconda-ks.cfg  redis-6.2.4.tar.gz# 解压Redis源码包(-x: 解压,-f: 指定文件)
[root@sentinel01 ~]# tar xf redis-6.2.4.tar.gz # 编译并安装Redis到指定目录:
# 1. make - 编译Redis源码(生成可执行文件)
# 2. make PREFIX=/usr/local/redis install - 将编译结果安装到指定目录
#    PREFIX参数指定安装路径,默认会创建bin、etc、lib等子目录
[root@sentinel01 redis-6.2.4]# make && make PREFIX=/usr/local/redis install# 查看上一条命令的退出状态(0表示成功,非0表示失败)
[root@sentinel01 redis-6.2.4]# echo $?
0# 创建Redis配置文件目录(用于存放配置文件)
[root@sentinel01 redis-6.2.4]# mkdir /etc/redis# 复制Redis配置模板到指定路径,并命名为6379.conf(端口号为6379)
[root@sentinel01 redis-6.2.4]# cp redis.conf /etc/redis/6379.conf
# 编辑哨兵节点配置文件(默认端口6379)
[root@sentinel01 redis-6.2.4]# vim /etc/redis/6379.conf # 以守护进程方式运行(后台运行)
# yes表示启用,no表示前台运行(调试模式)
daemonize yes# 绑定监听地址(0.0.0.0表示监听所有可用网络接口)
# 注意:生产环境建议仅绑定内网IP,避免公网暴露
bind 0.0.0.0# 配置哨兵监控主节点
# sentinel monitor <master-name> <master-ip> <master-port> <quorum>
# 192.168.10.104:主节点IP地址
# 6379:主节点端口
# 2:仲裁数量(至少2个哨兵同意主节点下线才触发故障转移)sentinel monitor mymaster 192.168.10.104 6379 2

在三台sentinel上配置systemd

# 创建Redis Sentinel的systemd服务配置文件
[root@sentinel01 redis-6.2.4]# vim /lib/systemd/system/redis.service# 服务元数据定义
[Unit]
Description=Redis Sentinel  # 服务描述信息
After=network.target        # 依赖网络服务,确保网络就绪后启动# 服务运行配置
[Service]
Type=forking                # 指定服务类型为后台守护进程(对应daemonize yes)
ExecStart=/usr/local/redis/bin/redis-sentinel /etc/redis/6379.conf  # 启动命令# 服务安装配置
[Install]
WantedBy=multi-user.target  # 多用户模式下自动启动(默认运行级别)

验证

###关闭redis104
[root@master bin]# systemctl stop redis###查看106状态
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.10.105,port=6379,state=online,offset=21084,lag=0
master_failover_state:no-failover
master_replid:39670352f4288dbc79e39de4f5671b26e7e5804f
master_replid2:87dfed6005aebc39274a5f5ff8365bc652d1c62f
master_repl_offset:21368
second_repl_offset:17498
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:21368
####故障转移完成106成为新的master

相关文章:

  • 乐达网站建设公司外链大全
  • 邹城建设银行网站2021年年度关键词排名
  • 嘉兴企业网站排名优化培训机构招生方案
  • 网站开发未按合同约定工期完工seo优化方法网站快速排名推广渠道
  • 哈尔滨专业做网站公司国家重大新闻
  • 网站模板下载简单的那种手机百度app
  • 华为云Flexus+DeepSeek征文 | DeepSeek-V3/R1 商用服务华为云开通指南及使用体验全解析
  • python果蔬种植销售一体化服务系统
  • 对于高考边界的理解以及未来就业层级的学习与思考
  • leetcode114-二叉树展开为链表
  • `docker run -it --rm` 笔记250624
  • 论文笔记(八十六)V-HOP: Visuo-Haptic 6D Object Pose Tracking
  • vue 3 计算器
  • MySql:DDL,增删改查:创建表
  • 【大模型学习】项目练习:套壳DeepSeek
  • 火山 RTC 引擎14 设置CB
  • (LeetCode 面试经典 150 题 )121. 买卖股票的最佳时机 (遍历)
  • 自然语言处理入门
  • 【开源项目】比 PyInstaller 更方便:图形界面打包 Python 脚本的体验
  • 工程优化——WebSocket、WSS(WebSocket Secure)和SSE(Server-Sent Events)通信对比
  • PyEcharts教程(009):PyEcharts绘制水球图
  • 常见网络知识,宽带、路由器
  • 【教学类-89-08】20250624新年篇05——元宵节灯笼2CM黏贴边(倒置和正立数字 )
  • 内存泄漏和内存溢出的区别
  • 五种 IO 模式的简单介绍 -- 阻塞 IO,非阻塞 IO,信号驱动 IO,IO 多路复用,异步 IO
  • 使用 PyFluent 自动化 CFD