更改 Managed Service for Apache Kafka 集群中的分区分配

本页介绍了如何在 Managed Service for Apache Kafka 集群中更改分配给主题分区的代理。

概览

在 Managed Service for Apache Kafka 中创建新主题时,您可以选择分区数和复制因子。

复制因子是指存储主题中每个分区副本的代理数量。其中一个代理会充当领导者,其他代理则充当跟随者。主副本处理分区的写入请求,而跟随者复制数据。如果主节点发生故障,则会选择一个从节点作为主节点。

如果集群上启用了自动重新平衡,则扩容集群可能会导致重新分配分区,以保持每个代理的分区数量大致相同。

您可能出于以下原因需要更改分区分配:

  • 您扩缩了已停用自动重新平衡功能的集群,但新添加的代理未处理任何负载。

  • 某个分区接收的流量远高于其他分区,您希望通过将其他分区移至不同的代理来隔离负载。

您可以使用 Kafka 命令行工具重新分配分区,如下一部分中所述。

更改分区分配

如需更改分配给分区的代理,请执行以下步骤。

  1. 在 Compute Engine 虚拟机上安装 Kafka 命令行工具。虚拟机必须能够访问连接到集群的子网。如需了解详情,请参阅使用 Kafka 命令行工具生成和使用消息

  2. 通过调用 kafka-configs.sh --describe 命令获取集群中的代理列表。

    kafka-configs.sh --describe --entity-type brokers \
      --bootstrap-server=BOOTSTRAP_ADDRESS \
      --command-config client.properties
    

    BOOTSTRAP_ADDRESS 替换为集群的引导地址。该命令会返回代理 ID 和动态代理设置的列表。

    输出示例:

    Dynamic configs for broker 10 are:
    Dynamic configs for broker 11 are:
    Dynamic configs for broker 12 are:
    Default configs for brokers in the cluster are:
    

    在此示例中,代理 ID 为 101112。没有动态代理设置。

  3. 创建一个 JSON 文件,其中列出了要重新分配给不同代理的主题。 将文件格式设置为如下示例所示:

     {
       "topics": [
         { "topic": "topic-1" },
         { "topic": "topic-2" }
       ]
     }
    
  4. 使用 --generate 标志调用 kafka-reassign-partitions.sh 命令,以获取当前分区映射,并生成候选分区重新分配。

    kafka-reassign-partitions.sh --generate \
      --bootstrap-server=BOOTSTRAP_ADDRESS \
      --topics-to-move-json-file TOPICS_FILE \
      --broker-list BROKER_LIST \
      --command-config client.properties
    

    替换以下内容:

    • TOPICS_FILE:上一步中 JSON 文件的路径。
    • BROKER_LIST:主题的分区应重新分配到的代理的英文逗号分隔列表。示例:11,10

    输出示例:

    Current partition replica assignment
    {"version":1,"partitions":[{"topic":"topic-1","partition":0,"replicas":[12,10],"log_dirs":["any","any"]}]}
    
    Proposed partition reassignment configuration
    {"version":1,"partitions":[{"topic":"topic-1","partition":0,"replicas":[11,10],"log_dirs":["any","any"]}]}
    

    在此示例中,topic-1 的分区 0 分配给代理 1210

  5. 创建一个 JSON 文件,用于定义 broker 到分区的映射。您可以从上一步中建议的重新分配开始,根据需要进行修改。

    例如,以下映射会将 topic-1 的分区 0 移至代理 1110

    {
      "version":1,
      "partitions":[
        {
          "topic":"topic-1",
          "partition":0,
          "replicas":[11,10]
        }
      ]
    }
    
  6. 通过调用 kafka-reassign-partitions.sh --execute 命令分配分区。

    kafka-reassign-partitions.sh --execute \
      --reassignment-json-file PARTITION_MAP \
      --bootstrap-server=BOOTSTRAP_ADDRESS \
      --command-config client.properties
    

    PARTITION_MAP 替换为上一步中 JSON 文件的路径。

后续步骤