Redis 哨兵模式
目录
一、Redis 哨兵介绍
1. 概述
2. 实现原理
3. 架构
4. 选举领导者哨兵的过程
5. 故障后恢复过程
6. 实现原理
二、实验案例环境
三、搭建基础环境
四、部署 Redis 主从
五、部署哨兵节点
1. 部署哨兵
2. 修改配置文件
3. 编写服务脚本
4. 查看哨兵状态信息
5. 故障转移
6.查看哨兵epoch
一、Redis 哨兵介绍
1. 概述
Redis 哨兵是 分布式高可用解决方案,用于实现:
-
主从自动故障转移(Master-Slave Failover)
-
集群监控(节点健康检测)
-
配置中心(自动更新客户端连接信息)
2. 实现原理
工作原理三阶段:
-
监控(Monitoring)
-
哨兵每秒向主/从节点发送
PING
命令 -
若节点超时(
down-after-milliseconds
,默认 30s),标记为 主观下线(SDOWN)
-
-
共识(Agreement)
-
哨兵集群通过 Gossip 协议 交换节点状态
-
当多数哨兵(≥
quorum
)认为主节点下线,标记为 客观下线(ODOWN)
-
-
故障转移(Failover)
-
选举 领导者哨兵 执行故障转移
-
从从节点中选出新主节点(基于优先级、复制偏移量等)
-
通知客户端和从节点更新配置
-
3. 架构
哨兵最基础架构由哨兵节点和数据节点。其中哨兵节点是特殊的Redis节点,不存储数据,只为监控;哨兵架构要由多个哨兵节点共同提供服务;数据节点用于存储Redis数据,包括主、从节点。
关键规则:
-
哨兵节点数 ≥ 3(推荐奇数台,避免脑裂)
-
故障转移决策需满足:
同意数 > 哨兵总数/2
4. 选举领导者哨兵的过程
基于 Raft 协议的选举流程:
选举细节:
-
发现主节点 ODOWN 的哨兵发起选举
-
每个哨兵在每个 配置纪元(epoch) 仅投一票
-
最先获得 多数票(≥ N/2 + 1) 的哨兵当选
-
选举超时(默认 100ms)后重新发起
5. 故障后恢复过程
步骤拆解:
-
筛选候选节点
-
排除已下线节点
-
排除
replica-priority=0
的节点 -
选择优先级最高 → 复制偏移量最大 → Run ID 最小的节点
-
-
提升新主节点
# 领导者哨兵执行SLAVEOF NO ONE # 提升为独立节点
-
重配置从节
SLAVEOF new_master_ip port # 指向新主节点
-
通知客户端
-
通过
__sentinel__:hello
频道发布新主节点信息 -
客户端监听频道自动更新连接
-
-
旧主节点处理
-
恢复后自动转换为从节点
-
同步新主数据
-
6. 实现原理
哨兵节点的配置文件需添加
sentinel monitor master-name IP port quorum
#需指定要监控的masterIP地址和端口
quorum用来表示执行故障恢复操作之前至少需要几个哨兵节点同意
建立连接后,哨兵会定时执行任务(贯穿整个生命周期):
- 每10秒哨兵会向主节点和从节点发送info命令
- 每2秒哨兵会向主节点和从节点发送自己的信息
- 每1秒哨兵会向主节点、从节点和其他哨兵发生ping命令
二、实验案例环境
操作系统 | 配置 | IP | 主机名 | 角色 |
Open Euler24 | 2C4C | 192.168.10.101 | master | 主 |
Open Euler24 | 2C4C | 192.168.10.102 | slave1 | 从 |
Open Euler24 | 2C4C | 192.168.10.103 | slave2 | 从 |
Open Euler24 | 2C4C | 192.168.10.104 | sentione101 | 哨兵 |
Open Euler24 | 2C4C | 192.168.10.105 | sentione102 | 哨兵 |
Open Euler24 | 2C4C | 192.168.10.106 | sentione103 | 哨兵 |
三、搭建基础环境
systemctl stop firewalld
setenforce 0
systemctl disable firewalld
vim /etc/selinux/config
SELINUX=disabledhostnamectl set-hostname 主机名(master/salve)
四、部署 Redis 主从
--部署redis
dnf -y install gcc
tar zxvf redis
cd redis
make
make PREFIX=/usr/local/redis install--软链接环境变量
ln -s /usr/local/redis/bin/* /usr/local/bin/--适用默认配置文件
mkdir /etc/redis
cp /root/redis/redis.conf /etc/redis/6379.conf--编写服务脚本
vim /etc/systemd/system/redis.service
[Unit]
Description=redis
After=network.target[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /etc/redis/6379.conf[Install]
WantedBy=multi-user.target--修改主从配置文件
vim /etc/redis/6379.conf
bind 127.0.0.1 192.168.10.101 //这个监听三台不一致,为本机的IP
daemonize yes
logfile "/var/log/redis_6379.log"--启动服务
systemctl daemon-reload
systemctl start redis
systemctl enable redis
--查看监听
netstat -anpt | grep 6379从配置
从节点
vim /etc/redis/6379.conf
replicaof 192.168.10.101 6379 //指定主--重启
systemctl restart redis
netstat -anpt |grep redis--验证主从
redis-cli
info replication
五、部署哨兵节点
1. 部署哨兵
systemctl stop firewalld
setenforce 0
systemctl disable firewalld
dnf -y install gcc
tar zxvf redis-6.2.4
cd redis-6.2.4make
make PREFIX=/usr/local/redis installmkdir /etc/redis
cp redis.conf /etc/redis/6379.confln -s /usr/local/redis/bin/* /usr/local/bin/
2. 修改配置文件
vim /etc/redis/6379.conf
bind 0.0.0.0
daemonize yes //75行
sentinel monitor master 192.168.10.101 6379 2 //添加出来,监测master,当主节点故障,至少需要2个哨兵节点同意,才能判断主故障(客观故障)
3. 编写服务脚本
cd /lib/systemd/system
vim redis.service[Unit]
Description=redis
After=network.target[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-sentinel /etc/redis/6379.conf[Install]
WantedBy=multi-user.target-启动
systemctl daemon-reload
systemctl start redis
systemctl enable redis-查看进程
netstat -anpt | grep redis
4. 查看哨兵状态信息
redis-cli
info sentinel
5. 故障转移
-在主上模拟故障,停止服务
systemctl stop redis
-再查看哨兵状态信息
info sentinel //master发生变化
6.查看哨兵epoch
每进行一次主从切换,epoch相关的参数都会加1
tail /etc/redis/6379.conf