23.5. 升级 Kafka


将 Cluster Operator 升级到 2.6 后,下一步是将所有 Kafka 代理升级到最新支持的 Kafka 版本。

Kafka 升级由 Cluster Operator 通过 Kafka 代理的滚动更新执行。

Cluster Operator 根据 Kafka 集群配置启动滚动更新。

Expand
如果 Kafka.spec.kafka.config 包含…​Cluster Operator 启动…​

inter.broker.protocol.versionlog.message.format.version

单个滚动更新。更新后,必须手动更新 inter.broker.protocol.version,后跟 log.message.format.version。更改每个将触发进一步的滚动更新。

inter.broker.protocol.versionlog.message.format.version

两个滚动更新。

没有 inter.broker.protocol.versionlog.message.format.version 的配置。

两个滚动更新。

重要

从 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 版本之间的区别:

Expand
表 23.1. 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.versionmessage.format.version 覆盖。

但是,如果您仍然有使用较旧的消息格式版本的客户端,我们建议首先升级您的客户端。从消费者开始,然后在升级代理时删除 log.message.format.versionmessage.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 版本不支持的配置选项。

流程

  1. 更新 Kafka 集群配置:

    oc edit kafka <my_cluster>
    Copy to Clipboard Toggle word wrap
  2. 如果配置,请检查 inter.broker.protocol.versionlog.message.format.version 属性是否已设置为 当前版本

    例如,如果从 Kafka 版本 3.5.0 升级到 3.6.0,则当前版本为 3.5 :

    kind: Kafka
    spec:
      # ...
      kafka:
        version: 3.5.0
        config:
          log.message.format.version: "3.5"
          inter.broker.protocol.version: "3.5"
          # ...
    Copy to Clipboard Toggle word wrap

    如果没有配置 log.message.format.versioninter.broker.protocol.version,AMQ Streams 会在在下一步中更新到 Kafka 版本后自动将这些版本更新为当前的默认值。

    注意

    log.message.format.versioninter.broker.protocol.version 的值必须是字符串,以防止它们被解释为浮点号。

  3. 更改 Kafka.spec.kafka.version 以指定新的 Kafka 版本;将 log.message.format.versioninter.broker.protocol.version 保留为 当前 Kafka 版本的默认值。

    注意

    更改 kafka.version 可确保升级集群中的所有代理,以使用新的代理二进制文件。在此过程中,一些代理使用旧的二进制文件,而其他代理已升级到新的二进制文件。将 inter.broker.protocol.version 保持不变在当前设置中,可确保代理可以在升级过程中继续相互通信。

    例如,如果从 Kafka 3.5.0 升级到 3.6.0 :

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      # ...
      kafka:
        version: 3.6.0 
    1
    
        config:
          log.message.format.version: "3.5" 
    2
    
          inter.broker.protocol.version: "3.5" 
    3
    
          # ...
    Copy to Clipboard Toggle word wrap
    1
    Kafka 版本已改为新版本。
    2
    消息格式版本保持不变。
    3
    inter-broker 协议版本保持不变。
    警告

    如果新的 Kafka 版本更改的 inter.broker.protocol.version,则无法降级 Kafka。inter-broker 协议版本决定用于代理存储的持久性元数据的模式,包括写入 __consumer_offsets 的消息。降级的集群不了解消息。

  4. 如果在 Kafka 自定义资源的 Kafka.spec.kafka.image 中定义了 Kafka 集群 的镜像,请更新该镜像以指向新的 Kafka 版本的容器镜像。

    请参阅 Kafka 版本和镜像映射

  5. 保存并退出编辑器,然后等待滚动更新完成。

    通过观察 pod 状态转换来检查滚动更新的进度:

    oc get pods my-cluster-kafka-0 -o jsonpath='{.spec.containers[0].image}'
    Copy to Clipboard Toggle word wrap

    滚动更新可确保每个 pod 都使用 Kafka 的新版本的代理二进制文件。

  6. 根据您选择的 策略来升级客户端,升级所有客户端应用程序以使用客户端二进制文件的新版本。

    如果需要,将 Kafka Connect 和 MirrorMaker 的 version 属性设置为 Kafka 的新版本:

    1. 对于 Kafka Connect,更新 KafkaConnect.spec.version
    2. 对于 MirrorMaker,更新 KafkaMirrorMaker.spec.version
    3. 对于 MirrorMaker 2,更新 KafkaMirrorMaker2.spec.version

      注意

      如果使用手动构建的自定义镜像,您必须重建这些镜像以确保它们使用最新的 AMQ Streams 基础镜像。例如,如果您从 基础 Kafka Connect 镜像创建了 Docker 镜像,请更新 Dockerfile 以指向最新的基础镜像和构建配置。

  7. 验证升级的客户端应用程序是否与新的 Kafka 代理正常工作。
  8. 如果配置,将 Kafka 资源更新为使用新的 inter.broker.protocol.version 版本。否则,请转到第 9 步。

    例如,如果升级到 Kafka 3.6.0 :

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      # ...
      kafka:
        version: 3.6.0
        config:
          log.message.format.version: "3.5"
          inter.broker.protocol.version: "3.6"
          # ...
    Copy to Clipboard Toggle word wrap
  9. 等待 Cluster Operator 更新集群。
  10. 如果配置,将 Kafka 资源更新为使用新的 log.message.format.version 版本。否则,请转到第 10 步。

    例如,如果升级到 Kafka 3.6.0 :

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      # ...
      kafka:
        version: 3.6.0
        config:
          log.message.format.version: "3.6"
          inter.broker.protocol.version: "3.6"
          # ...
    Copy to Clipboard Toggle word wrap
    重要

    从 Kafka 3.0.0,当 inter.broker.protocol.version 设置为 3.0 或更高版本时,log.message.format.version 选项会被忽略,且不需要设置。

  11. 等待 Cluster Operator 更新集群。

    您可以从 Kafka 资源的状态检查升级是否已成功完成

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat