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宕机时,秒杀、优惠券等核心业务能快速自动恢复。

相关推荐
sun༒6 分钟前
Spring @Scheduled 定时任务详解:Cron表达式、执行顺序、优先级与并行调度
java·后端·spring
一次旅行16 分钟前
DeepSeek‑V4‑Flash‑Vision‑Exp 小白入门实战|3种传图方式、完整可跑代码、避坑排障
java·前端·人工智能
野生技术架构师33 分钟前
Spring Boot 实现数据脱敏:自定义注解 + Jackson 序列化器
java·spring boot·后端
爱吃火鸡面呀36 分钟前
MySQL 查询与函数详解:从基础条件筛选到高级字符处理
数据库·mysql
AI人工智能+电脑小能手41 分钟前
大白话说Java设计模式-28-模板方法模式(业务实战篇)
java·设计模式·模板方法模式·spring源码·订单系统·代码复用
奥莱维43 分钟前
KNX酒店方案_KNX专用线与高端酒店技术逻辑
java·服务器·前端·数据库
工业一体机老司机1 小时前
Linux工业一体机自启动服务配置:systemd服务单元编写与开机优化实战
java·linux·服务器
牛大兵1 小时前
机顶盒获取局域网已经使用IP,开放的端口号,扫描摄像头,NAS,共享主机等开机自启局域网全量扫描工具
数据库·网络协议·tcp/ip
知行产研1 小时前
中国矿山无人驾驶出海的三重门
数据库·mysql·php
weixin_538601971 小时前
智能体测开Day56
java