Kafka扩容后如何将Partitions分区分配到新brokers节点上?kafka数据倾斜问题如何解决?

By LionKing

post-cover

Kafka扩容后如何将Partitions分区分配到新brokers节点上?kafka数据倾斜问题如何解决?

1.问题描述

对kafka扩容增加brokers节点后,在Kakfa Maneger中已经看到新增的brokers节点已加入kafka集群,但是新增的brokers里并没有看到有topic存在

2.原因

在扩容之前就已经存在的topic并不会自动地分配分区到新节点上,除非扩容后新建的topic。这种情况只能手动将topic分区重新分配到brokers节点上(包括新增的brokers节点),Kafka内部提供了相关的工具来重新分配topic的分区。

3.解决步骤
3.1增加Partitions(分区)

如果扩容后brokers节点数有5个,那么topic的Partitions数至少要等于节点数才能均匀分配在brokers上。若存在Partitions数少于brokers数的topic,就要对其增加Partitions。方法有两个:
■ 在kafka Maneger中选中topic,接着选择Add Partitions.

■ 在服务器上执行命令:./bin/kafka-topics.sh –zookeeper ip:host,ip:host,ip:host –alter –partitions 5 –topic XXX(topic)

这样分区之后,会有一定的概率发生数据倾斜现象,但是这里先不管,之后的步骤中会重新分配分区,数据倾斜问题将会解决。

3.2重新分配Partitions

Partitions增加好之后,就要将其重新均匀分配到各个brokers上(包括新增的brokers节点),Kafka提供重新分配分区的工具:kafka-reassign-partitions.sh,它有了3中工作模式:

■ generate模式,给定需要重新分配的topic,自动生成reassign plan(只是生成,并不执行)
■ execute模式,根据指定的reassign plan重新分配Partition
■ verify模式,验证重新分配Partition是否成功

3.2.1生成topics-to-move.json文件

在Kafka目录下生成topics-to-move.json文件,一定要是json格式,它指定哪些topic需要分区,可以同时指定多个topic:

{"topics": [{"topic": "topic1"},
            {"topic": "topic2"}],
"version":1
}
3.2.2生成reassign plan

topics-to-move.json文件建好之后,执行以下命令,生成分配计划,需要指定brokers-list:

./bin/kafka-reassign-partitions.sh –zookeeper ip:host,ip:host,ip:host –topics-to-move-json-file topics-to-move.json –broker-list “0,1,2,3,4” –generate

执行命令的结果中Proposed partition reassignment configuration下面生成的就是将分区重新分配到目前所有brokers上的结果。将这些内容保存到名为result.json文件里面(文件名不重要,只要保证内容是json格式即可),然后执行这些reassign plan:

3.2.3执行reassign plan

输入以下命令即可执行成功:
bin/kafka-reassign-partitions.sh –zookeeper ip:host,ip:host,ip:host –reassignment-json-file result.json –execute

3.2.4查看执行reassign plan结果

输入以下命令即可:
bin/kafka-reassign-partitions.sh –zookeeper ip:host,ip:host,ip:host –reassignment-json-file result.json –verify

注:如果需要执行多个重新分配分区计划,需要等本次完全分配好之后才能接着继续执行剩下的计划。

执行以上命令之后,topic的分区将会均匀分配到brokers节点上,之前的数据倾斜问题也会被解决。