分区重分配是什么
分区重分配是把分区的副本搬到别的 broker 上,用来做集群扩容后的负载均衡、调整副本因子、或者在同一台机器的不同磁盘之间迁移数据。Kafka 不提供一条命令直接改副本位置,而是走「先生成方案、再执行、最后校验」三步,中间可以限速,避免搬迁流量把正常的读写挤掉。
基本信息
| 三步流程 | --generate 生成方案 → --execute 执行 → --verify 校验 |
|---|---|
| 输入文件 | topics-to-move.json 与 reassignment.json |
| 限速参数 | --throttle 字节/秒,如 50000000 表示约 50MB/s |
| 适用场景 | 扩容、下线节点、调整副本因子、磁盘间迁移 |
| 相关工具 | kafka-topics.sh 查看副本分布,kafka-configs.sh 清理限速配置 |
生成与执行
生成与执行
# 1) 准备待迁移主题清单(topics-to-move.json)
# {"topics": [{"topic": "orders"}], "version": 1}
# 2) 生成目标分配方案(输出含当前与建议两个 JSON)
kafka-reassign-partitions.sh --bootstrap-server localhost:9092 \
--topics-to-move-json-file topics-to-move.json \
--broker-list "1,2,3" --generate
# 3) 保存建议方案为 reassignment.json 后执行,并限制搬迁速率
kafka-reassign-partitions.sh --bootstrap-server localhost:9092 \
--reassignment-json-file reassignment.json \
--throttle 50000000 --execute
# 4) 持续校验直到所有分区显示完成
kafka-reassign-partitions.sh --bootstrap-server localhost:9092 \
--reassignment-json-file reassignment.json --verify典型使用场景
- 集群扩容:新 broker 加入后把部分分区搬过去,让负载重新均衡
- 节点下线:先把分区副本迁走再退役机器,避免副本缺失
- 提高副本因子:从 2 副本调整到 3 副本必须走重分配流程
- 磁盘迁移:在同一 broker 的多个 log.dirs 之间移动分区数据
- 故障恢复:某些 broker 长期不可用后重建副本并恢复均衡
常见结果判读
| 输出 | 含义 | 下一步 |
|---|---|---|
| Status: completed | 该分区迁移已完成 | 等待全部完成后取消限速 |
| Status: in progress | 仍在追赶副本 | 继续 verify,不要中断执行进程 |
| Reassignment failed | 目标副本创建失败 | 检查磁盘空间与 broker 状态 |
| 限速仍生效 | 搬迁完成后配置未清理 | 用 kafka-configs 删除限速项 |
| 副本分布依旧倾斜 | 方案未覆盖全部主题 | 重新生成并扩大迁移范围 |
迁移期间副本追平会占用网络与磁盘带宽,建议在业务低峰执行并设置限速。
--execute 启动的搬迁进程一旦中断,副本仍会继续追赶,但限速配置可能留在集群上;完成校验后记得清理 broker 级与主题级的限速项,否则会长期限制正常复制。