redis集群增删节点时槽迁移需显式触发,核心是先调槽归属、再同步数据、最后更新视图:手动迁移含importing/migrating标记、getkeysinslot取键、migrate迁移、setslot确认;批量推荐redis-cli --cluster reshard;删节点前须先迁空槽位。

Redis 集群增删节点时,哈希槽迁移不是自动完成的,必须显式触发槽位重分配。核心在于:**先调整槽归属关系,再同步数据,最后更新集群视图**。手动操作虽可控性强,但步骤多、易出错,适合小规模调整或故障排查场景。
一、确认目标槽与节点信息
迁移前必须明确三件事:要迁哪些槽、从哪来、到哪去。
- 用
redis-cli -p <port> cluster nodes</port>查所有节点 ID 和当前槽分配情况 - 用
redis-cli -p <port> cluster keyslot <key></key></port>测试单个 key 所在槽位(如cluster keyslot "user:1001"返回866) - 用
redis-cli --cluster check <any-node></any-node>验证集群健康状态,避免在异常状态下操作
二、手动迁移单个槽的完整流程
适用于精确控制、调试或工具不可用时。以将槽 866 从节点 A(ID c272f85a)迁至节点 B(ID 80c34409)为例:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 在目标节点 B 上执行:
CLUSTER SETSLOT 866 IMPORTING c272f85a(标记“准备接收该槽”) - 在源节点 A 上执行:
CLUSTER SETSLOT 866 MIGRATING 80c34409(标记“正将该槽迁出”) - 在源节点 A 上获取该槽全部 key:
CLUSTER GETKEYSINSLOT 866 1000(一次最多取 1000 个,可循环调用) - 对每个 key 执行迁移:
MIGRATE <target-ip><target-port><key> 0 5000</key></target-port></target-ip>(0表示不带 dbid,5000是超时毫秒) - 迁移完成后,在源节点 A 和目标节点 B 上都执行:
CLUSTER SETSLOT 866 NODE 80c34409(最终确认归属)
三、批量迁移推荐用 redis-cli --cluster reshard
生产环境更建议用内置命令批量迁移,它会自动完成上述底层步骤,并处理键冲突和进度跟踪:
- 运行
redis-cli --cluster reshard <source-node></source-node>(如127.0.0.1:7000) - 按提示输入:要迁移的槽数量(如
5000)、目标节点 ID、源节点 ID(可填all或多个) - 命令会自动计算 key 分布、分批迁移、校验并更新槽映射表,全程无需人工干预 key 级操作
- 迁移中客户端访问仍可用——请求会被重定向(MOVED/ASK 响应),业务无感
四、删除节点前的清理要点
下线节点前,必须确保它不再负责任何槽,否则集群会报错:
- 先用
reshard把该节点所有槽全部迁出(可指定迁往多个其他主节点) - 确认
cluster nodes输出中该节点的 slots 字段为空(如0slots) - 再执行
redis-cli --cluster del-node <any-node><target-node-id></target-node-id></any-node> - 注意:仅删除节点记录,不自动清空其数据;若节点已停机,需手动清理其
nodes.conf和 RDB/AOF 文件










