30.3. 使用 ZooKeeper 时降级 Kafka
如果您在 ZooKeeper 模式中使用 Kafka,降级过程涉及更改 Kafka 版本以及相关的 log.message.format.version 和 inter.broker.protocol.version 属性。
30.3.1. 降级的 Kafka 版本兼容性 复制链接链接已复制到粘贴板!
Kafka 降级取决于兼容的当前和目标 Kafka 版本,以及记录消息的状态。
如果以前的一个版本不支持在集群中已使用过的任何 inter.broker.protocol.version 设置,或者消息已被添加到使用较新的 log.message.format.version 的消息日志中时,则无法恢复到这个以前的 Kafka 版本。
inter.broker.protocol.version 决定用于代理存储的持久性元数据的 schema,如写入 __consumer_offsets 的消息的 schema。如果您降级到一个 Kafka 版本,它不知道之前在集群中使用的 inter.broker.protocol.version,则代理将遇到它无法理解的数据。
如果目标降级版本 Kafka 具有:
-
与当前版本 相同的
log.message.format.version,Cluster Operator 通过执行单个代理滚动重启来降级。 一个不同的
log.message.format.version,只有运行的集群始终有log.message.format.version设置为降级版本使用的版本时,才可以下载。这通常只有在更改log.message.format.version前中止升级过程时才会出现这种情况。在这种情况下,降级需要:- 如果两个版本的 interbroker 协议不同,则代理的两个滚动重启
- 单个滚动重启(如果相同)
如果新版本已使用之前版本 不支持的 log.message.format.version,则无法降级,包括在使用 log.message.format.version 的默认值时。例如,此资源可以降级到 Kafka 版本 3.7.0,因为 log.message.format.version 还没有改变:
如果 log.message.format.version 设置为 "3.8" 或没有值,则参数为 3.8 的 3.8.0 代理使用默认值,则无法降级。
从 Kafka 3.0.0,当 inter.broker.protocol.version 设置为 3.0 或更高版本时,log.message.format.version 选项会被忽略,且不需要设置。
30.3.2. 降级基于 ZooKeeper 的 Kafka 集群和客户端应用程序 复制链接链接已复制到粘贴板!
将基于 ZooKeeper 的 Kafka 集群降级到早期版本。当将基于 ZooKeeper 的 Kafka 集群降级到较低版本时,如从 3.8.0 迁移到 3.7.0 时,请确保 Kafka 集群使用的代理协议版本是您要降级的 Kafka 版本支持的版本。从中降级的 Kafka 版本的 inter-broker 协议版本不能超过您要降级的版本。
有关基于 ZooKeeper 的降级的支持和限制的详情,请参考 Apache Kafka 文档。
先决条件
- Cluster Operator 已启动并在运行。
在降级 Kafka 集群前,检查
Kafka资源的以下内容:- 重要信息: Kafka 版本的兼容性。
-
Kafka自定义资源不包含被降级的 Kafka 版本不支持的选项。 Kafka.spec.kafka.config有一个log.message.format.version和inter.broker.protocol.version,被 Kafka 版本降级为。从 Kafka 3.0.0,当
inter.broker.protocol.version设置为3.0或更高版本时,log.message.format.version选项会被忽略,且不需要设置。
流程
更新 Kafka 集群配置。
oc edit kafka <kafka_configuration_file>
oc edit kafka <kafka_configuration_file>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
inter.broker.protocol.version版本(和log.message.format.version)改为您降级的 Kafka 版本支持的版本;将Kafka.spec.kafka.version保持不变。例如,如果从 Kafka 3.8.0 降级到 3.7.0 :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意log.message.format.version和inter.broker.protocol.version的值必须是字符串,以防止它们被解释为浮点号。保存并退出编辑器,然后等待滚动更新完成。
通过观察 pod 状态转换来检查滚动更新的进度:
oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'Copy to Clipboard Copied! Toggle word wrap Toggle overflow 滚动更新可确保每个 pod 使用指定的 Kafka inter-broker 协议版本。
将
Kafka.spec.kafka.version更改为之前的版本。例如,如果从 Kafka 3.8.0 降级到 3.7.0 :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果 Kafka 版本的镜像与 Cluster Operator 的
STRIMZI_KAFKA_IMAGES中定义的镜像不同,请更新Kafka.spec.kafka.image。等待 Cluster Operator 更新集群。
您可以从
Kafka资源的状态中检查降级是否已成功完成。降级所有客户端应用程序(使用者)以使用之前的客户端二进制文件版本。
Kafka 集群和客户端现在使用以前的 Kafka 版本。
如果您要恢复到之前早于 1.7 的 Apache Kafka 的 Streams 版本,它使用 ZooKeeper 进行主题元数据存储,请从 Kafka 集群中删除内部主题存储主题。
oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-38-rhel9:2.8.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete
oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-38-rhel9:2.8.0 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --deleteCopy to Clipboard Copied! Toggle word wrap Toggle overflow