kafka 重新分配partition和调整replica的数量

一、重新分配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 可以检查分区分配进度。
上一篇:[Vue学习]生命周期及其各阶段举例


下一篇:Firewalld防火墙-一、firewalld高级配置