reshard 命令必须指定 --from 和 --to,否则进入交互模式导致脚本挂起;--from 填源节点 id(逗号分隔),--to 填唯一目标节点 id,不可用 --from all。

reshard 命令到底要不要指定 --from 和 --to
必须指定,否则 redis-cli --cluster reshard 会卡在交互式提示里等你手动输入,生产环境根本没法自动化。不加 --from 和 --to,它默认进入交互模式,而你脚本里没接 stdin,进程就挂住了。
实操建议:
-
--from填的是**源节点的 node ID**(不是 IP:port),多个用逗号隔开,比如--from abc123,def456 -
--to填的是**目标新节点的 node ID**,只能填一个(reshard 一次只迁到一个节点) - 别用
--from all—— 它真会从所有主节点匀出 slots,但无法控制迁移比例,容易导致某些节点负载突增 - 迁移前先用
redis-cli --cluster check <any-node></any-node>确认集群状态正常,尤其看有没有 fail 状态节点
迁移 slot 数量怎么算才不丢数据
Redis 集群共 16384 个 slot,每个主节点负责一段连续或离散的 slot 区间。扩容时,你不是“加节点”,而是把老节点上的一部分 slot 拆出来,assign 给新节点 —— 所以核心是:**slot 迁移必须完整、原子、无重叠**。
常见错误现象:客户端报 MOVED 或 ASK 错误频发,甚至写入丢失,往往是因为 slot 迁移过程中,客户端缓存了旧拓扑,又没正确处理重定向。
实操建议:
- 用
redis-cli --cluster info <node></node>查当前各节点 slot 分布,确认目标新节点 slot 数为 0(刚加入时应如此) - 计算迁移量:比如原 3 主变 4 主,理想是均分 16384 ÷ 4 = 4096,那就从每个老主节点匀出约 1024 个 slot 给新节点
- 不要一次性迁移太多 slot(比如 >2000),否则迁移过程长、阻塞时间久;建议单次 ≤1000,分批执行
- 迁移期间,客户端 SDK 必须支持自动重定向(如 Jedis 3.0+、redis-py 4.0+),且禁用拓扑缓存(如 Jedis 的
setRefreshPeriod(0))
新节点加进去后为什么一直显示 no-slot
新节点加入集群后只是“成员”,但默认不分配任何 slot,所以 CLUSTER NODES 里它的状态是 master 但 slot 范围为空,redis-cli --cluster info 也显示 0 slots。这不是故障,是设计使然 —— Redis 要求 slot 分配必须显式触发。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
关键点:只有执行 reshard 或直接用 CLUSTER ADDSLOTS 才会让它真正承载数据。
实操建议:
- 确认新节点已用
redis-cli --cluster add-node <port><existing-node></existing-node></port>成功加入 - 检查新节点日志,是否有
Node is not configured as a cluster node—— 说明cluster-enabled yes没配或没重载 - 如果想跳过 reshard、直接手工分配,可用
redis-cli -c -h <new-node> CLUSTER ADDSLOTS {0..4095}</new-node>,但注意:该命令需确保这些 slot 当前未被其他节点占用,否则报错ERR Slot <n> is already busy</n> - 执行完 reshard 后,立刻跑
redis-cli --cluster check,确认 slot 总数仍是 16384,且无 overlap 或 missing
reshard 过程中连接超时或迁移中断怎么办
迁移大 slot 区间(尤其含大量 bigkey)时,TCP 连接可能因 timeout 中断,redis-cli --cluster reshard 本身**不支持断点续传**。中断后不会自动回滚,部分 slot 可能处于 “migrating” 或 “importing” 状态,集群健康度受损。
这是最易被忽略的危险点:很多人以为中断=没发生,其实 slot 状态已经半变更。
实操建议:
- 迁移前调大 client-output-buffer-limit 和 timeout:在所有参与节点的 redis.conf 加
timeout 0(禁用空闲超时)、client-output-buffer-limit normal 0 0 0 - 用
redis-cli -c -h <node> CLUSTER NODES</node>检查是否有节点状态含migrating-或importing-前缀,有则说明迁移卡住 - 若中断,先对异常节点执行
CLUSTER SETSLOT <slot> STABLE</slot>清理残留状态,再重新规划迁移 - 生产环境强烈建议在低峰期操作,并监控
keyspace_hits/keyspace_misses和rejected_connections,避免迁移压垮连接池










