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

相关推荐
数据库小学妹1 分钟前
数据库选型实战:从数据类型到TCO成本,五维决策框架+九款产品横评
数据库·信创·国产数据库·数据库选型·oracle迁移
豆瓣鸡15 分钟前
算法日记 - Day3
java·开发语言·算法
萧瑟余晖31 分钟前
Java深入解析篇九之NIO详解
java·网络·nio
The Chosen One9851 小时前
高进度算法模板速记(待完善)
java·前端·算法
神龙天舞20011 小时前
MySQL 备库为什么会延迟好几个小时
android·数据库·mysql
丙氨酸長鏈2 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
独行侠影a3 小时前
APScheduler+Redis 分布式定时任务:解决多实例任务重复执行
数据库·redis·分布式
极光代码工作室3 小时前
基于SpringBoot的课程预约系统
java·springboot·web开发·后端开发
传说故事3 小时前
数据库中一些常用英文单词含义
数据库·oracle
Leighteen4 小时前
`try-finally` 里的 `return`:为什么 `finally` 会悄悄改掉返回值、吞掉异常
java·开发语言