3. Redis Cluster 故障转移:集群分片、主从切换、Gossip 协议

在模板引擎缓存场景中,Redis Cluster 提供了无中心化的分布式缓存能力。当集群中某个主节点宕机时,其对应的从节点会自动提升为新的主节点,整个过程对业务层透明。本章深入剖析集群分片、主从切换机制以及 Gossip 协议的核心原理。

3.1 集群分片:16384 个槽位

Redis Cluster 采用虚拟哈希槽(Hash Slot)进行数据分片,整个集群固定划分为 16384 个槽位。每个键通过 CRC16 算法计算后对 16384 取模,决定其归属槽位。槽位均匀分布在集群中的各个主节点上。

概念 说明 模板引擎缓存场景示例
哈希槽总数 16384(固定值) 所有模板缓存键均匀映射到槽位
槽位分配 每个主节点负责一段连续的槽位区间 3 主节点集群:0-5460、5461-10922、10923-16383
键定位 CRC16(key) % 16384 template:home:header 定位到槽位 1024
槽位迁移 动态调整节点负责的槽位范围 扩容时平滑迁移缓存数据
关键设计:16384 个槽位在集群内部通过 CLUSTER ADDSLOTS 命令分配给各主节点。客户端通过 CLUSTER NODES 或 CLUSTER SLOTS 获取槽位分布映射表,实现请求直连目标节点。
Redis Cluster 槽位分片与数据定位 主节点 A 槽位 0-5460 5461 个槽位 主节点 B 槽位 5461-10922 5462 个槽位 主节点 C 槽位 10923-16383 5461 个槽位 客户端请求 CRC16(key) % 16384 计算目标槽位:1024 槽位 1024 属于主节点 A

3.2 主从切换:故障检测与自动提升

当主节点发生故障(如宕机、网络分区)时,集群中的从节点会自动发起选举,成为新的主节点。整个过程分为故障检测和故障转移两个阶段。

3.2.1 故障检测流程

  1. PING/PONG 超时:集群中每个节点定期向其他节点发送 PING 消息,若在 cluster-node-timeout 内未收到 PONG,则标记该节点为 PFAIL(疑似下线)。
  2. Gossip 传播:节点通过 Gossip 消息将 PFAIL 状态传播给集群中的其他节点。
  3. 故障确认:当超过半数的主节点(含发起节点)都认为某节点为 PFAIL 时,该节点被标记为 FAIL(正式下线)。
模板引擎缓存影响:故障检测期间(默认 15 秒),客户端可能收到 MOVED 或 ASK 重定向。建议在客户端侧实现自动重试和槽位缓存刷新,避免缓存穿透。

3.2.2 从节点选举与提升

当主节点被标记为 FAIL 后,其从节点发起选举,竞选新的主节点:

步骤 操作 说明
1 从节点发起选举 从节点自增 currentEpoch,向集群广播 FAILOVER_AUTH_REQUEST
2 主节点投票 每个主节点在每个 epoch 内只能投一票,投票给数据最新的从节点
3 获得多数票 从节点获得超过半数主节点的投票(N/2 + 1)
4 角色切换 从节点执行 SLAVEOF NO ONE,成为新主节点,接管所有槽位
5 广播更新 新主节点通过 Gossip 广播自身状态,集群更新拓扑
主从切换流程:故障检测 → 选举 → 提升 阶段 1:故障检测 主节点 A 宕机 从节点 A1 检测 PONG 超时 标记主节点 A 为 PFAIL Gossip 传播 PFAIL 状态 阶段 2:从节点选举 从节点 A1 发起选举请求 主节点 B、C 投票 获得 N/2+1 票 选举成功 阶段 3:提升 SLAVEOF NO ONE 接管槽位 0-5460 广播新拓扑 集群恢复 关键指标:cluster-node-timeout 默认 15000ms 从节点数据延迟越小,选举优先级越高 时序示意 0ms 15000ms ~15500ms ~16000ms ~16500ms 主节点宕机 PFAIL 检测 选举投票 新主节点上线

3.3 Gossip 协议:集群状态传播

Gossip 协议是 Redis Cluster 无中心化通信的基石。每个节点定期与其他节点交换状态信息,实现最终一致性的集群视图。

3.3.1 消息类型

消息类型 方向 内容 触发条件
PING 节点 → 节点 自身状态 + 随机其他节点状态 每 1 秒随机选择一个节点发送
PONG 节点 → 节点 回复 PING,携带自身完整状态 收到 PING 后立即回复
MEET 节点 → 节点 邀请新节点加入集群 新节点加入时发送
FAIL 节点 → 节点 广播某节点已下线 故障确认后广播
PUBLISH 节点 → 节点 广播消息到集群 客户端 PUBLISH 命令触发

3.3.2 传播机制

  • 周期性推送:每个节点每秒向随机一个节点发送 PING,携带自身 epoch、槽位信息、节点状态。
  • 反熵修复:当节点发现对方状态落后时,主动推送缺失信息,保证集群状态收敛。
  • 故障传播:PFAIL/FAIL 状态通过 Gossip 在几秒内扩散到整个集群,触发从节点选举。
模板引擎缓存注意事项:Gossip 协议是最终一致性模型,故障传播存在延迟(通常 3-5 秒)。在故障转移期间,客户端可能短暂访问到已下线的节点。建议在客户端侧实现 MOVE 重定向缓存 和 连接池快速失效 机制。

3.4 模板引擎缓存容错配置建议

生产环境推荐配置:
# 集群节点配置
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000      # 故障检测超时
cluster-slave-validity-factor 10 # 从节点数据有效性因子
cluster-migration-barrier 1     # 主节点至少保留的从节点数
cluster-require-full-coverage no # 部分槽位不可用时仍提供服务

# 客户端侧配置
# 启用集群模式,自动处理 MOVED/ASK 重定向
# 设置连接池最大等待时间 < cluster-node-timeout
# 开启自动刷新槽位缓存(如 JedisCluster 的 maxAttempts)

通过合理配置集群参数和客户端容错策略,模板引擎缓存可以在节点故障时实现秒级自动恢复,保障业务层缓存命中率和响应速度。