一、前言:为什么需要哨兵集群?
在生产环境中,单点 Redis 主节点一旦宕机,整个写服务将中断 。
手动切换不仅慢(几分钟),还容易出错。
Redis Sentinel(哨兵)集群 可以实现:
✅ 自动监控主从节点健康状态
✅ 主节点宕机时自动选举新主
✅ 通知客户端更新连接地址
✅ 全程无需人工干预!
本文将带你从零搭建一个 1 主 + 2 从 + 3 哨兵 的高可用 Redis 架构,并验证故障转移效果。
二、环境准备
2.1 服务器规划(可单机模拟)
| 角色 | IP 地址 | 端口 | 说明 |
|---|---|---|---|
| Master | 192.168.1.10 | 6379 | 主节点 |
| Slave1 | 192.168.1.11 | 6379 | 从节点1 |
| Slave2 | 192.168.1.12 | 6379 | 从节点2 |
| Sentinel1 | 192.168.1.10 | 26379 | 哨兵1(可与 Master 同机) |
| Sentinel2 | 192.168.1.11 | 26379 | 哨兵2(可与 Slave1 同机) |
| Sentinel3 | 192.168.1.12 | 26379 | 哨兵3(可与 Slave2 同机) |
💡 单机测试:可在同一台机器用不同端口模拟(如 6380、6381)
2.2 软件要求
- Redis 6.0+(推荐 7.x)
- Linux / macOS(Windows 仅限 WSL)
三、第一步:搭建 Redis 主从复制
3.1 配置主节点(master.conf)
# /etc/redis/master.conf
port 6379
bind 0.0.0.0
daemonize yes
logfile "/var/log/redis/master.log"
dir /var/lib/redis
requirepass "your_strong_password" # 建议设置密码
启动主节点:
bash
redis-server /etc/redis/master.conf
3.2 配置从节点(slave1.conf & slave2.conf)
# /etc/redis/slave1.conf
port 6379
bind 0.0.0.0
daemonize yes
logfile "/var/log/redis/slave1.log"
dir /var/lib/redis
# 关键:指向主节点
replicaof 192.168.1.10 6379
masterauth "your_strong_password" # 主节点密码
⚠️ 注意 :Redis 5.0+ 使用
replicaof替代slaveof
启动两个从节点:
bash
redis-server /etc/redis/slave1.conf
redis-server /etc/redis/slave2.conf
3.3 验证主从同步
bash
# 在主节点写入
redis-cli -h 192.168.1.10 -a your_strong_password SET hello world
# 在从节点读取
redis-cli -h 192.168.1.11 GET hello # 应返回 "world"
四、第二步:配置哨兵集群
4.1 创建哨兵配置文件(sentinel.conf)
所有哨兵节点使用相同配置(除日志路径外)
# /etc/redis/sentinel.conf
port 26379
bind 0.0.0.0
daemonize yes
logfile "/var/log/redis/sentinel.log"
dir /var/lib/redis
# 监控名为 mymaster 的主节点
# quorum=2:至少 2 个哨兵同意才判定主节点宕机
sentinel monitor mymaster 192.168.1.10 6379 2
# 主节点密码(必须配置!)
sentinel auth-pass mymaster your_strong_password
# 判定主观下线时间(毫秒)
sentinel down-after-milliseconds mymaster 30000
# 故障转移超时(毫秒)
sentinel failover-timeout mymaster 180000
# 故障转移后,并行同步从节点数
sentinel parallel-syncs mymaster 1
🔑 关键参数说明:
mymaster:主节点逻辑名称(客户端通过此名称查询)quorum=2:3 节点集群中,需 2 个哨兵同意才触发 ODOWNauth-pass:必须配置,否则哨兵无法操作带密码的主节点
4.2 启动三个哨兵节点
bash
# 在三台机器分别执行
redis-sentinel /etc/redis/sentinel.conf
💡 单机测试 :复制三份配置,修改
port为 26379/26380/26381,分别启动
五、第三步:验证哨兵集群状态
5.1 查看哨兵监控信息
bash
redis-cli -p 26379 SENTINEL MASTER mymaster
关键字段:
num-slaves: 2(应有 2 个从节点)num-other-sentinels: 2(其他哨兵数量)flags: 正常应为master,宕机后变为odown, sdown
5.2 查看所有哨兵共识
bash
redis-cli -p 26379 SENTINEL SENTINELS mymaster
→ 应显示另外两个哨兵的信息
5.3 客户端获取主节点地址
bash
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
# 返回:1) "192.168.1.10" 2) "6379"
六、第四步:模拟故障转移(实战验证)
6.1 手动停止主节点
bash
# 在主节点机器执行
redis-cli -a your_strong_password shutdown
6.2 观察哨兵日志
# /var/log/redis/sentinel.log
+sdown master mymaster 192.168.1.10 6379 # 主观下线
+odown master mymaster ... # 客观下线
+new-epoch 1
+try-failover master mymaster ...
+vote-for-leader abc123 1 # 投票
+elected-leader master mymaster ...
+failover-state-select-slave master mymaster ...
+selected-slave slave 192.168.1.11:6379 # 选出新主
+failover-state-send-slaveof-noone ...
+switch-master mymaster 192.168.1.10 6379 192.168.1.11 6379 # 切换完成!
6.3 验证新主节点
bash
# 查询当前主节点
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
# 返回:1) "192.168.1.11" 2) "6379"
# 写入新主
redis-cli -h 192.168.1.11 -a your_strong_password SET test_key new_value
# 从节点(原主恢复后)应能同步
redis-cli -h 192.168.1.10 GET test_key # 若原主已重启
6.4 原主恢复后自动变为从节点
-
重启原主:
bashredis-server /etc/redis/master.conf -
查看其角色:
bashredis-cli -h 192.168.1.10 ROLE # 返回:1) "slave" 2) "192.168.1.11" ...
✅ 成功!整个过程全自动,无需人工干预。
七、客户端连接示例(Spring Boot)
# application.yml
spring:
redis:
sentinel:
master: mymaster
nodes:
- 192.168.1.10:26379
- 192.168.1.11:26379
- 192.168.1.12:26379
password: your_strong_password
✅ 应用会自动连接当前主节点,切换时可能短暂报错,重试即可。
八、生产环境最佳实践
✅ 必须遵守
- 至少 3 个哨兵节点(部署在不同物理机/可用区)
- 哨兵与 Redis 实例尽量分离部署(避免资源竞争)
- 主从节点必须设置密码 ,并在哨兵中配置
auth-pass - 监控哨兵日志与
+switch-master事件
✅ 推荐配置
down-after-milliseconds: 10000~30000(根据网络质量)quorum: 3 节点设 2,5 节点设 3- 从节点设置
replica-priority控制升主顺序
九、常见问题排查
❌ 问题:哨兵无法发现从节点
- 原因 :主节点未正确配置
replicaof,或网络不通 - 解决 :检查
INFO REPLICATION输出
❌ 问题:故障转移后客户端连不上
- 原因:客户端未使用 Sentinel 模式,或未配置密码
- 解决 :确保使用
JedisSentinelPool或 Spring Boot Sentinel 配置
❌ 问题:哨兵日志报 NOAUTH
- 原因 :未配置
sentinel auth-pass - 解决 :在
sentinel.conf中添加主节点密码
十、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!