第5章 Redis哨兵Sentinel
1. 哨兵介绍
主从复制架构的主要缺点是主节点故障需要人工切换,同时代码需要修改连接地址。Redis Sentinel 哨兵架构很好地解决了这个问题。
Redis Sentinel 是特殊的 Redis 节点,不参与数据存储和处理。哨兵采用分布式架构,可以运行多个节点,成员之间互相感知,即使某个哨兵节点故障,其他节点也能正常服务。
哨兵的主要功能
- 监控功能:监控主从节点是否正常工作,哨兵之间共享集群信息
- 自动故障转移:主节点故障时自动选举新主节点,无需人工介入
- 配置中心:客户端通过哨兵获取当前主节点地址,即使主从关系变化也无需修改代码
2. 部署规划
IP地址 | 端口号 | 角色 |
---|---|---|
10.0.0.51 | 6379 | 主节点 |
10.0.0.51 | 26379 | 哨兵节点 |
10.0.0.52 | 6379 | 从节点 |
10.0.0.52 | 26379 | 哨兵节点 |
10.0.0.53 | 6379 | 从节点 |
10.0.0.53 | 26379 | 哨兵节点 |
3. 部署Redis主从节点
以下是 db-51 的操作命令,db-52 和 db-53 只需修改 IP 地址:
cd /opt/
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
tar zxf redis-5.0.7.tar.gz -C /opt/
ln -s /opt/redis-5.0.7 /opt/redis
cd /opt/redis
make
make install
mkdir -p /opt/redis_6379/{conf,logs,pid}
mkdir -p /data/redis_6379
cat >/opt/redis_6379/conf/redis_6379.conf<<EOF
daemonize yes
bind 127.0.0.1 10.0.0.51
port 6379
pidfile "/opt/redis_6379/pid/redis_6379.pid"
logfile "/opt/redis_6379/logs/redis_6379.log"
dbfilename "redis.rdb"
dir "/data/redis_6379"
appendonly yes
appendfilename "redis.aof"
appendfsync everysec
EOF
groupadd redis -g 1000
useradd redis -u 1000 -g 1000 -M -s /sbin/nologin
chown -R redis:redis /opt/redis*
chown -R redis:redis /data/redis*
cat >/usr/lib/systemd/system/redis.service<<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/redis-server /opt/redis_6379/conf/redis_6379.conf --supervised systemd
ExecStop=/usr/local/bin/redis-cli shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start redis
4. 配置主从复制
redis-cli -h 10.0.0.52 slaveof 10.0.0.51 6379
redis-cli -h 10.0.0.53 slaveof 10.0.0.51 6379
redis-cli -h 10.0.0.51 info replication
5. 部署哨兵节点
三台机器都需要执行以下操作:
mkdir -p /data/redis_26379
mkdir -p /opt/redis_26379/{conf,pid,logs}
cat >/opt/redis_26379/conf/redis_26379.conf << EOF
bind $(ifconfig eth0|awk 'NR==2{print $2}')
port 26379
daemonize yes
pidfile /opt/redis_26379/pid/redis_26379.pid
logfile /opt/redis_26379/logs/redis_26379.log
dir /data/redis_26379
sentinel monitor myredis 10.0.0.51 6379 2
sentinel down-after-milliseconds myredis 3000
sentinel parallel-syncs myredis 1
sentinel failover-timeout myredis 18000
EOF
chown -R redis:redis /data/redis*
chown -R redis:redis /opt/redis*
cat >/usr/lib/systemd/system/redis-sentinel.service<<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/redis-sentinel /opt/redis_26379/conf/redis_26379.conf --supervised systemd
ExecStop=/usr/local/bin/redis-cli -h $(ifconfig eth0|awk 'NR==2{print $2}') -p 26379 shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start redis-sentinel
redis-cli -h $(ifconfig eth0|awk 'NR==2{print $2}') -p 26379
关键配置解释
sentinel monitor myredis 10.0.0.51 6379 2
# myredis主节点别名 主节点IP 端口 需要2个哨兵节点同意
sentinel down-after-milliseconds myredis 3000
# 认定服务器已经断线所需要的毫秒数
sentinel parallel-syncs myredis 1
# 向主节点发给复制操作的从节点个数,1表示轮训发起复制
sentinel failover-timeout myredis 18000
# 故障转移超时时间
6. 哨兵使用注意事项
⚠️ 哨兵注意事项
- 哨兵发起故障转移的条件是 master 节点失联,从节点挂掉不会触发
- 哨兵会自动维护配置文件,不需要手动修改
- 主从结构变化时,哨兵之间会自动同步并更新配置
- 哨兵启动后,不要再手动设置主从关系
7. 验证主节点
redis-cli -h 10.0.0.51 -p 26379 SENTINEL get-master-addr-by-name myredis
8. 哨兵常用命令
哨兵命令 | 命令解释 |
---|---|
sentinel masters | 打印所有主节点的详细信息 |
sentinel master myredis | 打印指定主节点的详细信息 |
sentinel slaves myredis | 打印所有从节点的详细信息 |
sentinel get-master-addr-by-name myredis | 获取当前主节点的 IP 和端口 |
sentinel failover myredis | 主动发起故障转移 |
sentinel ckquorum myredis | 检查哨兵节点是否满足选举要求 |
9. 故障转移测试
测试步骤
- 关闭当前主节点
- 观察其他节点是否发生选举
- 查看哨兵配置文件是否更新
- 查看从节点配置是否更新
- 验证新主节点能否写入
- 验证从节点同步是否正常
选举流程
- 从节点筛选:
- 过滤不健康节点(主观下线、断线、5秒内未响应 ping、失联超过 down-after-milliseconds×10)
- 选择 slave-priority 最高的从节点
- 选择复制偏移量最大的从节点(数据最完整)
- 选择 runid 最小的从节点
💡 故障转移结果
- 哨兵选举新的主节点
- 新主节点执行
slaveof no one
- 从节点执行
slaveof 新主节点
- 自动更新哨兵配置
- 自动更新从节点配置
10. 故障恢复
故障节点重新上线后:
- 启动 Redis 服务
- 自动成为新主节点的从节点
11. 哨兵加权选举
查看节点权重
redis-cli -h 10.0.0.51 -p 6379 CONFIG GET slave-priority
redis-cli -h 10.0.0.52 -p 6379 CONFIG GET slave-priority
redis-cli -h 10.0.0.53 -p 6379 CONFIG GET slave-priority
设置节点权重
将 10.0.0.53 设为优先主节点:
redis-cli -h 10.0.0.51 -p 6379 CONFIG SET slave-priority 0
redis-cli -h 10.0.0.52 -p 6379 CONFIG SET slave-priority 0
验证设置
redis-cli -h 10.0.0.51 -p 6379 CONFIG GET slave-priority
redis-cli -h 10.0.0.52 -p 6379 CONFIG GET slave-priority
redis-cli -h 10.0.0.51 -p 26379 sentinel get-master-addr-by-name myredis
主动触发选举
redis-cli -h 10.0.0.51 -p 26379 sentinel failover myredis
redis-cli -h 10.0.0.51 -p 26379 sentinel get-master-addr-by-name myredis
💡 最佳实践
- 生产环境至少部署 3 个哨兵节点,确保高可用
- 合理设置 slave-priority,控制故障转移的主节点选择
- 定期测试故障转移流程,确保配置正确
更新: 2025-01-14 16:34:38