rebalance 在做什么
redis-cli --cluster rebalance 是官方集群管理工具的子命令,它读取每个主节点的槽数量与权重,算出目标分布,再把超载节点上的槽迁移到欠载节点,使槽分布接近均衡。它内部通过 CLUSTER SETSLOT 与 MIGRATE 完成迁移,过程中集群仍可访问,只是被迁移的键在瞬间会返回 ASK 或 MOVED 重定向。默认是交互式确认,写进自动化脚本必须加 --cluster-yes。
基本信息
| 命令格式 | redis-cli --cluster rebalance <任一节点地址:端口> |
|---|---|
| 容量权重 | --cluster-weight <node-id=权重>,可重复多次 |
| 模拟模式 | --cluster-simulate 只计算迁移方案不执行 |
| 空主节点 | 默认跳过,加 --cluster-use-empty-masters 才参与分配 |
| 前提条件 | cluster_state 为 ok,各节点与集群总线端口互通 |
典型使用场景
- 扩容加入新主节点后,把槽迁给新节点让它分担流量
- 各主节点机器配置不同,用权重把更多槽分给规格更高的机器
- 前任运维手工调过槽导致分布倾斜,用均衡命令收敛回接近平均
- 变更前先跑模拟模式评估要迁移多少槽、预计耗时多久
- 缩容前先把待下线节点的槽匀给其余节点,再执行删节点
操作示例
操作示例
redis-cli --cluster check 10.0.0.11:7000 # 先看当前槽分布与节点数
redis-cli --cluster rebalance 10.0.0.11:7000 --cluster-simulate # 只算方案不落地
redis-cli --cluster rebalance 10.0.0.11:7000 --cluster-use-empty-masters # 空主节点共同分担
redis-cli --cluster rebalance 10.0.0.11:7000 --cluster-weight <id_a>=2 --cluster-weight <id_b>=1
redis-cli --cluster check 10.0.0.11:7000 # 迁移后复核均衡前后看什么
| 检查项 | 命令 | 正常表现 |
|---|---|---|
| 槽总数 | CLUSTER INFO | 16384 个槽全部有归属,无无主槽 |
| 各节点槽数 | --cluster check | 接近 16384 除以主节点数,偏差在可接受范围 |
| 迁移规模 | --cluster-simulate | 输出待迁移槽数与方向,先估窗口再执行 |
| 迁移时长 | 迁移日志 | 与键数量和带宽相关,大键会显著拉长单次迁移 |
权重是相对值而非百分比:两台机器给 2 和 1,最终槽数大致成二比一,实际结果还受迁移取整影响。
均衡期间客户端必须能处理 ASK 与 MOVED 重定向,否则被迁移的键会短暂报错;官方客户端默认支持,手写协议实现要注意。