20.5. 更改主题的复制因素
要更改 Kafka 集群中主题的复制因素,请使用 kafka-reassign-partitions.sh
工具。这可以通过从连接到 Kafka 集群的交互式 pod 容器运行工具,并使用重新分配文件描述应如何更改主题副本。
此流程描述了使用 TLS 的安全进程。您需要一个使用 TLS 加密和 mTLS 身份验证的 Kafka 集群。
先决条件
-
您有一个正在运行的 Kafka 集群,它基于配置了内部 TLS 加密和 mTLS 身份验证的
Kafka
资源。 - 您正在运行连接到正在运行的 Kafka 代理的交互式 pod 容器。
-
您已生成了一个重新分配 JSON 文件,名为
reassignment.json
。 -
您作为配置了 ACL 规则的
KafkaUser
连接,该规则指定管理 Kafka 集群及其主题的权限。
请参阅 生成重新分配 JSON 文件。
在此过程中,名为 my-topic
的主题有 4 个副本,而我们希望将其减小到 3。名为 topics.json
的 JSON 文件指定主题,用于生成 reassignment.json
文件。
示例 JSON 文件指定 my-topic
{ "version": 1, "topics": [ { "topic": "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"]}]}
如果您需要稍后恢复更改,请将此文件的副本保存到本地。
编辑
reassignment.json
,以从每个分区中删除副本。例如,使用
jq
命令行 JSON 解析器工具 删除主题的每个分区的列表中最后一个副本:删除每个分区的最后一个主题副本
jq '.partitions[].replicas |= del(.[-1])' reassignment.json > reassignment.json
显示更新的副本的重新分配文件示例
{"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"]}]}
将
reassignment.json
文件复制到交互式 pod 容器中。oc cp reassignment.json <interactive_pod_name>:/tmp/reassignment.json
将 <interactive_pod_name > 替换为 pod 的名称。
在交互式 pod 容器中启动 shell 进程。
oc exec -n <namespace> -ti <interactive_pod_name> /bin/bash
将 <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
注意从代理中删除副本不需要任何代理数据移动,因此不需要节流复制。如果要添加副本,则可能需要更改节流率。
验证对主题副本的更改已使用任何代理 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
当
--verify
命令报告正在移动的每个分区都成功完成时,重新分配已完成。最后--verify
也具有删除任何重新分配节流的影响。使用
--describe
选项运行bin/kafka-topics.sh
命令,以查看对主题的更改结果。bin/kafka-topics.sh --bootstrap-server <cluster_name>-kafka-bootstrap:9093 \ --command-config /tmp/config.properties \ --describe
减少主题副本数的结果
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
最后,编辑
KafkaTopic
自定义资源,将.spec.replicas
更改为 3,然后等待协调。apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 3 replicas: 3