首页/数据/Redis 进阶速查/CLUSTER SETSLOT 与槽迁移状态机

CLUSTER SETSLOT 与槽迁移状态机

槽迁移通过三种 SETSLOT 状态推进:目标节点 IMPORTING、源节点 MIGRATING,迁完向所有节点广播 NODE 指定归属,最终槽正式易主。

Redis 进阶速查数据更新于 2026-10-13

槽迁移的状态机

槽的所有权变更通过 CLUSTER SETSLOT 的状态推进完成。标准流程是:目标节点先把该槽置为 IMPORTING 并指明来源节点,源节点把该槽置为 MIGRATING 并指明目标节点,随后逐键用 MIGRATE 搬运;键搬完后,向集群内所有节点广播该槽的新归属,让路由收敛到目标节点。理解这三个状态,才能看懂 reshard 工具到底做了什么,也才能在槽卡住时知道该往哪一步推进。

基本信息

导入状态CLUSTER SETSLOT <slot> IMPORTING <源节点id>,在目标节点执行
迁出状态CLUSTER SETSLOT <slot> MIGRATING <目标节点id>,在源节点执行
完成归属CLUSTER SETSLOT <slot> NODE <目标节点id>,向各节点广播
清除状态CLUSTER SETSLOT <slot> STABLE
查看残留键CLUSTER GETKEYSINSLOT <slot> <count>

典型使用场景

  • 自动化工具不可用时,手工处理个别槽的迁移
  • 排障:槽卡在中间态时判断需要补做哪一步
  • 阅读 reshard 工具输出时理解其背后动作
  • 大 key 单独处理:先迁空槽,再针对大 key 单独搬运
  • 迁移中断后的收尾:按流程补完或回退到稳定状态

完整流程示意

完整流程示意
# 目标节点:声明该槽正在被导入
redis-cli -p 7001 CLUSTER SETSLOT 1234 IMPORTING <源节点id>
# 源节点:声明该槽正在迁出
redis-cli -p 7000 CLUSTER SETSLOT 1234 MIGRATING <目标节点id>
redis-cli -p 7000 CLUSTER GETKEYSINSLOT 1234 100   # 查看该槽剩余的键
redis-cli -p 7000 MIGRATE 10.0.0.12 7001 user:1001 0 5000  # 逐键搬运
# 全部搬完后在各节点广播新的属主
redis-cli -p 7000 CLUSTER SETSLOT 1234 NODE <目标节点id>
redis-cli -p 7000 CLUSTER SETSLOT 1234 STABLE      # 放弃迁移时清除中间状态

状态与期间表现

状态设置方访问表现
MIGRATING源节点键已迁走的请求返回 ASK,引导客户端去目标节点取
IMPORTING目标节点只接受带 ASKING 的命令,否则返回 MOVED
NODE集群内各节点归属正式更新,客户端路由随之收敛
STABLE源或目标节点清除中间态,回到普通状态
redis-cli --cluster reshard 已经把整套流程自动化,手工操作建议只用于排障与个别槽修正。手工操作最容易漏掉「向所有相关节点广播归属」和「清理中间态」这两步,遗漏后集群会长期处于拓扑不一致的状态。

易错点

  • 只在一个节点上广播新的归属,其他节点仍认为槽属于旧主,客户端会持续收到来回跳转的重定向
  • 迁移未完成就中断且不清理状态,槽长期停留在 MIGRATING 或 IMPORTING,访问该槽的请求持续异常
  • 搬运大 key 时 MIGRATE 是同步阻塞操作,超时设得过短会中断搬运并留下半迁移状态
  • 跳过 IMPORTING 与 MIGRATING 直接改归属,迁移窗口内该槽谁都不接收,请求大面积失败

数据来源与参考

  • Redis 官方文档:CLUSTER SETSLOT 与迁移流程说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌