22.4. 在删除代理前,使用分区重新分配工具来重新分配分区


在减少 Kafka 集群中的代理数量前,使用 kafka-reassign-partitions.sh 工具生成的重新分配文件来重新分配分区。重新分配文件必须描述如何将分区重新分配给 Kafka 集群中的剩余代理。您可以将文件中指定的重新分配应用到代理,然后验证新分区分配。首先删除编号最高的 pod 中的代理。

此流程描述了使用 TLS 的安全扩展过程。您需要一个使用 TLS 加密和 mTLS 身份验证的 Kafka 集群。

kafka-reassign-partitions.sh 工具可用于重新分配 Kafka 集群中的分区,无论您是否通过集群管理所有节点,还是使用节点池来管理集群中的节点组。

注意

虽然您可以使用 kafka-reassign-partitions.sh 工具进行此操作,但建议使用 Cruise Control 来自动化分区重新分配和集群重新平衡。Cruise Control 可以在不停机的情况下将主题从一个代理移到另一个代理,这是重新分配分区的最高效方法。

先决条件

  • 您有一个正在运行的 Kafka 集群,它基于配置了内部 TLS 加密和 mTLS 身份验证的 Kafka 资源。
  • 您已生成了一个重新分配 JSON 文件,名为 reassignment.json
  • 您正在运行连接到正在运行的 Kafka 代理的交互式 pod 容器。
  • 您作为配置了 ACL 规则的 KafkaUser 连接,该规则指定管理 Kafka 集群及其主题的权限。

流程

  1. 如果没有这样做,请运行交互式 pod 容器来生成一个重新分配 JSON 文件,名为 reassignment.json
  2. reassignment.json 文件复制到交互式 pod 容器中。

    oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json
    Copy to Clipboard Toggle word wrap

    <interactive_pod_name > 替换为 pod 的名称。

  3. 在交互式 pod 容器中启动 shell 进程。

    oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash
    Copy to Clipboard Toggle word wrap

    <namespace > 替换为运行 pod 的 OpenShift 命名空间。

  4. 使用交互式 pod 容器中的 kafka-reassign-partitions.sh 脚本运行分区重新分配。

    bin/kafka-reassign-partitions.sh --bootstrap-server
     <cluster_name>-kafka-bootstrap:9093 \
     --command-config /tmp/config.properties \
     --reassignment-json-file /tmp/reassignment.json \
     --execute
    Copy to Clipboard Toggle word wrap

    <cluster_name > 替换为 Kafka 集群的名称。例如,my-cluster-kafka-bootstrap:9093

    如果要节流复制,您还可以传递 --throttle 选项,并传递 --throttle 选项,以字节为单位。例如:

    bin/kafka-reassign-partitions.sh --bootstrap-server
      <cluster_name>-kafka-bootstrap:9093 \
      --command-config /tmp/config.properties \
      --reassignment-json-file /tmp/reassignment.json \
      --throttle 5000000 \
      --execute
    Copy to Clipboard Toggle word wrap

    此命令将输出两个重新分配 JSON 对象。第一个记录正在移动的分区的当前分配。如果您需要稍后恢复重新分配,您应该将其保存到本地文件(而非 pod 中的文件)。第二个 JSON 对象是在重新分配 JSON 文件中传递的目标重新分配。

    如果您需要在重新分配过程中更改节流,您可以使用带有不同节流率相同的命令。例如:

    bin/kafka-reassign-partitions.sh --bootstrap-server
      <cluster_name>-kafka-bootstrap:9093 \
      --command-config /tmp/config.properties \
      --reassignment-json-file /tmp/reassignment.json \
      --throttle 10000000 \
      --execute
    Copy to Clipboard Toggle word wrap
  5. 使用来自任何代理 pod 的 kafka-reassign-partitions.sh 命令行工具验证重新分配是否已完成。这与上一步中的命令相同,但使用 --verify 选项而不是 --execute 选项。

    bin/kafka-reassign-partitions.sh --bootstrap-server
      <cluster_name>-kafka-bootstrap:9093 \
      --command-config /tmp/config.properties \
      --reassignment-json-file /tmp/reassignment.json \
      --verify
    Copy to Clipboard Toggle word wrap

    --verify 命令报告正在移动的每个分区都成功完成时,重新分配已完成。最后 --verify 也具有删除任何重新分配节流的影响。

  6. 现在,如果您保存了 JSON 以将分配恢复到其原始代理,您可以删除恢复的文件。
  7. 当所有分区重新分配完成后,会删除代理不应负责集群中的任何分区。您可以通过检查代理的数据日志目录不包含任何实时分区日志来验证这一点。如果代理中的日志目录包含一个与扩展正则表达式 \.[a-z0-9]-delete$ 不匹配的目录,则代理仍然具有实时分区,不应停止。

    您可以通过执行以下命令来检查它:

    oc exec my-cluster-kafka-0 -c kafka -it -- \
      /bin/bash -c \
      "ls -l /var/lib/kafka/kafka-log_<n>_ | grep -E '^d' | grep -vE '[a-zA-Z0-9.-]+\.[a-z0-9]+-delete$'"
    Copy to Clipboard Toggle word wrap

    其中 n 是要删除的 pod 的数量。

    如果上述命令打印任何输出,则代理仍有实时分区。在这种情况下,重新分配还没有完成,或者重新分配 JSON 文件不正确。

  8. 当您确认代理没有实时分区时,您可以编辑 Kafka 资源的 Kafka.spec.kafka.replicas 属性,以减少代理数量。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat