一、重新分配partition
1、环境准备
kafka 版本:2.13-3.6.1
topic 名字: topic-A
partition 数量: 3
relica 数量:2
broker数量:2 ;broker.id分别是0,1
topic-B 详细信息展示:
Topic:topic-B Partition: 0 Leader: 0 Replicas: 0,1 Isr: 0,1
Topic:topic-B Partition: 1 Leader: 1 Replicas: 1,0 Isr: 1,0
Topic:topic-B Partition: 2 Leader: 0 Replicas: 0,1 Isr: 0,1
当需要提高系统的可扩展性,提升集群的速率和吞吐量的时候,需要增加机器的数量,当机器数量增加的时候,原本因节点不足导致partition的leader节点分布不均衡的缺陷可以得到解决,这个时候可以使用kafka-reassign-partitions.sh命令来对分区进行重新分配。
注意: Kafka 不会对已存在的分区进行均衡分配,所以需要我们手动通过kafka-reassign-partitions.sh命令执行分区分配操作。
2、具体实现
当前集群中有两个节点,id分别为0和1;现在再加一个 broker 节点,id 为 2;现在我们手动将已存在的topic-B的三个分区的leader节点均匀分布在三个节点上,以便实现尽可能的负载均衡,提高写入和消费速度。
- 声明要重新分配分区的 topic 列表
可以使用kafka-reassign-partitions.sh命令来对topic的分区进行重新分配,但前提是,我们需要先按照要求定义一个json文件,里面说明哪些 topic 需要分配分区。文件内容如下:
cat<<EOF > topic-B-generate.json
{
"topics": [
{
"topic": "topic-B"
}
],
"version": 1
}
EOF
- 通过 --topics-to-move-json-file 参数,生成重新分区分配策略 --generate
./bin/kafka-reassign-partitions.sh --bootstrap-server ip1:port1,ip2:port2,ip3:port3 --topics-to-move-json-file topic-B-generate.json --broker-list "0,1,2" --generate
其中–broker-list:值为要分配的 kafka broker id,以逗号分隔,该参数必不可少。脚本会根据你的 topic-generate.json 文件,获取 topic 列表,为这些 topic 生成分布在 broker list 上面的分区分配策略。输出结果中有你当前的分区分配策略,也有 Kafka 期望的分配策略,在期望的分区分配策略里,kafka 已经尽可能的为你分配均衡。
Current partition replica assignment 当前的分区分配策略,可以用于备份以及之后的恢复
Proposed partition reassignment configuration kafka生成的一个分配均衡的分配策略,可以用于后续重新分配的执行
一个分配策略示例如下
{"version":1,"partitions":[{"topic":"topic-B","partition":0,"replicas":[0,1] ,"log_dirs":["any","any"]},{"topic":"topic-B","partition":1,"replicas":[1,0] ,"log_dirs":["any","any"]},{"topic":"topic-B","partition":2,"replicas":[0,1] ,"log_dirs":["any","any"]}]}
- 通过 --reassignment-json-file 参数,执行分区分配策略 --execute
将上述输出的Proposed partition reassignment configuration中的策略复制到一个json文件中,并命名,然后执行
./bin/kafka-reassign-partitions.sh --bootstrap-server ip1:port1,ip2:port2,ip3:port3 --reassignment-json-file partition-replica-reassignment.json --execute
- 通过 --reassignment-json-file 参数,检查分区分配进度 --verify
./bin/kafka-reassign-partitions.sh --bootstrap-server ip1:port1,ip2:port2,ip3:port3 --reassignment-json-file partition-replica-reassignment.json --verify
二、调整replica的数量
一般情况下,分区的副本replica数量与节点数量一致,当集群中节点数量增加的时候,一般也需要调整replica的数量,一般是会增大分区副本数,调整方法如下:
{"version":1,"partitions":[{"topic":"topic-B","partition":0,"replicas":[0,1,2] ,"log_dirs":["any","any"]},{"topic":"topic-B","partition":1,"replicas":[1,0,2] ,"log_dirs":["any","any"]},{"topic":"topic-B","partition":2,"replicas":[2,1,0] ,"log_dirs":["any","any"]}]}
其中replicas中存放的是副本所要在的节点,可以通过 调整其数值和顺序来调整replica的数量和leader所在的节点(第一个就是leader所在节点),调整完成之后再进行执行。
注意: replicas中的值列表是broker id,log_dirs中的列表数量需要与replicas列表数量一致;
注意: 每个 partitiion 的所有 replicas 叫做 “assigned replicas” ,“assigned replicas” 中的第一个 replica 叫 “leader”,第二个叫"preferred replica",当 kafka leader replica 挂掉的话,partition 会选择 “preferred replica” 做为 leader replica 。
三、小结
- 1、–generate:配合着 --topics-to-move-json-file 可以生成分区分配策略,该参数适用于分区多的情况。
- 2、–execute:配合着 --reassignment-json-file 可以执行分区分配策略。
- 3、–verify:配合着 --reassignment-json-file 可以检查分区分配进度。