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

十、结语

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

相关推荐
weixin_460443561 分钟前
企业考试系统如何对接OA、钉钉和企业微信?SSO单点登录、组织同步与权限一致性设计
java·开发语言·数据库
xywww1685 分钟前
真实后台页实测:Opus 5 看图写前端的可用边界在哪
linux·服务器·前端·数据库·人工智能·gpt
上海云盾商务经理杨杨1 小时前
SQL 盲注入渗透实战!无报错页面也能成功注入
数据库·sql
秋田君1 小时前
QT_绘图原理双缓冲机制
服务器·数据库·qt
一条闲鱼_mytube2 小时前
深入理解 Pinecone 向量数据库:从云服务到索引原理,一篇讲透
数据库
许彰午2 小时前
政务低代码平台实战⑤:双输出模式——存DB与导出JSP的完整链路
数据库·低代码·政务
南京码讯光电技术有限公司3 小时前
What Does Ex tb IIIC T80°C Db Mean?
服务器·网络·数据库
2501_937860943 小时前
MySQL CRUD 增删改查
数据库·mysql
做萤石二次开发的哈哈3 小时前
萤石蓝海AIoT一站式工作台计费说明
网络·数据库·萤石开放平台·蓝海aiot一站式工作台
竹枝溪3 小时前
MySQL数据库零基础入门
数据库·sql·mysql·navicat·ddl·dml·dql