Cluster 是什么
Cluster 是 Redis 的官方分片方案:整个键空间被切成 16384 个槽,按 CRC16(key) mod 16384 算出槽号,再把槽分配给各主节点,客户端据此直接把命令发给对应节点。每个主节点还可以带若干从节点,主节点故障时由从节点接替。至少需要 3 个主节点,才能在故障时凑齐多数派完成转移。
基本信息
| 槽总数 | 16384 个,按主节点数量分配 |
|---|---|
| 最少规模 | 3 个主节点才能形成多数派 |
| 推荐规模 | 3 主 3 从,主从分布在不同机器 |
| 库数量 | 只有 DB 0,SELECT、SWAPDB、MOVE 不可用 |
| 多键限制 | 同一命令涉及的键必须落在同一槽 |
典型使用场景
- 单机内存不足的横向扩容:把数据分散到多台机器
- 热点隔离:把高流量业务单独部署一套集群,避免互相影响
- 在线扩容缩容:搬槽迁移过程中业务可继续读写
- 客户端路由核对:确认键落在哪个节点,排查路由错乱
- 大 key 治理:按槽盘点键数量与大小,定位倾斜节点
- 高可用:主从副本加自动故障转移,降低单点风险
槽与集群状态
槽与集群状态
CLUSTER KEYSLOT user:1001 # 返回 0-16383 的槽号
CLUSTER COUNTKEYSINSLOT 1234 # 该槽上的键数量
CLUSTER GETKEYSINSLOT 1234 10 # 列出该槽上的键,用于迁移核对
CLUSTER INFO # cluster_state 应为 ok
CLUSTER NODES # 各节点负责的槽区间与主从关系
# hash tag:同一业务对象的多键强制同槽
CLUSTER KEYSLOT user:{1001}:name # 与 user:{1001}:age 同槽关键字段读法
| 字段 | 含义 | 异常表现 |
|---|---|---|
| cluster_state | 集群整体可用状态 | 非 ok 说明有槽未分配,读写可能被拒 |
| cluster_slots_assigned | 已分配的槽数 | 小于 16384 说明存在未分配槽 |
| cluster_known_nodes | 集群已知节点数 | 与预期不符说明节点未全部加入 |
| cluster_size | 参与投票的主节点数 | 小于 3 时无法完成故障转移 |
槽是数据分区的单位:扩容与缩容本质都是搬槽;集群模式下只有 DB 0,SELECT、SWAPDB、MOVE 这些命令不可用。
用 hash tag 让多键同槽虽然能跑通事务与批量操作,但把大量键强行绑到同一槽会造成数据倾斜和单节点热点,只应在确有多键原子需求的业务对象上使用。