12.5. 更改主题的复制因素
要更改 Kafka 集群中主题的复制因素,请使用 kafka-reassign-partitions.sh
工具。这可以通过从连接到 Kafka 集群的交互式 pod 容器运行工具,并使用重新分配文件来描述主题副本是如何更改的。
此流程描述了使用 TLS 的安全进程。您需要一个使用 TLS 加密和 mTLS 身份验证的 Kafka 集群。
先决条件
-
您有一个基于配置了内部 TLS 加密和 mTLS 身份验证的
Kafka
资源运行 Kafka 集群。 - 您正在运行连接到正在运行的 Kafka 代理的交互式 pod 容器。
-
您已生成了一个名为
reassignment.json
的重新分配 JSON 文件。 -
您作为
KafkaUser
配置有 ACL 规则,该规则指定管理 Kafka 集群及其主题的权限。
请参阅 生成重新分配 JSON 文件。
在此过程中,名为 my-topic
的主题有 4 个副本,我们希望将其减少到 3。名为 topics.json
的 JSON 文件指定主题,用于生成 reassignment.json
文件。
JSON 文件示例指定 my-topic
流程
如果没有这样做,请运行交互式 pod 容器来生成一个重新分配 JSON 文件,名为
reassignment.json
。显示当前和建议的副本分配的重新分配 JSON 文件示例
Current partition replica assignment {"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[3,4,2,0],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[0,2,3,1],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[1,3,0,4],"log_dirs":["any","any","any","any"]}]} Proposed partition reassignment configuration {"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[0,1,2,3],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[1,2,3,4],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[2,3,4,0],"log_dirs":["any","any","any","any"]}]}
Current partition replica assignment {"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[3,4,2,0],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[0,2,3,1],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[1,3,0,4],"log_dirs":["any","any","any","any"]}]} Proposed partition reassignment configuration {"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[0,1,2,3],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[1,2,3,4],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[2,3,4,0],"log_dirs":["any","any","any","any"]}]}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果需要稍后恢复更改,在本地保存此文件的副本。
编辑
reassignment.json
,以从每个分区中删除副本。例如,使用
jq
删除主题的每个分区列表中的最后一个副本:删除每个分区的最后一个主题副本
jq '.partitions[].replicas |= del(.[-1])' reassignment.json > reassignment.json
jq '.partitions[].replicas |= del(.[-1])' reassignment.json > reassignment.json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 显示更新的副本的重新分配文件示例
{"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[0,1,2],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[1,2,3],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[2,3,4],"log_dirs":["any","any","any","any"]}]}
{"version":1,"partitions":[{"topic":"my-topic","partition":0,"replicas":[0,1,2],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":1,"replicas":[1,2,3],"log_dirs":["any","any","any","any"]},{"topic":"my-topic","partition":2,"replicas":[2,3,4],"log_dirs":["any","any","any","any"]}]}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
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 注意从代理中删除副本不需要任何代理数据移动,因此无需节流复制。如果要添加副本,您可能需要更改节流率。
验证对主题副本的更改是否已从任何代理 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
也会导致删除任何重新分配节流的影响。使用
--describe
选项运行bin/kafka-topics.sh
命令,以查看对主题的更改的结果。bin/kafka-topics.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --describe
bin/kafka-topics.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --describe
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 减少主题副本数的结果
my-topic Partition: 0 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2 my-topic Partition: 1 Leader: 2 Replicas: 1,2,3 Isr: 1,2,3 my-topic Partition: 2 Leader: 3 Replicas: 2,3,4 Isr: 2,3,4
my-topic Partition: 0 Leader: 0 Replicas: 0,1,2 Isr: 0,1,2 my-topic Partition: 1 Leader: 2 Replicas: 1,2,3 Isr: 1,2,3 my-topic Partition: 2 Leader: 3 Replicas: 2,3,4 Isr: 2,3,4
Copy to Clipboard Copied! Toggle word wrap Toggle overflow