2. Redis 高可用基础:主从复制原理、哨兵模式、集群模式概述
在构建异步导出任务数据源切换方案之前,必须深入理解 Redis 高可用的三大支柱:主从复制、哨兵模式和集群模式。这三种机制层层递进,分别解决了数据冗余、自动故障转移和水平扩展的问题。本章将逐一剖析其核心原理与适用场景。
2.1 主从复制原理
主从复制是 Redis 高可用的基石。它允许一个主节点(Master)的数据被自动同步到一个或多个从节点(Slave)。从节点默认只提供读服务,主节点负责处理写请求。
2.1.1 复制流程
- 连接建立:从节点向主节点发送
PSYNC命令,请求同步。 - 全量复制:主节点执行
BGSAVE生成 RDB 快照,同时将新写入的命令缓存到复制积压缓冲区。从节点加载 RDB 文件后,主节点将缓冲区中的增量命令发送给从节点。 - 增量复制:全量复制完成后,主节点持续将写命令推送给从节点,保持数据最终一致。
关键指标:复制偏移量(repl_offset)用于检测主从数据差异;复制积压缓冲区大小(repl-backlog-size)决定了增量复制能容忍的最大断连时间。
2.1.2 主从复制架构图
2.2 哨兵模式
哨兵模式在主从复制的基础上,增加了自动故障检测与故障转移能力。哨兵节点是一个独立进程,负责监控主从节点的健康状态,并在主节点宕机时自动选举新的主节点。
2.2.1 哨兵核心功能
| 功能 | 说明 | 关键参数 |
|---|---|---|
| 监控 | 哨兵定期向所有节点发送 PING 命令,检测是否可达 | down-after-milliseconds |
| 主观下线 | 单个哨兵发现节点无响应,标记为 S_DOWN | — |
| 客观下线 | 多个哨兵(quorum)都认为主节点不可达,标记为 O_DOWN | quorum |
| 领导者选举 | 哨兵集群通过 Raft 算法选举一个领导者执行故障转移 | — |
| 故障转移 | 从从节点中选举新主节点,更新客户端配置 | sentinel monitor |
2.2.2 哨兵模式故障转移流程
2.3 集群模式
Redis Cluster 提供了数据分片和自动故障转移能力。它将数据分散到 16384 个哈希槽(hash slot)中,每个节点负责一部分槽位。集群模式适用于大规模数据存储和高并发写入场景。
2.3.1 集群核心特性
- 无中心架构:所有节点通过 gossip 协议交换状态信息,没有中心代理。
- 自动分片:客户端计算 key 的 CRC16 值,对 16384 取模,定位到对应槽位所在的节点。
- 主从冗余:每个主节点可以有多个从节点,主节点故障时从节点自动提升。
- 在线重分片:支持动态添加或移除节点,数据自动迁移。
2.3.2 集群模式与哨兵模式对比
| 对比维度 | 哨兵模式 | 集群模式 |
|---|---|---|
| 数据分片 | 不支持,所有数据在一组主从中 | 支持,自动分片到 16384 个槽 |
| 扩展性 | 垂直扩展(提升单机性能) | 水平扩展(增加节点数) |
| 故障转移 | 哨兵组件独立完成 | 集群内部自动完成 |
| 客户端复杂度 | 低,只需连接哨兵获取主节点 | 高,需支持 MOVED/ASK 重定向 |
| 适用场景 | 中小规模,读写分离,高可用 | 大规模,高吞吐,自动分片 |
2.3.3 集群数据分片示意图
选型建议:对于异步导出任务的数据源切换场景,如果数据量在单机可承受范围内(< 10GB),推荐使用哨兵模式 + 读写分离,切换逻辑简单;如果数据量巨大且需要水平扩展,则选择集群模式,但客户端需处理 MOVED 重定向。
2.4 三种模式对比总结
| 特性 | 主从复制 | 哨兵模式 | 集群模式 |
|---|---|---|---|
| 自动故障转移 | ❌ 手动 | ✅ 自动 | ✅ 自动 |
| 数据分片 | ❌ | ❌ | ✅ |
| 写扩展性 | 单点 | 单点 | 多点 |
| 读扩展性 | 从节点 | 从节点 | 所有节点 |
| 配置复杂度 | 低 | 中 | 高 |
| 故障转移时间 | 手动,分钟级 | 10~30 秒 | 秒级 |
注意:在异步导出任务中,如果使用哨兵模式,故障转移后客户端需要重新获取新主节点地址。建议使用支持哨兵自动发现的客户端库(如 Jedis SentinelPool、Lettuce),避免硬编码连接地址。