Redis搭建哨兵集群实践

 更新时间:2026年04月17日 08:45:31   作者:難釋懷  
本文介绍了从零搭建一个1主+2从+3哨兵的高可用Redis架构,并验证故障转移效果,文中详细描述了环境准备、搭建Redis主从复制、配置哨兵集群、验证哨兵集群状态以及模拟故障转移的步骤,最后,还提供了在生产环境中的最佳实践和常见问题排查建议

一、前言:为什么需要哨兵集群?

在生产环境中,单点 Redis 主节点一旦宕机,整个写服务将中断

手动切换不仅慢(几分钟),还容易出错。

Redis Sentinel(哨兵)集群 可以实现:

  • ✅ 自动监控主从节点健康状态
  • ✅ 主节点宕机时自动选举新主
  • ✅ 通知客户端更新连接地址
  • ✅ 全程无需人工干预!

本文将带你从零搭建一个 1 主 + 2 从 + 3 哨兵 的高可用 Redis 架构,并验证故障转移效果。

二、环境准备

2.1 服务器规划(可单机模拟)

角色IP 地址端口说明
Master192.168.1.106379主节点
Slave1192.168.1.116379从节点1
Slave2192.168.1.126379从节点2
Sentinel1192.168.1.1026379哨兵1(可与 Master 同机)
Sentinel2192.168.1.1126379哨兵2(可与 Slave1 同机)
Sentinel3192.168.1.1226379哨兵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 中添加主节点密码

十、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 一文掌握Redis的三种集群方案(小结)

    一文掌握Redis的三种集群方案(小结)

    这篇文章主要介绍了一文掌握Redis的三种集群方案(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Redis系列之底层数据结构SDS详解

    Redis系列之底层数据结构SDS详解

    SDS(简单动态字符串)是Redis使用的核心数据结构,用于替代C语言的字符串,以解决长度获取慢、内存溢出等问题,SDS通过预分配与惰性释放策略优化内存使用,增强安全性,且能存储文本与二进制数据,可查看源码src/sds.h和src/sds.c了解更多
    2024-11-11
  • Redis和数据库的一致性(Canal+MQ) 的实现

    Redis和数据库的一致性(Canal+MQ) 的实现

    本文主要介绍了Redis和数据库的一致性(Canal+MQ),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-06-06
  • linux 常见的标识与Redis数据库详解

    linux 常见的标识与Redis数据库详解

    这篇文章主要介绍了linux 常见的标识与Redis数据库,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Ubuntu下Redis密码设置问题及其解决过程

    Ubuntu下Redis密码设置问题及其解决过程

    这篇文章主要介绍了Ubuntu下Redis密码设置问题及其解决过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • 如何使用Redis 实现分布式锁(含自动续期与安全释放)

    如何使用Redis 实现分布式锁(含自动续期与安全释放)

    本文详解用Redis实现分布式锁,包含自动续期与安全释放,推荐使用Redisson,内置可重入、Watchdog及高可用支持,对比原生和自研方案,强调其在生产环境的高效与安全性,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • mac下设置redis开机启动方法步骤

    mac下设置redis开机启动方法步骤

    这篇文章主要介绍了mac下设置redis开机启动,本文详细的给出了操作步骤,需要的朋友可以参考下
    2015-07-07
  • 使用Redis实现实时排行榜功能

    使用Redis实现实时排行榜功能

    排行榜功能是一个很普遍的需求。使用 Redis 中有序集合的特性来实现排行榜是又好又快的选择。接下来通过本文给大家介绍使用Redis实现实时排行榜功能,需要的朋友可以参考下
    2021-07-07
  • Redis使用RedisTemplate导致key乱码问题解决

    Redis使用RedisTemplate导致key乱码问题解决

    本文主要介绍了Redis使用RedisTemplate导致key乱码问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • 硬核!15张图解Redis为什么这么快(推荐)

    硬核!15张图解Redis为什么这么快(推荐)

    作为一名服务端工程师,工作中你肯定和 Redis 打过交道。Redis为什么快,这点想必你也知道,至少为了面试也做过准备,今天通过本文给大家介绍下,感兴趣的朋友一起看看吧
    2020-10-10

最新评论