2. Redis 高可用基础:主从复制原理、哨兵模式、集群模式概述

在构建异步导出任务数据源切换方案之前,必须深入理解 Redis 高可用的三大支柱:主从复制、哨兵模式和集群模式。这三种机制层层递进,分别解决了数据冗余、自动故障转移和水平扩展的问题。本章将逐一剖析其核心原理与适用场景。

2.1 主从复制原理

主从复制是 Redis 高可用的基石。它允许一个主节点(Master)的数据被自动同步到一个或多个从节点(Slave)。从节点默认只提供读服务,主节点负责处理写请求。

2.1.1 复制流程

  1. 连接建立:从节点向主节点发送 PSYNC 命令,请求同步。
  2. 全量复制:主节点执行 BGSAVE 生成 RDB 快照,同时将新写入的命令缓存到复制积压缓冲区。从节点加载 RDB 文件后,主节点将缓冲区中的增量命令发送给从节点。
  3. 增量复制:全量复制完成后,主节点持续将写命令推送给从节点,保持数据最终一致。
关键指标:复制偏移量(repl_offset)用于检测主从数据差异;复制积压缓冲区大小(repl-backlog-size)决定了增量复制能容忍的最大断连时间。

2.1.2 主从复制架构图

Redis 主从复制架构 主节点 (Master) 读写请求 从节点 (Slave-1) 只读 从节点 (Slave-2) 只读 从节点 (Slave-3) 只读 主节点故障后,从节点仍可提供读服务,但写服务中断,需手动或通过哨兵进行故障转移

2.2 哨兵模式

哨兵模式在主从复制的基础上,增加了自动故障检测与故障转移能力。哨兵节点是一个独立进程,负责监控主从节点的健康状态,并在主节点宕机时自动选举新的主节点。

2.2.1 哨兵核心功能

功能 说明 关键参数
监控 哨兵定期向所有节点发送 PING 命令,检测是否可达 down-after-milliseconds
主观下线 单个哨兵发现节点无响应,标记为 S_DOWN —
客观下线 多个哨兵(quorum)都认为主节点不可达,标记为 O_DOWN quorum
领导者选举 哨兵集群通过 Raft 算法选举一个领导者执行故障转移 —
故障转移 从从节点中选举新主节点,更新客户端配置 sentinel monitor

2.2.2 哨兵模式故障转移流程

哨兵模式故障转移流程 主节点宕机 哨兵检测 O_DOWN 选举领导者 选举新主节点 切换客户端连接 恢复服务 故障转移期间(通常 10~30 秒),Redis 写服务不可用 异步导出任务应在此窗口期内暂停写入,或使用本地队列缓冲 哨兵通过 sentinel get-master-addr-by-name 提供新主节点地址

2.3 集群模式

Redis Cluster 提供了数据分片和自动故障转移能力。它将数据分散到 16384 个哈希槽(hash slot)中,每个节点负责一部分槽位。集群模式适用于大规模数据存储和高并发写入场景。

2.3.1 集群核心特性

  • 无中心架构:所有节点通过 gossip 协议交换状态信息,没有中心代理。
  • 自动分片:客户端计算 key 的 CRC16 值,对 16384 取模,定位到对应槽位所在的节点。
  • 主从冗余:每个主节点可以有多个从节点,主节点故障时从节点自动提升。
  • 在线重分片:支持动态添加或移除节点,数据自动迁移。

2.3.2 集群模式与哨兵模式对比

对比维度 哨兵模式 集群模式
数据分片 不支持,所有数据在一组主从中 支持,自动分片到 16384 个槽
扩展性 垂直扩展(提升单机性能) 水平扩展(增加节点数)
故障转移 哨兵组件独立完成 集群内部自动完成
客户端复杂度 低,只需连接哨兵获取主节点 高,需支持 MOVED/ASK 重定向
适用场景 中小规模,读写分离,高可用 大规模,高吞吐,自动分片

2.3.3 集群数据分片示意图

Redis Cluster 数据分片与槽位分布 节点 A (主) 槽位: 0~5500 从节点: A1 节点 B (主) 槽位: 5501~11000 从节点: B1 节点 C (主) 槽位: 11001~16383 从节点: C1 客户端请求 key CRC16(key) % 16384
选型建议:对于异步导出任务的数据源切换场景,如果数据量在单机可承受范围内(< 10GB),推荐使用哨兵模式 + 读写分离,切换逻辑简单;如果数据量巨大且需要水平扩展,则选择集群模式,但客户端需处理 MOVED 重定向。

2.4 三种模式对比总结

特性 主从复制 哨兵模式 集群模式
自动故障转移 ❌ 手动 ✅ 自动 ✅ 自动
数据分片 ❌ ❌ ✅
写扩展性 单点 单点 多点
读扩展性 从节点 从节点 所有节点
配置复杂度 低 中 高
故障转移时间 手动,分钟级 10~30 秒 秒级
注意:在异步导出任务中,如果使用哨兵模式,故障转移后客户端需要重新获取新主节点地址。建议使用支持哨兵自动发现的客户端库(如 Jedis SentinelPool、Lettuce),避免硬编码连接地址。