信息发布→ 登录 注册 退出

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

发布时间:2026-01-11

点击量:
目录
  • 一、重新分配partition
    • 1、环境准备
    • 2、具体实现
  • 二、调整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 可以检查分区分配进度。

       到此这篇关于kafka 重新分配partition和调整replica的数量实现的文章就介绍到这了,更多相关kafka 重新分配partition和replica内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

      在线客服
      服务热线

      服务热线

      4008888355

      微信咨询
      二维码
      返回顶部
      ×二维码

      截屏,微信识别二维码

      打开微信

      微信号已复制,请打开微信添加咨询详情!