Redis 的高可用(High Availability,HA)核心目标是 服务持续可用(最小化宕机时间)和 数据不丢失(或可控丢失),其实现依赖三大核心支柱:数据冗余(主从复制) 、故障检测、自动故障转移。不同部署模式(主从、哨兵、集群)的高可用机制虽有差异,但底层原理一致,以下从「核心基础 + 三种部署模式的高可用实现 + 关键保障机制」展开,结合原理、流程和面试考点详解:
一、高可用核心基础:主从复制(数据冗余)
所有高可用机制的前提是 数据冗余—— 通过主从复制(Master-Slave Replication)让从节点同步主节点数据,实现「一主多从」架构。主从复制是 Redis 高可用的基石,解决了「单节点数据丢失」和「读负载分担」问题。
1. 核心原理
-
角色分工:
- 主节点(Master):处理所有写请求,记录数据变更到「复制积压缓冲区」(repl_backlog_buffer);
- 从节点(Slave):仅处理读请求,通过复制协议同步主节点数据,保持与主节点一致。
-
同步流程(全量同步 + 增量同步) :
-
全量同步(首次连接 / 断连后数据差距大) :
- 从节点发送
PSYNC ? -1向主节点请求同步; - 主节点执行
bgsave生成 RDB 快照,同时记录快照生成期间的写命令到「复制缓冲区」; - 主节点发送 RDB 快照给从节点,从节点加载 RDB 清空本地数据;
- 主节点发送复制缓冲区的写命令,从节点执行命令,最终与主节点数据一致。
- 从节点发送
-
增量同步(正常连接时) :
- 从节点通过「复制偏移量」(offset)记录已同步的命令位置;
- 主节点持续将写命令发送到从节点,从节点接收后更新偏移量,保持实时同步。
-
-
关键优化:
- 复制积压缓冲区:环形缓冲区(默认 1MB),保存主节点最近的写命令,用于断连后快速增量同步(避免重复全量同步);
- 无盘复制:主节点直接通过网络将 RDB 数据发送给从节点,不写入本地磁盘(适合磁盘 IO 瓶颈场景);
- 部分复制:基于偏移量和缓冲区,仅同步断连期间缺失的命令,提升同步效率。
2. 面试考点
- 主从复制的同步流程(全量 + 增量)?
- 复制积压缓冲区的作用和大小设置?
- 主从复制中的数据一致性保证?(从节点同步完成前不可读,可通过
slave-serve-stale-data no配置)
二、三种部署模式的高可用机制
Redis 高可用部署分为「主从架构」「哨兵架构」「集群架构」,复杂度和可用性逐步提升,核心差异在于「故障检测」和「故障转移」的实现方式。
(一)主从架构(基础高可用)
-
架构:1 主 N 从(无哨兵),从节点仅同步数据,不参与故障转移。
-
高可用原理:
- 数据冗余:从节点备份主节点数据,主节点故障时可手动切换从节点为主节点;
- 读负载分担:从节点处理读请求,减轻主节点压力(写请求仍仅主节点处理)。
-
高可用局限性:
- 无自动故障转移:主节点故障后,需人工干预切换(修改客户端连接地址、提升从节点为主节点), downtime 长;
- 单主节点瓶颈:写请求集中在主节点,无法横向扩展;
- 数据丢失风险:主节点故障时,从节点可能未同步完最新数据(取决于同步延迟)。
-
适用场景:测试环境、低可用性要求的业务(如非核心读多写少场景)。
(二)哨兵架构(Sentinel,自动高可用)
-
架构:1 主 N 从 + 3 个哨兵节点(推荐奇数,避免脑裂),哨兵是独立进程,负责「故障检测」「自动故障转移」「配置管理」。
-
核心功能(高可用核心) :
-
故障检测(监控) :
- 哨兵节点定期(默认 1 秒)向主从节点发送
PING命令,检测节点存活; - 若主节点未在
down-after-milliseconds(默认 30 秒)内回复,哨兵标记其为「主观下线(SDOWN)」; - 其他哨兵节点通过「哨兵间通信」确认该主节点状态,当超过「quorum」(法定人数,推荐配置为哨兵节点数的一半 + 1)个哨兵标记主节点为 SDOWN 时,标记为「客观下线(ODOWN)」(确定主节点真故障)。
- 哨兵节点定期(默认 1 秒)向主从节点发送
-
自动故障转移(核心流程) :
- 选举领头哨兵(Leader Sentinel):客观下线后,哨兵节点通过 Raft 协议选举领头哨兵,由其执行故障转移(避免多哨兵重复操作);
- 筛选新主节点:从故障主节点的从节点中筛选最优节点(优先级
slave-priority高 > 复制偏移量最大 > 运行时间最长); - 提升从节点为主节点:领头哨兵向筛选出的从节点发送
SLAVEOF NO ONE命令,使其成为新主节点; - 重新配置其他从节点:向其他从节点发送
SLAVEOF 新主节点IP:端口命令,同步新主节点数据; - 客户端重定向:哨兵通过「发布订阅机制」(
__sentinel__:hello频道)通知客户端新主节点地址,客户端更新连接信息。
-
配置管理:哨兵节点维护集群配置(主从节点地址、故障转移记录),客户端可通过哨兵获取当前主节点地址(无需硬编码主节点 IP)。
-
-
关键配置(面试高频) :
sentinel monitor <master-name> <master-ip> <master-port> <quorum>:监控主节点,quorum 为法定人数(如 3 个哨兵配置为 2);sentinel down-after-milliseconds <master-name> 30000:主观下线超时时间(30 秒);sentinel failover-timeout <master-name> 180000:故障转移超时时间(180 秒);sentinel parallel-syncs <master-name> 1:故障转移后,从节点同步新主节点的并发数(1 表示串行同步,避免网络拥堵)。
-
高可用优势:
- 自动故障转移:主节点故障后,哨兵自动完成切换,downtime 控制在秒级;
- 无主节点单点:故障转移后自动选举新主节点;
- 客户端透明:客户端通过哨兵获取主节点地址,无需手动修改配置。
-
面试考点:
- 哨兵的核心功能?(监控、故障转移、配置管理)
- 主观下线(SDOWN)和客观下线(ODOWN)的区别?
- 领头哨兵的选举机制?(Raft 协议,半数以上同意)
- 哨兵集群为什么推荐奇数节点?(避免投票平局,如 3 个节点最多 1 个故障,仍能达成 quorum)
(三)集群架构(Cluster,分布式高可用)
-
架构:3 主 3 从(最小可用规模),无中心节点,节点间通过 Gossip 协议通信,内置哨兵功能(无需独立部署哨兵)。
-
高可用原理(结合分片 + 主从复制) :
-
数据分片(哈希槽) :将 16384 个哈希槽分配给主节点,每个主节点负责部分槽位,解决单主节点写瓶颈;
-
数据冗余:每个主节点配置 1 个以上从节点,同步主节点数据(槽位 + 数据);
-
故障检测:
- 节点间通过 Gossip 协议定期发送
PING/PONG消息,检测节点存活; - 若某节点超过
cluster-node-timeout(默认 15 秒)未响应,其他节点标记其为「疑似故障」; - 当集群中半数以上主节点确认该节点故障时,标记为「确定故障」;
- 节点间通过 Gossip 协议定期发送
-
自动故障转移:
- 故障主节点的从节点发起选举,向集群中其他主节点发送投票请求;
- 若超过半数主节点投票同意,该从节点升级为新主节点;
- 新主节点接管原主节点的哈希槽,其他节点更新路由表(槽位 -> 新主节点映射);
- 客户端通过「MOVED/ASK」重定向命令,将请求路由到新主节点。
-
-
关键配置(面试高频) :
cluster-enabled yes:启用集群模式;cluster-node-timeout 30000:节点故障超时时间(推荐 30~60 秒,避免网络抖动误判);cluster-replica-validity-factor 10:从节点故障转移的有效性因子(默认 10,当从节点与主节点断连时间超过cluster-node-timeout * 10,则不参与选举);cluster-require-full-coverage yes:集群槽位全覆盖才提供服务(避免分区后部分槽位不可用导致数据不一致)。
-
高可用优势:
- 分布式架构:解决单主节点的性能和容量瓶颈(横向扩容主节点增加槽位);
- 内置高可用:无需独立哨兵,集群自身完成故障检测和转移;
- 容错性强:单个主节点故障,从节点自动接管,不影响整个集群服务。
-
面试考点:
- Redis Cluster 的故障检测和故障转移流程?
- 哈希槽的作用和分配方式?
- 集群脑裂的原因和解决方案?(前文已详解,核心是
min-replicas-to-write配置) - 集群扩容 / 缩容时,槽位迁移的过程?(在线迁移,不影响服务)
三、高可用关键保障机制(数据不丢失 + 服务稳定)
除了核心的主从复制、故障转移,Redis 还通过以下机制进一步保障高可用:
1. 持久化机制(数据不丢失兜底)
-
主从复制是「内存级冗余」,若主从节点同时故障,需依赖持久化恢复数据:
- RDB:定时生成数据快照(如
save 900 1),恢复速度快,但可能丢失快照后的部分数据; - AOF:记录所有写命令(append-only),支持「everysec」(每秒刷盘,最多丢失 1 秒数据)或「always」(每写一条刷盘,无数据丢失),恢复速度慢但一致性高;
- RDB:定时生成数据快照(如
-
高可用配置建议:RDB + AOF 混合持久化(Redis 4.0+ 支持),兼顾恢复速度和数据一致性。
2. 限流与熔断(避免服务雪崩)
-
主节点故障后,从节点升级为新主节点时,可能面临大量客户端重连和读请求冲击,需配置:
maxclients:限制最大连接数,避免连接耗尽;- 客户端限流:通过 Redis 自带的
limit-requests或业务层限流(如 Guava RateLimiter); - 熔断机制:当集群槽位不可用率超过阈值,暂时拒绝非核心请求,避免服务过载。
3. 监控与告警(提前发现问题)
-
关键监控指标:
- 主从同步延迟(
INFO replication中的master_repl_offset和slave_repl_offset差值); - 节点存活状态(
cluster nodes或sentinel nodes); - 槽位分配状态(
cluster info中的cluster_slots_assigned是否为 16384); - 持久化状态(AOF 刷盘是否正常、RDB 快照是否成功生成);
- 主从同步延迟(
-
告警触发:同步延迟超过阈值、节点下线、槽位未全覆盖、持久化失败等。
4. 网络冗余(减少分区风险)
- 集群节点部署在不同机架 / 可用区,避免单点网络故障(如交换机故障)导致集群分区;
- 配置
tcp-keepalive 300:启用 TCP 保活机制,检测无效连接,避免网络抖动导致的误判。
四、高可用机制总结(面试核心考点)
| 部署模式 | 故障检测 | 故障转移 | 核心优势 | 适用场景 |
|---|---|---|---|---|
| 主从架构 | 人工检测 | 手动切换 | 简单易部署 | 测试环境、低可用要求 |
| 哨兵架构 | 哨兵 PING + 主观 / 客观下线 | 哨兵自动选举 + 切换 | 自动故障转移、客户端透明 | 生产环境(读多写少、中小规模) |
| 集群架构 | Gossip 协议 + 半数主节点确认 | 从节点选举 + 槽位接管 | 分布式扩容、高容错 | 生产环境(大规模、高并发读写) |
面试高频总结:
- Redis 高可用的核心支柱是什么?(主从复制、故障检测、自动故障转移)
- 哨兵架构的故障转移流程?(主观下线 -> 客观下线 -> 选举领头哨兵 -> 筛选新主 -> 重新配置从节点)
- 集群架构的高可用和哨兵架构的区别?(集群支持分片、内置哨兵功能、无中心节点)
- 如何保证 Redis 数据不丢失?(主从复制 + RDB+AOF 持久化 + min-replicas-to-write 配置)
- 主从同步延迟的原因和优化方案?(原因:网络延迟、主节点写压力大、从节点读压力大;优化:增加从节点、优化网络、开启无盘复制、限制从节点读请求)