外观
一句话答案
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重定向)。