背景描述

Kafka 新增节点后,针对已有的 Topic 的分区,系统不会自动将其平衡至新增节点。另外,删除 Kafka 节点时,被删节点可能分布有 Topic 分区,用户需要将这些分区移动至其他节点,才能确保节点的安全删除。

操作步骤

Kafka v3.8.1 及以下版本

针对 Kafka v3.8.1 及以下版本,用户可以在 Kafka Manager 上进行操作。详细操作如下。

  1. 访问 Kafka Manager

  2. 点击目标 Cluster 名称,进入 Cluster 详情页面。

    集群详情
  3. 在顶部菜单栏选择 Topic > List,进入 Topic List 页面。

    Generate Partition
  4. 点击 Generate Partition Assignments,进入 Confirm Assignments 页面。

    Generate Partition
  5. 勾选左侧所有 Topic,勾选右侧所有 Broker,点击 Generate Partition Assignments,系统会根据当前情况自动生成推荐的再平衡分配列表。

  6. 回到 Topic List 页面。

    Run Partition
  7. 点击 Run Partition Assignments,进入 Run Assignments 页面。

    Run Partition
  8. 点击 Run Partition Assignments,开始再平衡。此操作会把老 Broker 上的部分 Partition 分配到新加入的 Broker 上,让整个集群的流量更均衡。

  9. 在顶部菜单栏选择 Reassign Partitions,进入 Reassign Partitions 页面,查看结果。

    Reassign Partitions

Kafka v3.9.1

针对 Kafka v3.9.1 版本,用户可以使用 Kafka 提供的 Shell 命令为 Topic 重新分配分区。详细操作如下。

  1. 为已创建的 Kafka 集群,新增节点。详情可参考新增节点

  2. 登录 Kafka 客户端节点,详情可参考 VNC 登录客户端节点

  3. 执行以下命令行,查看已有的 Topic 列表。

    <kafka_dir>/bin/kafka-topics.sh --bootstrap-server <node1_ip>:9092 --list

    命令行参数说明

    参数 说明

    <kafka_dir>

    Kafka 安装目录,需根据实际情况进行修改。

    --bootstrap-server

    可设置一个或多个 Kafka 节点,格式为 <node1_ip>:9092,<node1_ip>:9092,<node1_ip>:9092,其中 <node1_ip> 为 Kafka 节点 IP,均需根据实际情况进行填写。

    查询示例如下

    kafka_rebalance_topic
  4. 创建 topic.json 文件,保存 Topic,内容如下。其中 <topic_1><topic_2> 为上一步命令行的输出结果,需根据实际情况进行修改。

    {
      "version": 1,
      "topics": [
        { "topic": "<topic_1>"},
        { "topic": "<topic_2>"}
      ]
    }

    根据上一步查询示例,topic.json 文件示例如下

    {
      "version": 1,
      "topics": [
        { "topic": "mytest"},
        { "topic": "__consumer_offsets"}
      ]
    }
  5. 执行以下命令行,获取重分配配置。

    <kafka_dir>/bin/kafka-reassign-partitions.sh --bootstrap-server <node1_ip>:9092 --topics-to-move-json-file <topic_json_file> --broker-list 1,3,4,6 --generate

    命令行参数说明

    参数 说明

    <kafka_dir>

    Kafka 安装目录,需根据实际情况进行修改。

    --bootstrap-server

    可设置一个或多个 Kafka 节点,格式为 <node1_ip>:9092,<node1_ip>:9092,<node1_ip>:9092,其中 <node1_ip> 为 Kafka 节点 IP,均需根据实际情况进行填写。

    --topics-to-move-json-file

    指定前文创建的 topic.json 文件目录,需根据实际情况进行修改。

    --broker-list

    指定 Topic 存放的目标 Kafka 节点,填写 Broker ID,多个 ID 之间使用逗号 , 隔开。

  6. 创建 reassignment.json 文件,将上述命令行执行结果中,重分配配置内容拷贝至 reassignment.json 文件。重分配配置内容如下红框中所示。

    kafka_rebalance_topic_2
  7. 执行以下命令行,分区重分配。

    <kafka_dir>/bin/kafka-reassign-partitions.sh --bootstrap-server 192.168.0.8:9092 --reassignment-json-file reassignment.json  --execute

    命令行参数说明

    参数 说明

    <kafka_dir>

    Kafka 安装目录,需根据实际情况进行修改。

    --bootstrap-server

    可设置一个或多个 Kafka 节点,格式为 <node1_ip>:9092,<node1_ip>:9092,<node1_ip>:9092,其中 <node1_ip> 为 Kafka 节点 IP,均需根据实际情况进行填写。

    --reassignment-json-file

    前文创建的 reassignment.json 文件目录,需根据实际情况进行修改。

  8. 可执行以下命令行,验证分区分配情况。

    <kafka_dir>/bin/kafka-reassign-partitions.sh --bootstrap-server 192.168.0.8:9092 --reassignment-json-file reassignment.json  --verify

    命令行参数说明

    参数 说明

    <kafka_dir>

    Kafka 安装目录,需根据实际情况进行修改。

    --bootstrap-server

    可设置一个或多个 Kafka 节点,格式为 <node1_ip>:9092,<node1_ip>:9092,<node1_ip>:9092,其中 <node1_ip> 为 Kafka 节点 IP,均需根据实际情况进行填写。

    --reassignment-json-file

    前文创建的 reassignment.json 文件目录,需根据实际情况进行修改。

    输出结果如下所示,completed 说明重分区已完成。

    kafka_rebalance_topic_3
  9. 对比 Topic 的分区情况。

    • 重分区前

      kafka_rebalance_topic_4
    • 重分区后

      kafka_rebalance_topic_5