ERR Target node is not empty. All slots must be covered by other nodes 表示目标节点仍有未迁出的slot,del-node会失败;必须先用CLUSTER SLOTS确认返回空数组、CLUSTER NODES中节点状态为fail或消失,再执行del-node,之后手动shutdown进程并刷新客户端连接池。

ERR Target node is not empty. All slots must be covered by other nodes 是什么
这是 redis-cli --cluster del-node 执行时最常遇到的报错,说明目标节点还持有至少一个槽(slot),集群拒绝将其移除。Redis 集群的元数据强一致性机制决定了:只要 CLUSTER SLOTS 在该节点上返回非空结果,del-node 就会直接失败,不给任何商量余地。
reshard 迁移完成后,为什么旧节点可能 still show slots
迁移命令发出去 ≠ 迁移完成。常见卡点包括:
-
redis-cli --cluster reshard交互式流程里填了host:port而不是 40 位node id—— 导致目标节点状态卡在IMPORTING,源节点卡在MIGRATING,槽实际没归属变更 - 迁移过程中客户端持续写入,且未正确处理
ASK或MOVED重定向,造成部分 key 滞留在旧节点 - 执行完 reshard 后没等几秒就立刻查
CLUSTER SLOTS,而集群配置更新有传播延迟(通常 1–2 秒)
验证是否真清空:连上旧节点执行 CLUSTER SLOTS,必须返回 [];再连任意其他节点执行 CLUSTER NODES,确认旧节点状态为 fail? 或已彻底消失。
del-node 成功后,为什么旧节点进程还在跑
del-node 只是让集群“忘记”这个节点,它不关进程、不删数据、不清理磁盘。你必须手动操作:
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 登录旧节点机器,执行
redis-cli -p <port> shutdown</port>(或kill对应进程) - 如果用了 Docker,要
docker stop容器,不能只删节点元数据 - 客户端连接池需主动刷新:老连接仍可能指向已下线节点 IP,导致超时或写入丢失,必须 reload 或重启应用
跳过这步,等于留了个“幽灵节点”——表面下线了,实际还在响应请求,但数据无人接管。
残留 key 怎么清理,FLUSHALL 能不能直接用
即使 CLUSTER SLOTS 返回空,旧节点上仍可能有残留 key(比如迁移中断、客户端绕过重定向直连写入)。这时不能用同步阻塞的 FLUSHALL,尤其在生产环境:
- 用
FLUSHALL ASYNC或逐库FLUSHDB ASYNC,避免阻塞主线程 - 先连上旧节点执行
DBSIZE和KEYS *(仅开发/小数据量)确认残留量级 - 若节点已无业务流量,可加
CLIENT KILL TYPE normal清掉所有非 pub/sub 连接,再 flush
真正安全的缩容,不是“把槽迁走就结束”,而是“确认槽空、key空、进程停、客户端断”。少一步,都可能在半夜收到报警。

















