为什么需要 Cluster
Sentinel 解决的是“高可用切主”,而 Redis Cluster 解决的是“横向扩展 + 高可用”。当单机内存放不下、写入并发持续上涨时,Cluster 通过分片把数据拆到多台机器上。
1) 核心原理:16384 哈希槽
- 集群固定有 16384 个槽(0~16383)。
- Key 映射规则:
slot = CRC16(key) % 16384。
- 每个 Master 负责一部分槽,Key 会被路由到槽所属 Master。
例如 3 主节点时可近似分配:A(0~5460)、B(5461~10922)、C(10923~16383)。
2) 为什么是 16384(面试经典追问)
- 心跳包瘦身(最核心):Cluster 节点会持续交换 Ping/Pong 心跳,里面包含槽位信息(bitmap)。
- 16384 槽对应位图大小:
16384 / 8 = 2048B(约 2KB)。
- 若改为 65536 槽,位图变为 8KB,单包立刻增加约 6KB。(在计算机底层,最小的存储单位是 Bit(位),它只能存 0 或 1。
而我们常用的内存计量单位是 Byte(字节)。
1 Byte = 8 Bits)
- 在多节点高频心跳下,这个差值会被放大成显著网络与解析成本。
- 规模够用且灵活:Redis Cluster 的典型设计上限在百到千级节点,16384 槽已能提供足够细的迁移粒度。
- 为什么不是更小(如 1024):槽数太少会让分片粒度变粗,节点增多后更难均衡,迁移弹性也变差。
面试三句版:① 16384 槽位图只有 2KB,心跳包轻;② 对千级以内集群已足够灵活;③ 再增大槽数会放大网络与管理开销,性价比不高。
3) 扩容(新增节点)怎么做
- 把新节点加入集群(初始不持有槽)。
- 执行 reshard,从旧节点迁移一部分槽到新节点。
- 迁移期间 Key 逐步搬迁,业务不中断。
4) 缩容(下线节点)怎么做
- 先把目标节点的所有槽迁移到其他在线节点。
- 确认槽清空后,再将该节点安全移出集群。
5) 客户端重定向:MOVED vs ASK
| 返回 | 含义 | 客户端动作 |
MOVED | 槽已永久迁移到新节点 | 更新本地槽路由缓存,后续直接请求新节点 |
ASK | 槽正在迁移中的临时重定向 | 先对目标节点发 ASKING,本次请求转发过去 |
6) 故障发现与自动切换
- Cluster 内置故障检测与投票机制(不依赖 Sentinel)。
- Replica 是什么:Replica 就是某个 Master 的“从节点/副本节点”,持续复制该 Master 的数据,不负责主写流量,主要用于容灾与读扩展。
- 晋升含义:当 Master 故障时,集群会从它的 Replica 中选一个提升为新 Master,继续接管原 Master 的槽位与写请求。
- 若某主分片“主从都不可用”,在默认配置下集群可能进入
FAIL 状态保护一致性。
架构图: