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

 更新时间:2024年10月11日 11:41:22   作者:husterlichf  
当需要提升Kafka集群的性能和负载均衡时,可通过kafka-reassign-partitions.sh命令手动重新分配Partition,增加节点后,可以将Topic的Partition的Leader节点均匀分布,以提高写入和消费速度,感兴趣的可以了解一下

一、重新分配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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot框架集成token实现登录校验功能

    SpringBoot框架集成token实现登录校验功能

    这篇文章主要为大家详细介绍了SpringBoot框架集成token实现登录校验功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • 详谈Jedis连接池的使用

    详谈Jedis连接池的使用

    下面小编就为大家带来一篇详谈Jedis连接池的使用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • springboot全局异常处理代码实例

    springboot全局异常处理代码实例

    这篇文章主要介绍了springboot全局异常处理代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • druid的borrow行为方法源码解析

    druid的borrow行为方法源码解析

    这篇文章主要为大家介绍了druid的borrow行为方法源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 详解JAVA使用Comparator接口实现自定义排序

    详解JAVA使用Comparator接口实现自定义排序

    这篇文章主要介绍了JAVA使用Comparator接口实现自定义排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 基于Spring Mvc实现的Excel文件上传下载示例

    基于Spring Mvc实现的Excel文件上传下载示例

    本篇文章主要介绍了基于Spring Mvc实现的Excel文件上传下载示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 基于redis setIfAbsent的使用说明

    基于redis setIfAbsent的使用说明

    这篇文章主要介绍了基于redis setIfAbsent的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • IDEA启动tomcat控制台中文乱码问题的解决方法(100%有效)

    IDEA启动tomcat控制台中文乱码问题的解决方法(100%有效)

    很多人在idea中启动项目时会出现控制台的中文乱码,其实也无伤大雅,但是本人看着不舒服,下面这篇文章主要给大家介绍了关于IDEA启动tomcat控制台中文乱码问题的解决方法,需要的朋友可以参考下
    2022-09-09
  • MyBatisPlus TypeHandler自定义字段类型转换Handler

    MyBatisPlus TypeHandler自定义字段类型转换Handler

    这篇文章主要为大家介绍了MyBatisPlus TypeHandler自定义字段类型转换Handler示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • java中queue接口的使用详解

    java中queue接口的使用详解

    本篇文章主要介绍了java中queue接口的使用详解,对学习Queue接口有一定的帮助,感兴趣的小伙伴们可以参考一下。
    2016-11-11

最新评论