目录
一、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=disabled
hostnamectl 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.4
make
make PREFIX=/usr/local/redis install
mkdir /etc/redis
cp redis.conf /etc/redis/6379.conf
ln -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