Redis哨兵模式(Sentinel)深度解析

Redis哨兵模式(Sentinel)深度解析

基于黑马程序员《Redis黑马点评》高级篇整理。哨兵模式是解决**主从架构"自动故障恢复"**的核心方案,也是高可用集群的基石。

一、为什么需要哨兵?

1.1 主从架构的痛点

在基础的主从复制中,如果Master节点宕机,虽然Slave节点数据完整,但:

  • 写服务不可用:客户端无法写入。
  • 需人工干预 :必须手动执行 slaveof no one将某个Slave提升为Master,并修改客户端配置。
  • 恢复慢:人工操作耗时,业务中断时间长。

1.2 哨兵的价值

哨兵(Sentinel)是一个独立的分布式进程 ,专门用于监控Redis节点,并实现自动故障转移(Failover):

  • 自动选主:Master宕机后,自动选举新的Master。
  • 自动切换:知客户端和Slave节点新的Master地址。
  • 高可用:哨兵自身也是集群部署,避免单点故障。

二、哨兵的核心工作机制

哨兵的工作流程可以概括为监控 -> 判定 -> 选举 -> 切换。

2.1 监控(Monitoring)

哨兵节点通过心跳机制(每秒一次的PING)监控所有Master和Slave的状态。

  • 主观下线(SDOWN):单个哨兵在配置的时间(如30秒)内未收到Master的响应,则标记其为"主观下线"。这仅代表该哨兵的个人判断,可能存在误判(如网络抖动)。
  • 客观下线(ODOWN) :当法定数量(quorum) 的哨兵都认为Master主观下线时,Master被标记为"客观下线",此时才真正触发故障转移流程。

2.2 故障转移流程(Failover)

一旦Master被客观下线,哨兵集群会执行以下步骤:

  1. 选举哨兵Leader :哨兵节点间通过Raft算法选举出一个Leader,由它来负责执行具体的故障转移操作(避免多个哨兵同时执行导致混乱)。

  2. 选举新Master:Leader根据规则从Slave中选出一个晋升为Master:

    • 首先排除网络连接不佳或已下线的Slave。
    • 优先选择优先级(slave-priority) 最高的节点(配置文件中设置,值越小优先级越高)。
    • 优先级相同则选择复制偏移量(repl_offset) 最大的节点(数据最完整)。
    • 若仍相同,则选择Run ID 较小的节点。
  3. 切换与通知:

    • 向新Master发送 SLAVEOF NO ONE命令。
    • 向其他Slave发送 SLAVEOF <new-master-ip> <new-master-port>,使其同步新Master。
    • 更新自身元数据,将原Master标记为Slave(待其恢复后自动成为新Master的从节点)。

三、黑马点评项目实战:搭建与配置

3.1 哨兵集群搭建(以3节点为例)

哨兵通常部署奇数个(如3个),以方便进行Leader选举(避免脑裂)。

  1. 准备配置文件 (如 sentinel-26379.conf):

    shell 复制代码
    # 哨兵端口
    port 26379
    # 监控的主节点:mymaster为集群名,1为quorum值(至少需要1个哨兵同意)
    sentinel monitor mymaster 127.0.0.1 6379 2
    # 主观下线判定时间(毫秒)
    sentinel down-after-milliseconds mymaster 30000
    # 故障转移超时时间
    sentinel failover-timeout mymaster 180000
    # 如果Redis有密码,必须配置
    sentinel auth-pass mymaster your_redis_password
  2. 启动哨兵:

    powershell 复制代码
    redis-server sentinel-26379.conf --sentinel
  3. 验证状态:

    shell 复制代码
    redis-cli -p 26379
    127.0.0.1:26379> info sentinel

3.2 SpringBoot整合(RedisTemplate)

在 application.yml中配置哨兵模式,客户端无需直接连接Master,而是通过哨兵动态获取Master地址:

shell 复制代码
spring:
  redis:
    password: 123456
    sentinel:
      master: mymaster # 哨兵中定义的集群名
      nodes: # 哨兵节点列表
        - 127.0.0.1:26379
        - 127.0.0.1:26380
        - 127.0.0.1:26381

注意 :哨兵模式下,RedisTemplate默认仍为读写Master 。若需实现读写分离(读Slave),需额外配置 LettucePool或使用 @ReadOnly注解。


四、关键配置与调优

配置项 说明 生产建议
quorum 判定客观下线所需的最少哨兵票数 通常设为 哨兵总数/2 + 1(如3哨兵设为2)
down-after-milliseconds 主观下线判定超时 网络稳定可设小(如15s),不稳定设大(如30s)
failover-timeout 故障转移超时时间 默认3分钟,超时则放弃本次切换
parallel-syncs 故障转移后,同时向新Master同步的Slave数 设为1,避免新Master压力过大

五、面试高频考点

  1. 主观下线 vs 客观下线?
    • 主观下线:单哨兵认为Master不可用,可能是误判。
    • 客观下线 :quorum个哨兵达成共识,确认Master故障,只有客观下线才会触发故障转移。
  2. 哨兵如何选举新Master?
    • 先看优先级 (slave-priority),再看数据同步进度 (offset),最后看Run ID。
  3. 哨兵集群如何通信?
    • 通过Redis的发布/订阅(Pub/Sub) 机制,在Master的 __sentinel__:hello频道进行通信,实现相互发现。
  4. 哨兵模式的数据一致性?
    • 由于主从复制是异步 的,故障转移时可能丢失少量数据(原Master未来得及同步给新Master的数据)。对于强一致性要求高的业务(如余额),需在代码中做补偿(如写后读主库校验)。

黑马点评总结:哨兵模式解决了主从架构的"自动故障恢复"问题,是构建高可用缓存服务的必备组件。在项目中,通常配合主从复制(读写分离)使用,确保在Master宕机时,秒杀、优惠券等核心业务能快速自动恢复。

相关推荐
todoitbo几秒前
报表总在扫大表,列存储应该放在哪一层
大数据·数据库·报表·国产数据库
Rain的Java大神之路1 分钟前
MySQL 被高并发打爆?从定位到分库分表逐层拆解(含秒杀库存实战)
java·后端·面试
瑞克-桑切斯2 分钟前
MySQL部署手册(5.7.20/8.0)
数据库·mysql
cc_瀚海知行4 分钟前
工具调用 6|助手什么时候该停下来?
java·服务器·前端·人工智能·python·ai
YDS8297 分钟前
Small Spring IOC篇:应用上下文实现和Bean的扩展
java·后端·spring
Pniubi9 分钟前
ConcurrentHashMap拆分线程池难点再讲
java·jvm
golang学习记10 分钟前
IDEA 的 Java 智能,现在跑到 Cursor 和 VS Code 里去了
java·ide·vscode·intellij-idea·claude code
ss27317 分钟前
AI时代首先数据库-PostgreSQL实战笔记 | 19 PostgreSQL逻辑备份:pg_dump与pg_dumpall
数据库·笔记·postgresql
啵啵啵鱼20 分钟前
九、JDBC 操作 MySQL 数据库
android·数据库·mysql
handonch21 分钟前
MySQL → Kingbase PG模式 高频SQL替换清单
数据库·mysql·postgresql