Redis搭建哨兵集群实践
作者:難釋懷
本文介绍了从零搭建一个1主+2从+3哨兵的高可用Redis架构,并验证故障转移效果,文中详细描述了环境准备、搭建Redis主从复制、配置哨兵集群、验证哨兵集群状态以及模拟故障转移的步骤,最后,还提供了在生产环境中的最佳实践和常见问题排查建议
一、前言:为什么需要哨兵集群?
在生产环境中,单点 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" # 建议设置密码
启动主节点:
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
启动两个从节点:
redis-server /etc/redis/slave1.conf redis-server /etc/redis/slave2.conf
3.3 验证主从同步
# 在主节点写入 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 启动三个哨兵节点
# 在三台机器分别执行 redis-sentinel /etc/redis/sentinel.conf
单机测试:复制三份配置,修改 port 为 26379/26380/26381,分别启动
五、第三步:验证哨兵集群状态
5.1 查看哨兵监控信息
redis-cli -p 26379 SENTINEL MASTER mymaster
关键字段:
num-slaves: 2(应有 2 个从节点)num-other-sentinels: 2(其他哨兵数量)flags: 正常应为master,宕机后变为odown, sdown
5.2 查看所有哨兵共识
redis-cli -p 26379 SENTINEL SENTINELS mymaster
→ 应显示另外两个哨兵的信息
5.3 客户端获取主节点地址
redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster # 返回:1) "192.168.1.10" 2) "6379"
六、第四步:模拟故障转移(实战验证)
6.1 手动停止主节点
# 在主节点机器执行 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 验证新主节点
# 查询当前主节点 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 原主恢复后自动变为从节点
重启原主:
redis-server /etc/redis/master.conf
查看其角色:
redis-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中添加主节点密码
十、总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
