19.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 可以在没有任何停机时间的情况下将主题从一个代理移到另一个代理,它是重新分配分区的最有效方法。
				
先决条件
- 
						您有一个基于配置了内部 TLS 加密和 mTLS 身份验证的 Kafka资源运行 Kafka 集群。
- 
						您已生成了一个重新分配 JSON 文件,名为 reassignment.json。
- 您正在运行连接到正在运行的 Kafka 代理的交互式 pod 容器。
- 
						您作为 KafkaUser配置有 ACL 规则,该规则指定管理 Kafka 集群及其主题的权限。
流程
- 
						如果没有这样做,请运行交互式 pod 容器来生成一个重新分配 JSON 文件,名为 reassignment.json。
- 将 - reassignment.json文件复制到交互式 pod 容器。- oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json - oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 将 <interactive_pod_name > 替换为 pod 的名称。 
- 在交互式 pod 容器中启动 shell 进程。 - oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash - oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 将 <namespace > 替换为运行 pod 的 OpenShift 命名空间。 
- 使用交互式 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 - 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 Copied! - Toggle word wrap Toggle overflow - 将 <cluster_name > 替换为 Kafka 集群的名称。例如, - my-cluster-kafka-bootstrap:9093- 如果您要节流复制,也可以使用每秒的 throttle 节流率传递 - --throttle选项。例如:- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow - 此命令将输出两个重新分配 JSON 对象。第一个记录了正在移动的分区的当前分配。如果您需要稍后恢复重新分配,您应该将它保存到本地文件(而不是 pod 中的文件)。第二个 JSON 对象是您在重新分配 JSON 文件中传递的目标重新分配。 - 如果您需要在重新分配过程中更改节流,您可以使用具有不同节流率相同的命令。例如: - Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- 使用任何代理 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 - 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 Copied! - Toggle word wrap Toggle overflow - 当 - --verify命令报告正在移动的每个分区都成功完成时,重新分配已完成。最后- --verify也会导致删除任何重新分配节流的影响。
- 现在,如果您保存了 JSON 以将分配恢复到其原始代理,您可以删除恢复文件。
- 当所有分区重新分配完成后,正在删除的代理不应负责集群中的任何分区。您可以通过检查代理的数据日志目录不包含任何实时分区日志来验证这一点。如果代理上的日志目录包含一个与扩展的正则表达式 - \.[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$'" - 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 Copied! - Toggle word wrap Toggle overflow - 其中 n 是要删除的 pod 的数量。 - 如果上述命令打印任何输出,则代理仍然有实时分区。在这种情况下,重新分配还没有完成,或者重新分配 JSON 文件不正确。 
- 
						当您确认代理没有实时分区时,您可以编辑 Kafka资源的Kafka.spec.kafka.replicas属性来减少代理数量。