23.5. 升级 Kafka


将 Cluster Operator 升级到 2.5 后,下一步是将所有 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 版本间的代理协议版本日志消息格式版本zookeeper 版本

2.5

3.5.0

3.5

3.5

3.6.4

2.4

3.4.0

3.4

3.4

3.6.3

注意

AMQ Streams 2.5 使用 Kafka 3.5.0,但 Kafka 3.4.0 也支持进行升级。

间的代理协议版本

在 Kafka 中,用于内部代理通信的网络协议称为 inter-broker 协议。Kafka 的每个版本都有了一个内部代理协议的兼容版本。协议的次要版本通常会增加以匹配 Kafka 的次版本,如上表所示。

Kafka 资源中设置集群范围的协议版本。要更改它,您可以编辑 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 版本时升级客户端

在 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 版本,以及 代理间的协议版本

您还应选择升级客户端的策略。在此流程的第 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.4.0 升级到 3.5.0,则当前版本为 3.4 :

    kind: Kafka
    spec:
      # ...
      kafka:
        version: 3.4.0
        config:
          log.message.format.version: "3.4"
          inter.broker.protocol.version: "3.4"
          # ...
    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.4.0 升级到 3.5.0 :

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    spec:
      # ...
      kafka:
        version: 3.5.0 
    1
    
        config:
          log.message.format.version: "3.4" 
    2
    
          inter.broker.protocol.version: "3.4" 
    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 集群的镜像,在 Kafka.spec.kafka.image 中,更新 image 以指向新的 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
  7. 如果配置,将 Kafka 资源更新为使用新的 inter.broker.protocol.version 版本。否则,请转到第 9 步。

    例如,如果升级到 Kafka 3.5.0 :

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

    例如,如果升级到 Kafka 3.5.0 :

    apiVersion: kafka.strimzi.io/v1beta2
    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
    重要

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

  10. 等待 Cluster Operator 更新集群。

    • Kafka 集群和客户端现在使用新的 Kafka 版本。
    • 代理被配置为使用 Kafka 的新版本间的代理和消息格式版本发送信息。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat