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

相关推荐
数据库小组2 小时前
从业务库到实时分析库,NineData 构建 MySQL 到 SelectDB 同步链路
数据库·mysql·数据库管理工具·数据同步·ninedata·数据库迁移·selectdb
wangchunting2 小时前
数据结构-树
java·数据结构
CDN3602 小时前
CDN HTTPS 证书配置失败?SSL 部署与域名绑定常见问题
数据库·https·ssl
无籽西瓜a2 小时前
【西瓜带你学设计模式 | 第五期 - 建造者模式】建造者模式 —— 产品构建实现、优缺点与适用场景及模式区别
java·后端·设计模式·软件工程·建造者模式
wzl202612132 小时前
《基于企微会话存档的精准发送策略:从互动数据分析到防折叠群发》
java·数据分析·企业微信
Chengbei112 小时前
一次比较简单的360加固APP脱壳渗透
网络·数据库·web安全·网络安全·系统安全·网络攻击模型·安全架构
寒秋花开曾相惜2 小时前
(学习笔记)3.9 异质的数据结构(3.9.1 结构)
c语言·网络·数据结构·数据库·笔记·学习
mcooiedo2 小时前
mybatisPlus打印sql配置
数据库·sql
爱学习的程序媛2 小时前
JWT签发全指南:从原理到安全实践
分布式·安全·web安全·安全架构·jwt签发·无状态认证