Redis Cluster槽位倾斜必须用redis-cli --cluster reshard修复,其本质是“选目标、定数量、挑来源、确认执行”四步交互操作,每步填错均会导致卡住或失败,且迁移后需手动刷新客户端槽位映射以避免打到老节点。

Redis Cluster槽位倾斜不能靠配置修复,必须用 redis-cli --cluster reshard 手动重分配——它不是“一键均衡”,而是四步交互式操作,每步填错都会卡住或失败。
怎么用 redis-cli --cluster reshard 迁移指定数量槽位
命令本质是「选目标、定数量、挑来源、确认执行」四步交互,不是脚本化流程,无法跳过或自动应答:
- 运行
redis-cli --cluster reshard 192.168.1.101:7001后,第一问是迁移槽数量(如600),填0或超过16384会直接退出 - 第二问是接收节点 ID,必须从
redis-cli -p 7001 cluster nodes输出中复制完整 40 字符 ID(如2728a594a0498e98e4b83a537e19f9a0a3790f38),少一位、大小写错、带空格都会报No such node - 第三问是源节点,填
all表示从所有主节点等比例抽槽;填单个 ID 则只从该节点迁出;漏填或填错 ID 会导致卡在Source node 1:不动 - 最后提示 plan 时务必核对输出里的
source和destination是否符合预期,按yes就不可逆
为什么 reshard 后客户端还在打老节点
不是命令失败,是客户端没刷新 slot-node 映射:
- 现代客户端(如 Lettuce、Redisson)只在收到
MOVED响应时才永久更新路由表;ASK(迁移中)响应不会触发映射更新 - 已建立的旧连接不会自动刷新,需等待连接池自然轮换,或手动调用
client.reloadPartitions() - 用
redis-cli -c测试每次都是新连接,能立即生效;但业务代码复用连接时,可能持续打错节点 1–2 分钟 - 确认客户端启用了集群模式:Lettuce 必须用
RedisClusterClient,不是RedisClient
什么时候该用 rebalance 而不是 reshard
rebalance 是自动计算+迁移,适合整体偏斜但无明确目标的场景;reshard 是人工指定,适合精准补槽、扩容加节点、缩容清空某节点:
- 运行
redis-cli --cluster rebalance --cluster-threshold 2 192.168.1.101:7001表示只要节点间槽位差 > 2 个就启动均衡,默认只在主节点间搬,不碰从节点 - 新加入的空 master 节点永远分不到槽,除非显式加
--cluster-use-empty-masters - 若集群混布了不同机房/可用区节点,
rebalance不会跨区迁移,只能用reshard手动选源节点 ID
真正容易被忽略的是:迁移完成后,cluster info 中的 cluster_slots_ok 必须等于 16384,否则即使 cluster_state: ok,部分请求仍会返回 CLUSTERDOWN —— 这个数字不看,光看状态 ok 就上线,等于埋雷。


















