IT俱乐部 Redis 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 个哨兵同意才触发 ODOWN
  • auth-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

应用会自动连接当前主节点,切换时可能短暂报错,重试即可。

八、生产环境最佳实践

必须遵守

  1. 至少 3 个哨兵节点(部署在不同物理机/可用区)
  2. 哨兵与 Redis 实例尽量分离部署(避免资源竞争)
  3. 主从节点必须设置密码,并在哨兵中配置 auth-pass
  4. 监控哨兵日志与 +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 中添加主节点密码

十、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持IT俱乐部。

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/database/redis/18205.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部