槽位是集群的分配单位
Redis Cluster 把整个键空间切成 16384 个槽,每个槽归属一个主节点,键通过 CRC16 计算后落在某个槽上。ADDSLOTS 与 DELSLOTS 用于手工调整槽的归属声明,CLUSTER SLOTS 则给客户端返回槽区间到节点的映射。日常建集群与扩容都应由 redis-cli 的集群子命令完成,手工改槽只用于修复特定场景。
基本信息
| 适用平台 | Redis 3.0+ 的 Cluster 模式 |
|---|---|
| 槽总数 | 16384,必须全部被指派才算健康 |
| 分配命令 | CLUSTER ADDSLOTS、CLUSTER ADDSLOTSRANGE(7.0+) |
| 查询命令 | CLUSTER SLOTS、CLUSTER SHARDS(7.0+) |
| 迁移方式 | redis-cli --cluster reshard 或手工 MIGRATE |
典型使用场景
- 排查客户端报 CROSSSLOT 或 MOVED 重定向异常
- 修复建集群时因中断导致的槽未完全分配
- 扩容前查看各节点承担的槽区间分布
- 确认某段槽的归属节点,辅助定位数据分布
- 从集群手动摘除节点前收回其持有的槽
手工操作与查询
手工操作与查询
CLUSTER ADDSLOTS 0 1 2 3 # 把 0-3 号槽指派给当前节点
CLUSTER ADDSLOTSRANGE 100 200 # 7.0+ 区间指派
CLUSTER DELSLOTS 3 # 取消槽 3 的归属声明
CLUSTER SLOTS # 客户端视角的槽到节点映射
CLUSTER SHARDS # 7.0+ 更易读的拓扑视图
CLUSTER INFO | grep -E 'cluster_state|slots_assigned|slots_ok'
redis-cli --cluster check 10.0.0.1:6379 # 一致性体检命令速查
| 命令 | 作用 | 注意 |
|---|---|---|
| ADDSLOTS | 指派槽给本节点 | 仅在该槽未被分配时成功 |
| ADDSLOTSRANGE | 按区间指派(7.0+) | 批量确认前先规划好区间 |
| DELSLOTS | 取消槽归属声明 | 数据不会自动迁移 |
| CLUSTER SLOTS | 返回槽区间到节点映射 | 客户端据此路由请求 |
| CLUSTER SHARDS | 返回更可读的拓扑信息 | 7.0+ 提供 |
| --cluster reshard | 迁移槽与数据 | 生产扩容的标准做法 |
ADDSLOTS 只是宣告归属,不会迁移数据:如果该槽上的键实际还在别的节点,会出现「槽有主但键找不到」的情况,必须通过 reshard 或 MIGRATE 完成数据搬运。
涉及多键的操作要求所有键落在同一个槽,否则报 CROSSSLOT:用 hash tag(如 user:{1001}:name 与 user:{1001}:age)把相关键强制放到同一个槽上,是常见的规避方式。
评估扩容是否值得做时,先看键分布是否均匀:槽数量固定且均匀分配,但如果存在热点键,加节点只是增加总容量,单个热键的压力不会分摊,需要先做键设计层面的打散。