高级篇 10. 分布式缓存 - 哨兵 (Sentinel) 核心原理

4 阅读5分钟

在上面的一章中,你已经成功敏锐地察觉到了主从架构的致命弱点:单点故障风险

在主从架构中,如果“带头大哥”(Master)突然因为机房断电或硬件损坏而彻底宕机,整个集群就会瞬间失去处理“写请求”的能力。系统会立刻报错,甚至引发雪崩。如果靠人工半夜爬起来去把一个“小弟”(Slave)提拔成大哥,那黄花菜都凉了。

为了实现真正的 7x24 小时高可用(High Availability) ,让系统拥有自动“选举新王”的能力,Redis 祭出了它的终极防线——哨兵机制 (Sentinel) 。这也是在后端研发岗位秋招中,面试官极其喜欢用来考察你“容灾架构设计”能力的重点。


📚 高级篇 10. 分布式缓存 - 哨兵 (Sentinel) 核心原理

一、 核心认知:什么是哨兵机制?

Redis Sentinel (哨兵) 本质上也是一个运行在特殊模式下的 Redis 进程。只不过它不存业务数据,它的唯一职责就是像“巡逻兵”一样,时刻死盯着你的主从集群,确保它们健康运行。

为了防止“巡逻兵”自己也宕机,生产环境中通常会部署一个哨兵集群(至少 3 个节点)来联合监控主从集群。

二、 哨兵的四大核心作用 (面试速记)

面试官如果问你“哨兵能干嘛?”,你可以按照这四个维度来回答:

  1. 监控 (Monitoring): 哨兵会不断地向 Master 和 Slave 发送 PING 命令,检查它们是否正常在线。
  2. 自动故障恢复 (Automatic Failover) ⚡核心: 如果 Master 宕机,哨兵会自动开始一场“民主选举”,从一堆 Slave 中挑选出一个最优秀的,把它强行提拔为新的 Master。
  3. 通知 (Notification): 当集群发生了故障转移(换了新大哥),哨兵会将最新的状态通知给后端的 Java 应用程序或系统管理员。
  4. 配置提供者 (Configuration Provider): 引入哨兵后,后端的 Java 代码(比如 Spring Boot 客户端)不再直接写死 Master 的 IP,而是去连接哨兵!客户端每次要写数据前,先问哨兵:“现在谁是大哥?”,哨兵会把最新选出来的大哥 IP 返回给客户端。

三、 硬核原理:哨兵怎么确认大哥“驾崩”了?

这是一个极其经典的面试坑题。网络环境是很复杂的,如果一个哨兵突然连不上 Master 了,能立刻宣布 Master 死掉并开始选新大哥吗?

绝对不行! 因为可能只是这个哨兵自己的网线被踢掉了(网络分区现象),Master 其实活得好好的。如果在这种情况下盲目选新大哥,就会导致集群里出现两个大哥,这就是恐怖的**“脑裂 (Split-Brain)”**问题。

为了防止误判,哨兵引入了极其严谨的双重判定机制

  1. 主观下线 (sdown - Subjective Down):

    某一个哨兵向 Master 发送 PING,如果超过了设定的超时时间(比如 30 秒)没收到回复,这个哨兵就在自己的小本本上记下:“我认为大哥可能挂了(主观下线)。”

  2. 客观下线 (odown - Objective Down) ⚡决断时刻:

    这个哨兵会在哨兵频道里大喊:“我发现大哥没反应了,你们去看看!”

    其他哨兵立刻去测试。当超过**法定人数(Quorum,通常设置为哨兵总数的一半加一,比如 3 个哨兵,法定人数就是 2)**的哨兵都认为 Master 挂了,系统才会正式宣布:“大哥彻底凉了(客观下线)!”

💡 面试降维打击: “只有达成‘客观下线’共识,哨兵集群才会启动极其耗费资源的故障转移流程。这种引入法定人数(Quorum)投票的机制,完美过滤了单一节点网络抖动带来的误判。”


四、 皇位继承算法:谁来当新大哥?

一旦宣布 Master 客观下线,哨兵集群就要从剩下的 Slave 中选出一个新的 Master。选拔标准极其严格,是有顺序淘汰制的:

  • 第 1 轮海选:踢出“老弱病残”。

    首先排除掉那些已经离线、网络状态极其不稳定、或者很久没和老大哥通信过的 Slave。它们数据太旧,没资格参选。

  • 第 2 轮比拼:拼“关系户” (优先级 slave-priority)。

    可以通过 redis.conf 配置小弟的优先级(数字越小优先级越高,默认都是 100)。如果有谁的配置是 10,直接保送成为新大哥。(通常我们不会改这个,让大家处于同一起跑线)。

  • 第 3 轮比拼:拼“学习成绩” (偏移量 offset) ⚡最重要的一环。

    哨兵会检查所有合格小弟的 offset。谁的 offset 最大,说明谁在掉线前拉取的老大哥数据最完整、最新。谁的进度条最靠前,谁就当大哥!

  • 第 4 轮比拼:拼“身份证号” (运行 ID Run ID)。

    如果两个小弟的 offset 居然一模一样,那就只能比资历了。谁的实例 Run ID(启动时随机生成的字符串)的字典序越小,谁就当选。玄学决胜局!


五、 故障转移的执行步骤 (Failover)

选出了天选之子(假设是 Slave 1)后,哨兵会像钦差大臣一样,执行以下铁腕手段:

  1. 哨兵向 Slave 1 发送 REPLICAOF NO ONE 命令,让它立刻摆脱从属身份,登基成为新的 Master
  2. 哨兵向其他的 Slave(比如 Slave 2)发送命令,强制它们认新的 Master 为大哥:REPLICAOF <Slave 1的IP> <端口>
  3. 哨兵默默修改内部配置,把那个死掉的老 Master 降级为 Slave。如果有一天它奇迹般地复活(修好重启了),它也只能乖乖去给 Slave 1 当小弟。

学习总结

这节课的理论密度非常大!你彻底掌握了高可用架构中最核心的**“监控、共识、选举、转移”**思想。

哨兵机制(Sentinel)通过严谨的客观下线投票(Quorum)和严格的偏移量选主机制,完美地解决了主从架构无法自动容灾的致命痛点。