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"  # 建议设置密码

启动主节点:

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 个哨兵同意才触发 ODOWN
  • auth-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 原主恢复后自动变为从节点

  • 重启原主:

    bash 复制代码
    redis-server /etc/redis/master.conf
  • 查看其角色:

    bash 复制代码
    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 中添加主节点密码

十、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
璞~1 小时前
安装达梦数据库
数据库
oioihoii2 小时前
数据库查询优化中的谓词下推策略与成本感知优化实践
服务器·数据库·oracle
Full Stack Developme2 小时前
MongoDB 应用场景
数据库·mongodb
学习是生活的调味剂2 小时前
大模型应用之使用LangChain实现RAG(二)智能客服
服务器·数据库·langchain
瓜农老梁2 小时前
战火中的微光:归途
数据库
m0_738120722 小时前
渗透测试——pyexpvm靶机详细提权过程(MSF框架,Hydra数据库爆破,SUDO提权)
服务器·网络·数据库·python·sql·web安全
盐水冰2 小时前
【Redis】学习(3)Redis的Java客户端
java·redis·学习
wuyaolong0072 小时前
PostgreSQL 中进行数据导入和导出
大数据·数据库·postgresql
夕除2 小时前
MySQL--008
数据库·mysql