Skip to content
困难

一句话答案

Redis Cluster 将数据分到 16384 个哈希槽,CRC16(key)%16384 定位节点,增减节点只迁移部分槽。

核心要点

故障检测过程:

1. PFAIL(Probable Fail,疑似下线):
   节点 A 向节点 B 发送 PING,超过 cluster-node-timeout 未收到 PONG
   → A 将 B 标记为 PFAIL(仅本地判断)

2. FAIL(确认下线):
   A 通过 Gossip 告诉其他节点"B 可能下线了"
   当集群中超过半数的主节点都将 B 标记为 PFAIL
   → B 被标记为 FAIL(广播给所有节点)
   → 触发故障转移

注意:只有主节点参与投票,从节点不参与
      类似 Sentinel 的 SDOWN → ODOWN 过程

从节点选举和故障转移:

当某主节点被标记为 FAIL 后:

1. 该主节点的从节点发起选举:
   ① 从节点增加自己的 currentEpoch(逻辑时钟)
   ② 向所有主节点广播 FAILOVER_AUTH_REQUEST(请求投票)

2. 主节点投票:
   每个主节点在一个 epoch 中只投一票(先到先得)
   投给复制偏移量最大的从节点(数据最完整)

3. 从节点获得超过半数主节点的投票 → 当选新主节点

4. 新主节点执行:
   ① 执行 SLAVEOF NO ONE(取消复制,成为主节点)
   ② 接管已故障主节点的所有 slot
   ③ 广播 PONG 消息,告知集群拓扑变更
   ④ 其他从节点(如果有多个)指向新主节点

整个集群不可用的条件:

任意主节点下线且没有可用的从节点 → 该节点负责的 slot 无法服务
默认:cluster-require-full-coverage = yes → 有 slot 不可用则整个集群拒绝写入
设为 no → 仅该部分 slot 不可用,其他 slot 正常服务
追问与易错

追问方向:

  • Cluster 怎么处理热点 Key?
  • MOVED 和 ASK 重定向区别?
  • 怎么扩容节点?

易错点:

  • ❌ Cluster 自动解决热点——需应用层处理
  • ❌ 混淆 MOVED 和 ASK

💡 记忆锚点

Cluster = 图书馆分区:16384个书架(slot)分给各管理员(节点),CRC16算书号决定放哪个架子;新来管理员就从别人手里接管几个书架(reshard),读者找错人会被指路(MOVED/ASK重定向)。