💻 Kafka运维实战 (17篇)


Kafka kafka-reassign-partitions.sh 脚本用于重新分配主题的分区,包括修改分区的副本分布、增加或减少分区副本等操作。以下是其在 KRaft 模式下的详细用法:

kafka-reassign-partitions.sh 介绍

基本语法

kafka-reassign-partitions.sh 
  --bootstrap-server <bootstrap-server-list>  # KRaft 控制器或 broker 的地址(必填)
  --broker-list <String: brokerlist>         # "0,1,2"  (与--topics-to-move-json-file 配合)
  [--command-config <config-file>]           # 客户端配置文件(如认证信息)
  [--reassignment-json-file <file>]          # 包含分区重分配计划的 JSON 文件
  [--generate]                               # 生成建议的重分配计划
  [--execute]                                # 执行重分配计划
  [--verify]                                 # 验证重分配是否完成
  [--topic <topic-name>]                     # 指定单个主题(与 --generate 配合)
  [--topics-to-move-json-file <file>]        # 包含多个待重分配主题的 JSON 文件(与 --generate 配合)

核心参数说明

  1. --bootstrap-server
    必选参数,指定 KRaft 集群中 broker 或控制器的地址(格式:host:port),用于连接集群。
    示例:--bootstrap-server localhost:9092

  2. --generate
    生成建议的分区重分配计划(仅生成不执行)。需要配合以下参数之一:

    • --topics-to-move-json-file:指定包含多个主题的 JSON 文件(格式见下文)。
      生成的计划会考虑当前 broker 负载,建议均衡的副本分布。
  3. --reassignment-json-file
    指定包含分区重分配计划的 JSON 文件(与 --execute--verify 配合)。

  4. --execute
    执行 --reassignment-json-file 中定义的重分配计划。

  5. --verify
    验证 --reassignment-json-file 中定义的重分配是否完成,并返回结果。

使用步骤(示例)

步骤 1:创建待重分配的主题列表文件

若需重分配多个主题,创建 topics-to-move.json 文件,格式如下:

{
  "topics": [
    {"topic": "topic1"},
    {"topic": "topic2"}
  ],
  "version": 1
}
步骤 2:生成重分配建议

使用 --generate 生成建议的重分配计划:

kafka-reassign-partitions.sh \
  --bootstrap-server localhost:9092 \
  --topics-to-move-json-file topics-to-move.json \
  --broker-list "0,1,2" \
  --generate

输出说明

  • Current partition replica assignment:当前分区副本分布(建议保存,用于回滚)。
  • Proposed partition reassignment configuration:建议的新分布,需保存到文件(如 reassignment-plan.json)。
步骤 3:执行重分配计划

使用 --execute 执行生成的计划:

kafka-reassign-partitions.sh \
  --bootstrap-server localhost:9092 \
  --reassignment-json-file reassignment-plan.json \
  --execute

执行过程

  • 脚本会启动分区副本的迁移,过程中主题仍可正常读写。
  • 输出会显示重分配的进度,可通过 --verify 检查状态。
步骤 4:验证重分配结果

使用 --verify 确认重分配是否完成:

kafka-reassign-partitions.sh \
  --bootstrap-server localhost:9092 \
  --reassignment-json-file reassignment-plan.json \
  --verify

输出说明

  • 若成功,显示 Status of partition reassignment: Completed
  • 若未完成,显示当前进度(如 Reassigning)。

自定义重分配计划(高级用法)

若需手动指定分区副本分布(而非使用 --generate),可直接创建 reassignment-plan.json,格式如下:

{
  "version": 1,
  "partitions": [
    {
      "topic": "topic1",
      "partition": 0,
      "replicas": [1, 2]  # 副本所在的 broker ID 列表(第一个为 leader)
    },
    {
      "topic": "topic1",
      "partition": 1,
      "replicas": [2, 3]
    }
  ]
}

然后执行:

kafka-reassign-partitions.sh \
  --bootstrap-server localhost:9092 \
  --reassignment-json-file reassignment-plan.json \
  --execute

注意事项

  1. 性能影响

    • 重分配过程会产生网络和磁盘 IO,建议在业务低峰期执行。
    • 可通过 --throttle 限制迁移速率(需在 JSON 计划中指定 throttle 字段)。
  2. 回滚操作
    若重分配失败,可使用步骤 2 中保存的 Current partition replica assignment 作为计划,重新执行 --execute 回滚。

实战案例

分区重分配,均衡负载

kafka 集群中,topic perf-test-topic 分区不均衡,2 节点 是三个分区的Leader, 3 节点 是 一个分区的 Leader。分区分配不均衡,现在要通过分区分配,达到平衡。
在这里插入图片描述

步骤 1:创建待重分配的主题列表文件

若需重分配多个主题,创建 topics-to-move.json 文件,格式如下:

{
  "topics": [
    {
      "topic": "perf-test-topic"
    }
  ],
  "version": 1
}

步骤 2:生成重分配建议

–broker-list:值为要分配的 kafka broker id,以逗号分隔,该参数必不可少。
在这里插入图片描述
输出结果中有你当前的分区分配策略,也有 Kafka 期望的分配策略,在期望的分区分配策略里,kafka 已经尽可能的为你分配均衡。但是也不一定符合我们的要求。

Current partition replica assignment
{“version”:1,“partitions”:[{“topic”:“perf-test-topic”,“partition”:0,“replicas”:[2],“log_dirs”:[“any”]},{“topic”:“perf-test-topic”,“partition”:1,“replicas”:[2],“log_dirs”:[“any”]},{“topic”:“perf-test-topic”,“partition”:2,“replicas”:[3],“log_dirs”:[“any”]},{“topic”:“perf-test-topic”,“partition”:3,“replicas”:[1],“log_dirs”:[“any”]},{“topic”:“perf-test-topic”,“partition”:4,“replicas”:[1],“log_dirs”:[“any”]},{“topic”:“perf-test-topic”,“partition”:5,“replicas”:[2],“log_dirs”:[“any”]}]}
Proposed partition reassignment configuration
{“version”:1,“partitions”:[{“topic”:“perf-test-topic”,“partition”:0,“replicas”:[2],“log_dirs”:[“any”]},{“topic”:“perf-test-topic”,“partition”:1,“replicas”:[1],“log_dirs”:[“any”]},{“topic”:“perf-test-topic”,“partition”:2,“replicas”:[2],“log_dirs”:[“any”]},{“topic”:“perf-test-topic”,“partition”:3,“replicas”:[1],“log_dirs”:[“any”]},{“topic”:“perf-test-topic”,“partition”:4,“replicas”:[2],“log_dirs”:[“any”]},{“topic”:“perf-test-topic”,“partition”:5,“replicas”:[1],“log_dirs”:[“any”]}]}

在这里插入图片描述
建议的分配计划,不符合我们的需求。

步骤 3:执行重分配计划

使用 --execute 执行生成的计划:

kafka-reassign-partitions.sh \
  --bootstrap-server 192.168.37.10:9092 \
  --reassignment-json-file reassignment-plan.json \
  --execute

保存文件:

[root@test-10 kafka_2.13-3.7.0]# cat reassignment-plan.json
{“version”:1,“partitions”:[{“topic”:“perf-test-topic”,“partition”:0,“replicas”:[3],“log_dirs”:[“any”]},{“topic”:“perf-test-topic”,“partition”:1,“replicas”:[2],“log_dirs”:[“any”]},{“topic”:“perf-test-topic”,“partition”:2,“replicas”:[3],“log_dirs”:[“any”]},{“topic”:“perf-test-topic”,“partition”:3,“replicas”:[1],“log_dirs”:[“any”]},{“topic”:“perf-test-topic”,“partition”:4,“replicas”:[1],“log_dirs”:[“any”]},{“topic”:“perf-test-topic”,“partition”:5,“replicas”:[2],“log_dirs”:[“any”]}]}

在这里插入图片描述

步骤 4:验证重分配结果

在这里插入图片描述
现在3个Broker分别作为2个分区的Leader。达到了均衡。

Logo

一站式 AI 云服务平台

更多推荐