5.2. 迁移到 KRaft 模式


如果您使用 ZooKeeper 在 Kafka 集群中进行元数据管理,您可以在 KRaft 模式下迁移到使用 Kafka。

在迁移过程中,您将控制器节点的仲裁安装为节点池,该池取代了 ZooKeeper 来管理集群。您可以通过应用 strimzi.io/kraft="migration" 注解在集群配置中启用 KRaft 迁移。迁移完成后,您可以使用 strimzi.io/kraft="enabled" 注解将代理切换为使用 KRaft 和控制器退出迁移模式。

在开始迁移前,请验证您的环境可以在 KRaft 模式中支持 Kafka,因为 存在一些限制。另请注意,以下内容:

  • 迁移只在专用控制器节点上支持,不支持将双角色作为代理和控制器的节点。
  • 在整个迁移过程中,ZooKeeper 和 controller 节点在一段时间内并行运行,需要集群中有足够的计算资源。
  • 启用 KRaft 模式后,无法回滚到 ZooKeeper。在继续迁移前请仔细考虑这一点。

先决条件

  • 您必须在 Kafka 3.7.0 或更新版本中使用 Streams for Apache Kafka 2.7 或更新版本。如果您使用早期版本的 Apache Kafka 或 Apache Kafka,在迁移到 KRaft 模式前升级。
  • 验证基于 ZooKeeper 的部署是否正常运行,因为 KRaft 模式不支持它们:

    • JBOD 存储。虽然可以使用 jbod 存储类型,但 JBOD 阵列必须仅包含一个磁盘。
  • 管理 Kafka 集群的 Cluster Operator 正在运行。
  • Kafka 集群部署使用 Kafka 节点池。

    如果您的基于 ZooKeeper 的集群已经使用节点池,则必须迁移。如果没有,您可以 迁移集群以使用节点池。当集群没有使用节点池时,代理必须包含在分配了 代理 角色的 KafkaNodePool 资源配置中,并具有 name kafka。使用 strimzi.io/node-pools: enabled 注解在 Kafka 资源配置中启用了节点池的支持。

重要

使用带有临时存储的单个控制器迁移到 KRaft 将无法正常工作。在迁移过程中,控制器重启将导致从 ZooKeeper 同步的元数据丢失(如主题和 ACL)。通常,不建议将基于临时的 ZooKeeper 集群迁移到 KRaft。

在此过程中,Kafka 集群名称是 my-cluster,它位于 my-project 命名空间中。创建的控制器节点池的名称为 controller。代理的节点池称为 kafka

流程

  1. 对于 Kafka 集群,创建带有 控制器 角色的节点池。

    节点池在集群中添加控制器节点的仲裁。

    控制器节点池的配置示例

    apiVersion: kafka.strimzi.io/v1beta2
    kind: KafkaNodePool
    metadata:
      name: controller
      labels:
        strimzi.io/cluster: my-cluster
    spec:
      replicas: 3
      roles:
        - controller
      storage:
        type: jbod
        volumes:
          - id: 0
            type: persistent-claim
            size: 20Gi
            deleteClaim: false
        resources:
          requests:
            memory: 64Gi
            cpu: "8"
          limits:
            memory: 64Gi
            cpu: "12"
    Copy to Clipboard Toggle word wrap

    注意

    对于迁移,您无法使用共享代理和控制器角色的节点池。

  2. 应用新的 KafkaNodePool 资源以创建控制器。

    在 Cluster Operator 日志中预期在基于 ZooKeeper 的环境中使用控制器相关的错误。错误可能会阻止协调。要防止这种情况,请立即执行下一步。

  3. 通过将 strimzi.io/kraft 注解设置为迁移,在 Kafka 资源中启用 KRaft 迁移

    oc annotate kafka my-cluster strimzi.io/kraft="migration" --overwrite
    Copy to Clipboard Toggle word wrap

    启用 KRaft 迁移

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
      namespace: my-project
      annotations:
        strimzi.io/kraft: migration
    # ...
    Copy to Clipboard Toggle word wrap

    将注解应用到 Kafka 资源配置会开始迁移。

  4. 检查控制器是否已启动,且代理已推出:

    oc get pods -n my-project
    Copy to Clipboard Toggle word wrap

    输出显示代理和控制器节点池中的节点

    NAME                     READY  STATUS   RESTARTS
    my-cluster-kafka-0       1/1    Running  0
    my-cluster-kafka-1       1/1    Running  0
    my-cluster-kafka-2       1/1    Running  0
    my-cluster-controller-3  1/1    Running  0
    my-cluster-controller-4  1/1    Running  0
    my-cluster-controller-5  1/1    Running  0
    # ...
    Copy to Clipboard Toggle word wrap

  5. 检查迁移的状态:

    oc get kafka my-cluster -n my-project -w
    Copy to Clipboard Toggle word wrap

    更新元数据状态

    NAME        ...  METADATA STATE
    my-cluster  ...  Zookeeper
    my-cluster  ...  KRaftMigration
    my-cluster  ...  KRaftDualWriting
    my-cluster  ...  KRaftPostMigration
    Copy to Clipboard Toggle word wrap

    METADATA STATE 显示用于管理 Kafka 元数据和协调操作的机制。在迁移开始时,这是 ZooKeeper

    • 当元数据仅存储在 ZooKeeper 中时,Zooee 是初始状态。
    • KRaftMigration 是迁移正在进行时的状态。启用 ZooKeeper 到 KRaft 迁移(zookeeper.metadata.migration.enable)的标记被添加到代理中,并使用控制器注册。根据集群中的主题和分区数量,迁移可能需要一些时间。
    • KRaftDualWriting 是 Kafka 集群作为 KRaft 集群工作时的状态,但元数据存储在 Kafka 和 ZooKeeper 中。代理会再次回滚,以移除该标志以启用迁移。
    • KRaftPostMigration 是为代理启用 KRaft 模式时的状态。元数据仍然存储在 Kafka 和 ZooKeeper 中。

    迁移状态也在 Kafka 资源的 status.kafkaMetadataState 属性中表示。

    警告

    您可以从此时回滚到使用 ZooKeeper。下一步是启用 KRaft。在启用 KRaft 后无法执行回滚。

  6. 当元数据状态达到 KRaftPostMigration 时,通过将 strimzi.io/kraft 注解设置为启用,在 Kafka 资源配置中启用 KRaft :

    oc annotate kafka my-cluster strimzi.io/kraft="enabled" --overwrite
    Copy to Clipboard Toggle word wrap

    启用 KRaft 迁移

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
      namespace: my-project
      annotations:
        strimzi.io/kraft: enabled
    # ...
    Copy to Clipboard Toggle word wrap

  7. 检查 move to full KRaft 模式的状态:

    oc get kafka my-cluster -n my-project -w
    Copy to Clipboard Toggle word wrap

    更新元数据状态

    NAME        ...  METADATA STATE
    my-cluster  ...  Zookeeper
    my-cluster  ...  KRaftMigration
    my-cluster  ...  KRaftDualWriting
    my-cluster  ...  KRaftPostMigration
    my-cluster  ...  PreKRaft
    my-cluster  ...  KRaft
    Copy to Clipboard Toggle word wrap

    • 当所有 ZooKeeper 相关资源都自动删除时,PreKRaft 就是状态。
    • KRaft 是 KRaft 迁移完成后的最终状态(控制器已滚动后)。
    注意

    根据为 ZooKeeper 配置 deleteClaim 的方式,其持久性卷声明(PVC)和持久性卷(PV)可能无法删除。deleteClaim 指定在卸载集群时是否删除 PVC。默认值为 false

  8. Kafka 资源中删除任何与 ZooKeeper 相关的配置。

    删除以下部分:

    • spec.zookeeper

    如果存在,您还可以从 . spec.kafka.config 部分删除 以下选项:

    • log.message.format.version
    • inter.broker.protocol.version

    删除 log.message.format.versioninter.broker.protocol.version 会导致代理和控制器再次推出。删除 ZooKeeper 属性会删除与 KRaft-operated 集群中存在的 ZooKeeper 配置相关的任何警告信息。

5.2.1. 在迁移时执行回滚

Kafka 资源中启用 KRaft 完成迁移前,状态已移到 KRaft 状态,您可以执行回滚操作,如下所示:

  1. strimzi.io/kraft="rollback" 注解应用到 Kafka 资源以回滚代理。

    oc annotate kafka my-cluster strimzi.io/kraft="rollback" --overwrite
    Copy to Clipboard Toggle word wrap

    回滚 KRaft 迁移

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
      namespace: my-project
      annotations:
        strimzi.io/kraft: rollback
    # ...
    Copy to Clipboard Toggle word wrap

    迁移过程必须处于 KRaftPostMigration 状态才能执行此操作。代理会被回滚,以便可以重新连接到 ZooKeeper,状态返回到 KRaftDualWriting

  2. 删除 Controller 节点池:

    oc delete KafkaNodePool controller -n my-project
    Copy to Clipboard Toggle word wrap
  3. strimzi.io/kraft="disabled" 注解应用到 Kafka 资源,将元数据状态返回到 ZooKeeper

    oc annotate kafka my-cluster strimzi.io/kraft="disabled" --overwrite
    Copy to Clipboard Toggle word wrap

    切换回使用 ZooKeeper

    apiVersion: kafka.strimzi.io/v1beta2
    kind: Kafka
    metadata:
      name: my-cluster
      namespace: my-project
      annotations:
        strimzi.io/kraft: disabled
    # ...
    Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat