首页/数据/数据工程与 ETL 速查/分区重分配(扩容/迁移/调整副本)
Kafka64 条

分区重分配(扩容/迁移/调整副本)

reassign 工具用于把分区副本搬到新 Broker、调整副本因子、在磁盘间迁移:先生成分配方案,再执行并持续 verify,可限速减少对业务影响。

分区重分配是什么

分区重分配是把分区的副本搬到别的 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 级与主题级的限速项,否则会长期限制正常复制。

易错点

  • 调整副本因子必须走重分配流程,直接改 replicas 配置不会生效
  • 执行后忘记 verify 或未及时取消 throttle,限速可能长期残留
  • 一次迁移全部主题,网络与磁盘被搬迁流量打满,业务读写明显变慢
  • 目标 broker 磁盘空间不足,副本创建失败后分布变得更不均衡
  • 扩容后直接重分配而不先观察数据量分布,容易把分区搬到同样繁忙的节点

数据来源与参考

  • Apache Kafka 官方文档:Expanding Clusters 与 kafka-reassign-partitions.sh
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌