首页/数据/数据库速查/Cluster 分片模型(16384 槽与主从组)
Redis 运维与场景124 条

Cluster 分片模型(16384 槽与主从组)

集群把键空间切成 16384 个槽分配给各主节点:key -> CRC16(key) mod 16384 -> 槽 -> 节点;每个主节点带若干从节点做故障转移,最少 3 主。

数据库速查数据更新于 2026-10-13

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 让多键同槽虽然能跑通事务与批量操作,但把大量键强行绑到同一槽会造成数据倾斜和单节点热点,只应在确有多键原子需求的业务对象上使用。

易错点

  • 线上用只有 3 个节点还要求高可用:主节点不够凑多数派,故障时无法切换
  • 多键命令跨越不同槽,客户端直接报 CROSSSLOT 错误
  • 在集群模式下使用 SELECT 或多库脚本,命令不被支持
  • 扩容搬槽期间未核对键数量,迁移后出现丢键或少键
  • 客户端未开启槽缓存刷新,拓扑变更后仍向旧节点发请求导致大量重定向

数据来源与参考

  • Redis 官方文档: Cluster 教程
  • Redis 官方文档: CLUSTER KEYSLOT

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌