Redis 哨兵模式:它到底是怎么保证高可用的

主从复制有个绕不开的短板:

它撑不起 Redis 的高可用。

主节点一旦宕机,整个集群就失去了写入能力。

哨兵模式就是为解决这个问题而生的,它能让主从集群自动完成故障恢复。

哨兵到底是什么

哨兵节点本质也是 Redis 实例,一般由多台组成集群,生产上至少部署 3 个。

它干三件事。

第一是监控,持续探活主从节点,确认它们都在正常工作。

第二是自动故障恢复,主节点挂了,哨兵会挑一个从节点顶上去继续服务;从节点挂了,它会自动剔除。

第三是通知,客户端通过 Sentinel 获取当前主节点地址,主节点切换后能够自动发现新的 Master。

这三件事合起来,就是 Redis 主从高可用的底气。

哨兵是怎么盯哨的

哨兵靠心跳机制判断服务生死,默认每 1 秒向集群每个实例发一次 PING。

收到 PONG 就说明实例活着。

如果某个实例在限定时间内没回 PONG,这台哨兵就单方面判定它"主观下线"。

注意,主观下线只是这一台哨兵自己的判断。

要确认节点真挂了,还得其他哨兵一起投票。

当认为它下线的哨兵数量达到 quorum 阈值,才会被标记为"客观下线"。

这个 quorum 值在 redis.conf 里配,quorum 通常配置为能够形成多数判断的数量,例如 3 个 Sentinel 时通常设置为 2。

主节点挂了,哨兵怎么选新主

首先会过滤掉长时间断开的从节点,然后按照优先级、复制偏移量、run id 依次选择。

第一条看断连时长。从节点跟主节点断开太久,直接失去候选资格,因为断得越久丢的数据越多。这个时长在配置文件里设。

第二条比优先级,配置项值越小优先级越高,优先被选。优先级同样可配。

第三条比 offset。优先级相同就看复制偏移量,offset 越大说明数据越接近原主节点,越先被选中。

第四条基本轮不到,前面都相同时才按 run id 随便挑一个。

四条里最关键的其实是第三条:offset 越大,数据越全,越优先上位。

不过哨兵模式也不是万能,它有个经典坑叫"脑裂",也是面试的高频题。

脑裂:一个大脑裂成两个

看一个正常的主从加哨兵架构。

假如主节点和哨兵被网络切到了不同分区,哨兵连不上主节点,只能看到从节点。

按选主规则,哨兵会从从节点里提拔一个新主。

但老主节点其实没挂,只是网络断了,客户端还连着它。

于是集群里同时出现了两个 master,像大脑分裂了一样,这就是脑裂。

问题来了:

客户端还在往老主写数据,新主因为网络不通根本同步不到。

等网络恢复,哨兵把老主强制降级成从节点,老主要从新主全量同步,本地数据被清空。

脑裂期间客户端写进老主的数据,就这么丢了。

脑裂怎么治

两个配置就能大幅止血。

第一,设 min-replicas-to-write 至少为 1。

意思是主节点要接收写请求,必须至少有 1 个从节点在线。

连不上从节点,主节点直接拒绝写入。

第二,设置 min-replicas-max-lag,限制从节点 ACK 延迟时间。

两个条件任一不满足,主节点就拒绝客户端写请求。

这样即使发生脑裂,也能拦住大量数据写进孤岛,避免恢复后清空丢失。

面试实战:三连问

问:怎么保证 Redis 的高可用?

答案就是哨兵模式,它让主从集群能自动故障恢复,包含三个作用。

监控,盯住每个实例是否健康。

自动故障恢复,主节点挂了按选主规则提拔从节点顶上。

通知,哨兵主动告诉客户端该连哪个 Redis。

问:你们 Redis 是单点还是集群?用的哪种集群?

参考答法:

主从通常一主一从加哨兵就够。

单节点内存控制在 10G 以内。

Redis 是缓存,不该把海量数据硬塞进去,只放热点数据,一般项目 10G 足够。

一主一从能扛住多数项目的高并发和高可用:

主节点负责写,从节点负责读,Redis 单节点通常可以支撑数万到十万级 QPS,具体性能取决于硬件和业务模型,多数业务根本触不到这个上限。

数据量特别大时,就按业务拆多套主从,比如订单服务一套、秒杀服务一套,多套集群并行解决容量问题。

问:Redis 集群脑裂怎么解决?

先讲清脑裂:

主从和哨兵处在不同网络分区,哨兵收不到主节点心跳,就把一个从节点提成了主节点,出现两个 master。

客户端还在老主写数据,新主同步不到。

网络恢复后老主降级成从节点,从新主同步数据,导致老主在脑裂期间写入的数据大量丢失。

解决靠改两个配置:

设最小从节点数,缩短主从同步延迟上限。

不达标就直接拒绝客户端写请求,从而避免大量数据丢失。

相关推荐
葡萄城技术团队13 分钟前
买来的设备管理系统总"不合脚"?——"管理+感知+智能"三层框架与分期落地路径
后端
程序员天天困27 分钟前
RustFS 1.0.0 深度解析:GA 之后,它值得替代 MinIO 吗?
后端·云原生·rust
葡萄城技术团队28 分钟前
GcExcel V9.2 新特性揭秘:注音文字,随正文一起进 PDF
后端
海阔天空36728 分钟前
1538 万行大表从 SQL Server 搬到 MySQL:一个支持断点续传的迁移工具设计与踩坑实录
后端
狗头大军之江苏分军1 小时前
《潮水漫过十七岁》爸爸最近很忙
后端
isfox1 小时前
MapReduce Join 操作:大表关联小表用 Map 端,大表关联大表用 Reduce 端
后端
怕浪猫1 小时前
构建你自己的 AI Agent 发行版:从 Profile 定制到生产部署全流程
前端·后端·面试
程序员阿鹏2 小时前
双亲委派机制
java·jvm·数据结构·后端
65岁退休Coder2 小时前
把 Agent 框架拆开:PI 开发生产级 Harness
后端·node.js·agent
步行cgn2 小时前
Spring Bean 的生命周期详解
java·后端·spring