You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Kafka 2.7.x如何在JBOD磁盘间均衡Topic分区

Kafka JBOD磁盘分区分配不均原因及解决方案

一、分区分配不均的原因

  • Kafka默认的同Broker内分区磁盘分配逻辑仅在分区创建时对log.dir配置的所有磁盘目录执行轮询分配,运行过程中没有内置的自动均衡机制,你配置中开启的auto.leader.rebalance.enable=true仅负责跨Broker的Leader副本均衡,不涉及同Broker内磁盘的分区分布调整。
  • 历史操作导致分配偏差:
    1. 若你曾后续扩容新增磁盘,扩容前创建的所有分区都只会分布在旧磁盘上,新增磁盘仅会分配到扩容后新创建的分区,天然存在数量差
    2. 过往删除Topic/分区时,不同磁盘上被删除的分区数量不一致,轮询分配不会主动填补历史删除留下的分布差
    3. 若某块磁盘曾出现故障离线,离线期间创建的分区不会分配到该磁盘,磁盘恢复后也不会自动迁移存量分区补齐数量
  • 不同Topic的分区大小、写入流量不同,就算分区数量接近,也可能因为单分区数据量差异导致磁盘使用率不均,你当前场景首先是分区数量分布不均导致的使用率差。

二、实现JBOD磁盘间分区均衡的操作方案

2.1 临时修复存量分区不均

使用Kafka自带的工具手动执行同Broker内分区磁盘重分配,操作步骤如下:

  1. 先查询当前分区的磁盘分布,执行命令:
./kafka-log-dirs.sh --bootstrap-server <你的Broker访问地址> --describe --topic-list cars_costs.ml

该命令会输出指定Topic所有分区所在的磁盘目录,统计后确认需要迁移的分区列表。
2. 编写分区重分配计划JSON文件,示例格式如下:

{
  "partitions": [
    {
      "topic": "cars_costs.ml",
      "partition": 0,
      "replicas": [1],
      "log_dirs": ["/kafka/kafka_logs2"]
    }
  ],
  "version": 1
}

其中replicas填分区当前所在的Broker ID,log_dirs填要迁移到的目标磁盘目录,按你需要均衡的数量填写所有要迁移的分区配置。
3. 执行重分配任务(建议选择业务低峰期操作,避免影响生产流量):

./kafka-reassign-partitions.sh --zookeeper <你的ZK地址> --reassignment-json-file 重分配计划文件.json --execute
  1. 验证重分配进度和结果:
./kafka-reassign-partitions.sh --zookeeper <你的ZK地址> --reassignment-json-file 重分配计划文件.json --verify

2.2 长期优化方案

  • 后续新创建Topic前先确认所有JBOD磁盘均处于正常在线状态,保证新分区轮询分配时可以均匀分布到所有磁盘
  • 定期巡检各磁盘的分区数量、使用率,出现超过10%的偏差时及时做小范围重分配,避免偏差累积
  • 可将参数num.recovery.threads.per.data.dir调整为和磁盘数量一致(你当前是8块盘可以改成8),提升磁盘恢复、分区迁移的效率
  • 若后续升级到Kafka 3.2及以上版本,可开启内置自动磁盘均衡功能:配置log.disk.balancing.enable=true,配合调整log.disk.balancing.max.broker.percentage等相关阈值参数,实现自动均衡。

内容的提问来源于stack exchange,提问作者jessica

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 18:18:00