目录
Broker 端负载不均衡导致消息阻塞
硬盘使用率不均衡和 IOutil 不均衡场景
-
分区设计不合理:如果某些 Topic 的流量远大于其他 Topic,或者生产者在发送消息时指定了分区,而未指定的分区没有消息,这可能导致节点间或分区间的数据不均衡。
-
副本分配不均:每个分区有一个或多个副本分布在不同的 Broker 节点上。如果副本分配策略不当,可能导致某些节点或磁盘的负载过高。
-
磁盘性能差异:如果集群中使用的磁盘性能参差不齐,可能会导致性能较差的磁盘成为瓶颈,进而影响整体性能。
-
热点 Topic:某些特别热门的 Topic 可能会导致对应的磁盘负载不均衡。
-
Broker 扩容问题:Kafka 扩容了 Broker 节点后,如果新增的节点没有合理分配分区,也会导致节点间的数据不均衡。
-
Leader 副本切换:随着集群状态的变化,Leader 副本的切换或迁移可能导致个别 Broker 节点上的数据更多,进而导致节点间的数据不均衡。
-
客户端使用问题:客户端使用不当,如使用 key 进行 hash 分配可能导致生产倾斜,进而影响消费出现 lag。
数据迁移解决方案
-
评估迁移任务:在迁移之前,评估需要迁移的数据量和目标硬盘的容量,确保迁移后的数据分布均匀。
-
使用 Kafka 的迁移工具:使用
kafka-reassign-partitions.sh
工具进行数据迁移。注意,不同版本的 Kafka 工具有不同的特性,比如 2.6.0 版本支持并行提交迁移任务。 -
并行迁移与限流:在新版本中,可以利用并行迁移提高效率,但同时要设置合适的限流参数,以避免迁移过程中对正常业务造成影响。
-
选择合适的时间窗口:选择系统负载较低的时间段进行迁移,比如午夜之后,以减少对用户活跃时段的影响。
-
监控迁移进度:实时监控迁移进度和系统性能指标,确保迁移任务按计划进行,及时发现并解决迁移过程中的问题。
-
处理迁移中的资源竞争:迁移请求和实时消费数据的
poll()
操作共用 Fetcher 线程,因此要特别注意分区迁移可能对实时消费造成的影响。可能需要调整消费者的配置,比如增加消费者数量或调整max.poll.records
参数。 -
优化 Kafka 配置:根据迁移任务的需求,可能需要临时调整 Kafka 配置,比如调整
replica.alter.log.dirs.count
参数来控制副本的日志目录数量。 -
使用监控工具:使用 Kafka Manager、Burrow 或其他监控工具监控集群状态,确保迁移过程中集群的健康。
-
准备回滚计划:在迁移前准备好回滚计划,以便在迁移出现问题时能够快速恢复到迁移前的状态。
基于空闲硬盘优先的分区迁移示例
生成迁移计划:
-
准备描述文件
move-json-file.json
,示例如下:{ "topics": [ {"topic": "test-topic"} ], "version": 1 }
-
使用以下命令生成迁移计划,假设Kafka 集群的 Bootstrap Server 是
test-1:9092
,并且在 Broker 101, 102, 103 上重新分布分区:bin/kafka-reassign-partitions.sh --bootstrap-server test-1:9092 --topics-to-move-json-file move-json-file.json --broker-list "101,102,103" --generate
提交迁移计划:
-
将生成的迁移方案保存到
topics-to-move.json
文件中。 -
使用以下命令提交迁移计划,并设置合适的
--throttle
和--replica-alter-log-dirs-throttle
参数以控制迁移