Apache Kafka 2.7.x如何在JBOD磁盘间均衡Topic分区
Kafka JBOD磁盘分区分配不均原因及解决方案
一、分区分配不均的原因
- Kafka默认的同Broker内分区磁盘分配逻辑仅在分区创建时对
log.dir配置的所有磁盘目录执行轮询分配,运行过程中没有内置的自动均衡机制,你配置中开启的auto.leader.rebalance.enable=true仅负责跨Broker的Leader副本均衡,不涉及同Broker内磁盘的分区分布调整。 - 历史操作导致分配偏差:
- 若你曾后续扩容新增磁盘,扩容前创建的所有分区都只会分布在旧磁盘上,新增磁盘仅会分配到扩容后新创建的分区,天然存在数量差
- 过往删除Topic/分区时,不同磁盘上被删除的分区数量不一致,轮询分配不会主动填补历史删除留下的分布差
- 若某块磁盘曾出现故障离线,离线期间创建的分区不会分配到该磁盘,磁盘恢复后也不会自动迁移存量分区补齐数量
- 不同Topic的分区大小、写入流量不同,就算分区数量接近,也可能因为单分区数据量差异导致磁盘使用率不均,你当前场景首先是分区数量分布不均导致的使用率差。
二、实现JBOD磁盘间分区均衡的操作方案
2.1 临时修复存量分区不均
使用Kafka自带的工具手动执行同Broker内分区磁盘重分配,操作步骤如下:
- 先查询当前分区的磁盘分布,执行命令:
./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
- 验证重分配进度和结果:
./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
相关产品推荐
相关产品推荐

