2. Redis 集群架构基础:主从复制、哨兵模式、Redis Cluster 分片原理、节点通信机制

在深入故障恢复与缓存预加载之前,必须透彻理解 Redis 的三种集群架构。每种架构在数据一致性、可用性和扩展性上做出了不同的权衡,直接决定了故障场景下的行为与恢复策略。

2.1 主从复制(Replication)

主从复制是 Redis 高可用的基石。一个主节点(Master)可以拥有多个从节点(Slave),从节点实时同步主节点的数据,形成 一主多从 的星型拓扑。

核心流程

  1. 连接建立:从节点向主节点发送 PSYNC 命令,请求同步。
  2. 全量复制:主节点执行 BGSAVE 生成 RDB 快照,同时将新写入命令缓存到复制缓冲区(Replication Buffer)。从节点加载 RDB 文件后,再接收并执行缓冲区中的增量命令。
  3. 增量复制:全量复制完成后,主节点持续将写命令推送给从节点,保持最终一致。
关键指标:主从复制是异步的,主节点不等待从节点确认即返回客户端。这意味着主节点宕机时,未同步到从节点的数据会丢失,属于弱一致性模型。

主从复制架构图

主从复制架构 Master Slave 1 Slave 2 Slave N 异步复制:主节点不等待从节点确认,存在数据丢失窗口

2.2 哨兵模式(Sentinel)

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

哨兵核心职责

职责 说明
监控(Monitoring) 每秒向所有节点发送 PING,检测是否可达。
通知(Notification) 当节点异常时,通过 API 通知管理员或其他系统。
自动故障转移(Automatic Failover) 主节点不可达时,从从节点中选举一个提升为新的主节点,并更新配置。
配置提供(Configuration Provider) 客户端通过哨兵获取当前主节点地址,实现透明切换。

故障转移流程

  1. 主观下线:单个哨兵发现主节点超过 down-after-milliseconds 未响应。
  2. 客观下线:多个哨兵(通常为 quorum 数量)都认为主节点下线,触发故障转移。
  3. Leader 选举:哨兵集群通过 Raft 类算法选举一个 Leader 负责执行转移。
  4. 新主选举:Leader 从从节点中选出优先级最高、数据最完整的节点作为新主。
  5. 配置更新:所有哨兵和客户端更新主节点信息。
注意:哨兵模式解决了自动故障转移问题,但仍然是单点写入架构,写性能受限于单个主节点,且数据容量受限于单机内存。

2.3 Redis Cluster 分片原理

Redis Cluster 是官方提供的分布式解决方案,通过数据分片实现水平扩展。它将所有键空间划分为 16384 个哈希槽(Hash Slot),每个节点负责一部分槽位。

分片算法

// 计算键所属的哈希槽
slot = CRC16(key) % 16384

// 示例:键 "user:1001" 的 CRC16 值为 0xA1B2,取模后落入槽 12345
// 该槽由节点 A 负责,则读写请求路由到节点 A

槽位分配示例

节点 负责的哈希槽范围 槽位数量
Node A 0 – 5460 5461
Node B 5461 – 10922 5462
Node C 10923 – 16383 5461

Redis Cluster 分片架构图

Redis Cluster 分片架构 Client Node A 槽 0-5460 Node B 槽 5461-10922 Node C 槽 10923-16383 Slave A Slave B Slave C 每个主节点至少有一个从节点,保证分片高可用

2.4 节点通信机制

Redis Cluster 节点之间通过 Gossip 协议 进行通信,维护集群的元数据一致性。每个节点维护一个 集群状态表,包含所有节点的状态、槽位分配、主从关系等信息。

Gossip 消息类型

消息类型 用途 频率
MEET 将新节点加入集群 手动触发
PING 探测节点是否存活,交换状态信息 每秒随机选择 5 个节点发送
PONG 对 PING 的响应,携带本节点状态 收到 PING 时回复
FAIL 广播某个节点已下线 节点被标记为 FAIL 时
UPDATE 更新槽位分配或节点状态 槽位变更或状态不一致时

Gossip 通信流程

  1. 每个节点每秒随机选择 5 个 其他节点发送 PING 消息。
  2. PING 消息包含本节点已知的 部分 集群状态(通常 2-3 个其他节点的信息)。
  3. 接收节点回复 PONG,同样携带自己的状态信息。
  4. 节点通过不断交换信息,最终所有节点收敛到一致的集群视图。
设计意图:Gossip 协议避免了集中式元数据存储,每个节点都是对等的,没有单点瓶颈。但状态传播存在秒级延迟,在故障检测和槽位迁移时需要考虑这个窗口。

三种架构对比

特性 主从复制 哨兵模式 Redis Cluster
自动故障转移 ❌ 手动 ✅ 自动 ✅ 自动
数据分片 ❌ 无 ❌ 无 ✅ 16384 槽
写扩展性 单点写入 单点写入 多点写入
数据一致性 弱一致(异步) 弱一致(异步) 弱一致(异步)
节点通信 主从长连接 哨兵 ↔ 节点 Gossip 协议
适用场景 读写分离、数据备份 高可用、中小规模 大规模、水平扩展