23.5. 升级 Kafka
将 Cluster Operator 升级到 2.6 后,下一步是将所有 Kafka 代理升级到最新支持的 Kafka 版本。
Kafka 升级由 Cluster Operator 通过 Kafka 代理的滚动更新执行。
Cluster Operator 根据 Kafka 集群配置启动滚动更新。
如果 Kafka.spec.kafka.config 包含… | Cluster Operator 启动… |
---|---|
|
单个滚动更新。更新后,必须手动更新 |
| 两个滚动更新。 |
没有 | 两个滚动更新。 |
从 Kafka 3.0.0,当 inter.broker.protocol.version
设置为 3.0
或更高版本时,log.message.format.version
选项会被忽略,且不需要设置。代理的 log.message.format.version
属性和主题的 message.format.version
属性已弃用,并将在以后的 Kafka 发行版本中删除。
作为 Kafka 升级的一部分,Cluster Operator 为 ZooKeeper 启动滚动更新。
- 即使 ZooKeeper 版本没有改变,也会进行单个滚动更新。
- 如果 Kafka 的新版本需要新的 ZooKeeper 版本,则会进行额外的滚动更新。
23.5.1. Kafka 版本 复制链接链接已复制到粘贴板!
Kafka 的日志消息格式版本和 inter-broker 协议版本分别指定,日志格式版本附加到消息以及集群中使用的 Kafka 协议版本。为确保使用了正确的版本,升级过程涉及对现有 Kafka 代理和客户端应用程序(使用者和生产者)进行配置更改。
下表显示了 Kafka 版本之间的区别:
AMQ Streams 版本 | Kafka 版本 | inter-broker 协议版本 | 日志消息格式版本 | ZooKeeper 版本 |
---|---|---|---|---|
2.6 | 3.6.0 | 3.6 | 3.6 | 3.8.3 |
2.5 | 3.5.0 | 3.5 | 3.5 | 3.6.4 |
- Kafka 3.6.0 支持在生产环境中使用。
- Kafka 3.5.0 仅支持升级到 AMQ Streams 2.6。
inter-broker 协议版本
在 Kafka 中,用于代理间通信的网络协议被称为 inter-broker 协议。Kafka 的每个版本都有了一个内部代理协议的兼容版本。协议的次要版本通常会增加以匹配 Kafka 的次要版本,如上表中所示。
inter-broker 协议版本在 Kafka
资源中设置 cluster wide。要更改它,您可以编辑 Kafka.spec.kafka.config
中的 inter.broker.protocol.version
属性。
日志消息格式版本
当制作者发送消息到 Kafka 代理时,消息会使用特定的格式进行编码。格式可能会在 Kafka 发行版本之间改变,因此消息指定它们编码的消息格式版本。
用于设置特定消息格式版本的属性如下:
-
主题的
message.format.version
属性 -
Kafka 代理的
log.message.format.version
属性
从 Kafka 3.0.0,消息格式版本值被假定为与 inter.broker.protocol.version
匹配,且不需要设置。该值反映了使用的 Kafka 版本。
当升级到 Kafka 3.0.0 或更高版本时,您可以在更新 inter.broker.protocol.version
时删除这些设置。否则,根据您要升级到的 Kafka 版本设置消息格式版本。
由在 Kafka 代理中设置的 log.message.format.version
定义的 message.format.version
的默认值。您可以通过修改主题配置来手动设置主题的 message.format.version
。
23.5.2. 升级客户端的策略 复制链接链接已复制到粘贴板!
升级 Kafka 客户端可确保它们从新版本的 Kafka 中引入的功能、修复和改进中受益。升级的客户端保持与其他升级的 Kafka 组件的兼容性。客户端的性能和稳定性也可能有所改进。
考虑升级 Kafka 客户端和代理的最佳方法,以确保平稳过渡。所选升级策略取决于您是否首先升级代理或客户端。从 Kafka 3.0 开始,您可以以任何顺序独立和升级代理和客户端。升级客户端或代理的决定首先取决于几个因素,如需要升级的应用程序数量以及可以容忍的停机时间。
如果您在代理前升级客户端,一些新功能可能无法正常工作,因为它们还没有被代理支持。但是,代理可以处理使用不同版本运行的生产者和消费者,并支持不同的日志消息版本。
使用 Kafka 3.0 之前的版本时升级客户端
在 Kafka 3.0 之前,您可以使用 log.message.format.version
属性(或主题级别上的 message.format.version
属性)为代理配置特定的消息格式。这允许代理支持使用过时的消息格式的旧 Kafka 客户端。否则,代理需要转换来自较旧的客户端的消息,而这会产生显著的性能成本。
自 0.11 版以来,Apache Kafka Java 客户端支持最新的消息格式版本。如果您的所有客户端都使用最新的消息版本,您可以在升级代理时删除 log.message.format.version
或 message.format.version
覆盖。
但是,如果您仍然有使用较旧的消息格式版本的客户端,我们建议首先升级您的客户端。从消费者开始,然后在升级代理时删除 log.message.format.version
或 message.format.version
覆盖前升级制作者。这将确保您的所有客户端都支持最新的消息格式版本,且升级过程平稳。
您可以使用此指标跟踪 Kafka 客户端名称和版本:
-
kafka.server:type=socket-server-metrics,clientSoftwareName=<name>,clientSoftwareVersion=<version>,listener=<listener>,networkProcessor=<processor>
以下 Kafka 代理指标帮助监控消息 down-conversion 的性能:
-
kafka.network:type=RequestMetrics,name=MessageConversionsTimeMs,request={Produce|Fetch}
提供了执行消息转换的时间的指标。 -
kafka.server:type=BrokerTopicMetrics,name={Produce|Fetch}MessageConversionsPerSec,topic=([-.\w]+)
在一段时间内转换的信息数量上提供指标。
23.5.3. Kafka 版本和镜像映射 复制链接链接已复制到粘贴板!
在升级 Kafka 时,请考虑 STRIMZI_KAFKA_IMAGES
环境变量和 Kafka.spec.kafka.version
属性的设置。
-
每个
Kafka
资源都可以使用Kafka.spec.kafka.version
配置。 Cluster Operator 的
STRIMZI_KAFKA_IMAGES
环境变量在 Kafka 版本和给定Kafka
资源中请求该版本时要使用的镜像之间提供映射。-
如果没有配置
Kafka.spec.kafka.image
,则会使用给定版本的默认镜像。 -
如果配置了
Kafka.spec.kafka.image
,则默认镜像会被覆盖。
-
如果没有配置
Cluster Operator 无法验证镜像是否实际包含预期版本的 Kafka 代理。请小心操作,确保给定镜像与给定的 Kafka 版本对应。
23.5.4. 升级 Kafka 代理和客户端应用程序 复制链接链接已复制到粘贴板!
将 AMQ Streams Kafka 集群升级到最新的支持的 Kafka 版本和 inter-broker 协议版本。
您还应选择升级客户端的策略。在此流程的第 6 步中升级 Kafka 客户端。
先决条件
- Cluster Operator 已启动并在运行。
-
在升级 AMQ Streams Kafka 集群前,请检查
Kafka
资源的Kafka.spec.kafka.config
属性不包含新的 Kafka 版本不支持的配置选项。
流程
更新 Kafka 集群配置:
oc edit kafka <my_cluster>
oc edit kafka <my_cluster>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果配置,请检查
inter.broker.protocol.version
和log.message.format.version
属性是否已设置为 当前版本。例如,如果从 Kafka 版本 3.5.0 升级到 3.6.0,则当前版本为 3.5 :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果没有配置
log.message.format.version
和inter.broker.protocol.version
,AMQ Streams 会在在下一步中更新到 Kafka 版本后自动将这些版本更新为当前的默认值。注意log.message.format.version
和inter.broker.protocol.version
的值必须是字符串,以防止它们被解释为浮点号。更改
Kafka.spec.kafka.version
以指定新的 Kafka 版本;将log.message.format.version
和inter.broker.protocol.version
保留为 当前 Kafka 版本的默认值。注意更改
kafka.version
可确保升级集群中的所有代理,以使用新的代理二进制文件。在此过程中,一些代理使用旧的二进制文件,而其他代理已升级到新的二进制文件。将inter.broker.protocol.version
保持不变在当前设置中,可确保代理可以在升级过程中继续相互通信。例如,如果从 Kafka 3.5.0 升级到 3.6.0 :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 警告如果新的 Kafka 版本更改的
inter.broker.protocol.version
,则无法降级 Kafka。inter-broker 协议版本决定用于代理存储的持久性元数据的模式,包括写入__consumer_offsets
的消息。降级的集群不了解消息。如果在 Kafka 自定义资源的
Kafka.spec.kafka.image
中定义了Kafka
集群的镜像
,请更新该镜像以指向新的 Kafka 版本的容器镜像。请参阅 Kafka 版本和镜像映射
保存并退出编辑器,然后等待滚动更新完成。
通过观察 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 的新版本的代理二进制文件。
根据您选择的 策略来升级客户端,升级所有客户端应用程序以使用客户端二进制文件的新版本。
如果需要,将 Kafka Connect 和 MirrorMaker 的
version
属性设置为 Kafka 的新版本:-
对于 Kafka Connect,更新
KafkaConnect.spec.version
。 -
对于 MirrorMaker,更新
KafkaMirrorMaker.spec.version
。 对于 MirrorMaker 2,更新
KafkaMirrorMaker2.spec.version
。注意如果使用手动构建的自定义镜像,您必须重建这些镜像以确保它们使用最新的 AMQ Streams 基础镜像。例如,如果您从 基础 Kafka Connect 镜像创建了 Docker 镜像,请更新 Dockerfile 以指向最新的基础镜像和构建配置。
-
对于 Kafka Connect,更新
- 验证升级的客户端应用程序是否与新的 Kafka 代理正常工作。
如果配置,将 Kafka 资源更新为使用新的
inter.broker.protocol.version
版本。否则,请转到第 9 步。例如,如果升级到 Kafka 3.6.0 :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 等待 Cluster Operator 更新集群。
如果配置,将 Kafka 资源更新为使用新的
log.message.format.version
版本。否则,请转到第 10 步。例如,如果升级到 Kafka 3.6.0 :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要从 Kafka 3.0.0,当
inter.broker.protocol.version
设置为3.0
或更高版本时,log.message.format.version
选项会被忽略,且不需要设置。等待 Cluster Operator 更新集群。
您可以从
Kafka
资源的状态检查升级是否已成功完成。