34人参与 • 2026-04-17 • Redis
在生产环境中,单点 redis 主节点一旦宕机,整个写服务将中断。
手动切换不仅慢(几分钟),还容易出错。
redis sentinel(哨兵)集群 可以实现:
本文将带你从零搭建一个 1 主 + 2 从 + 3 哨兵 的高可用 redis 架构,并验证故障转移效果。
| 角色 | 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)
# /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
# /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
# 在主节点写入 redis-cli -h 192.168.1.10 -a your_strong_password set hello world # 在从节点读取 redis-cli -h 192.168.1.11 get hello # 应返回 "world"
所有哨兵节点使用相同配置(除日志路径外)
# /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:必须配置,否则哨兵无法操作带密码的主节点# 在三台机器分别执行 redis-sentinel /etc/redis/sentinel.conf
单机测试:复制三份配置,修改 port 为 26379/26380/26381,分别启动
redis-cli -p 26379 sentinel master mymaster
关键字段:
num-slaves: 2(应有 2 个从节点)num-other-sentinels: 2(其他哨兵数量)flags: 正常应为 master,宕机后变为 odown, sdownredis-cli -p 26379 sentinel sentinels mymaster
→ 应显示另外两个哨兵的信息
redis-cli -p 26379 sentinel get-master-addr-by-name mymaster # 返回:1) "192.168.1.10" 2) "6379"
# 在主节点机器执行 redis-cli -a your_strong_password shutdown
# /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 # 切换完成!
# 查询当前主节点 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 # 若原主已重启
重启原主:
redis-server /etc/redis/master.conf
查看其角色:
redis-cli -h 192.168.1.10 role # 返回:1) "slave" 2) "192.168.1.11" ...
✅ 成功!整个过程全自动,无需人工干预。
# 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应用会自动连接当前主节点,切换时可能短暂报错,重试即可。
auth-pass+switch-master 事件down-after-milliseconds: 10000~30000(根据网络质量)quorum: 3 节点设 2,5 节点设 3replica-priority 控制升主顺序replicaof,或网络不通info replication 输出jedissentinelpool 或 spring boot sentinel 配置sentinel auth-passsentinel.conf 中添加主节点密码以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论