必须先完成slot迁移并清空key:连旧节点执行cluster slots确认返回空数组,再执行flushall async清理残留key,最后用node id而非host:port执行del-node,成功后手动shutdown进程并刷新客户端连接池。

del-node 命令报 ERR Target node is not empty 怎么办
这不是网络或权限问题,而是 Redis 集群在拒绝一个“还没清干净”的节点下线。它只检查一件事:目标节点是否还持有任何 Slot —— 只要 CLUSTER SLOTS 返回非空,del-node 就会失败。
- 别信“reshard 命令跑完就完了”。
redis-cli --cluster reshard只是发起迁移,真正完成需等所有 key 同步完毕、状态切换完成、客户端重定向生效 - 验证必须分两步:
连旧节点执行CLUSTER SLOTS,返回必须是[];
连任意新节点执行CLUSTER NODES,确认旧节点状态为fail?或已彻底消失 - 即使 Slot 已迁出,旧节点仍可能残留 key(比如迁移中断时客户端直写、ASK 重定向未触发),务必执行
FLUSHALL ASYNC,而非阻塞式FLUSHALL
用 CLUSTER FAILOVER 替换主节点时为什么卡住
常见现象是命令无响应、日志卡在 “waiting for master to respond”,本质是 CLUSTER FAILOVER 对主节点健康状态有强依赖,不是所有从节点都能随时切换。
Redis 8.2.3 是一款安全优先的高性能键值存储系统。该版本紧急修复了可能引发远程代码执行(RCE)的高危漏洞(CVE-2025-62507),并解决了 HyperLogLog 及 Cuckoo Filter 等数据结构在特定场景下的崩溃问题。建议所有用户立即升级,以保障生产环境的系统稳定与数据安全。
- 必须先确认目标从节点的
master_id是否在线:查CLUSTER NODES输出中该行 flags 是否含fail,并尝试ping主节点端口 - 三种调用方式不能混用:
CLUSTER FAILOVER(默认)要求主节点可通信且复制偏移差 ≤200 MB;CLUSTER FAILOVER FORCE跳过健康检查但仍需主节点能回 PING;CLUSTER FAILOVER TAKEOVER完全绕过主节点,仅用于主永久失效且你已确认无数据丢失风险 - 切完后必须立刻在**所有其他节点**上执行
CLUSTER FORGET <old-node-id></old-node-id>,否则元数据残留会导致后续del-node失败或集群状态异常
reshard 迁移时 --to 参数填 IP:PORT 还是 node ID
必须填 40 位 node ID,填 127.0.0.1:7001 或域名会导致 Slot “悬空”——旧节点仍显示该 Slot,新节点查不到归属,del-node 死活过不去。
- 查 node ID:连任意节点执行
CLUSTER NODES,找 role=master 的目标行,开头那串字符就是 ID(如64c297cb3b66647d4da05b63aa05a90506121) - 推荐用非交互式迁移,避免手误:
redis-cli --cluster reshard 127.0.0.1:7000 --cluster-from <old-id> --cluster-to <new-id> --cluster-slots 100 --cluster-yes</new-id></old-id>
注意--cluster-slots是本次迁移的 Slot 数量,不是编号范围 - 如果需精确控制哪些 Slot(比如只迁 1000–1099),得放弃
reshard,改用CLUSTER SETSLOT <slot> MIGRATING <target-node-id></target-node-id></slot>+CLUSTER GETKEYSINSLOT+MIGRATE手动搬
下线后旧节点进程和客户端连接怎么处理
del-node 不等于停服务,它只是集群元数据层面“驱逐”,旧节点进程还在跑,客户端连接池也还连着它,这是生产事故高发点。
-
del-node成功后,必须手动执行redis-cli -h <old-ip> -p <old-port> shutdown</old-port></old-ip>关闭进程,否则它会持续广播错误 pong 消息,干扰集群心跳 - 客户端连接池不会自动感知节点下线,必须刷新:Spring Data Redis 需调用
RedisClusterConfiguration.setRefreshPeriod()或重启应用;原生客户端需重建连接池并 reloadCLUSTER NODES结果 - 别跳过
CLUSTER FORGET:哪怕用了del-node,其他节点配置里仍存着旧节点 ID,不清理会导致CLUSTER NODES输出冗余、故障检测逻辑错乱,甚至影响后续 add-node
CLUSTER SLOTS 和 FLUSHALL ASYNC 两个动作上,缺一不可。










