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 阵列必须仅包含一个磁盘。
-
JBOD 存储。虽然可以使用
- 管理 Kafka 集群的 Cluster Operator 正在运行。
Kafka 集群部署使用 Kafka 节点池。
如果您的基于 ZooKeeper 的集群已经使用节点池,则必须迁移。如果没有,您可以 迁移集群以使用节点池。当集群没有使用节点池时,代理必须包含在分配了
代理角色的KafkaNodePool资源配置中,并具有 namekafka。使用strimzi.io/node-pools: enabled注解在Kafka资源配置中启用了节点池的支持。
使用带有临时存储的单个控制器迁移到 KRaft 将无法正常工作。在迁移过程中,控制器重启将导致从 ZooKeeper 同步的元数据丢失(如主题和 ACL)。通常,不建议将基于临时的 ZooKeeper 集群迁移到 KRaft。
在此过程中,Kafka 集群名称是 my-cluster,它位于 my-project 命名空间中。创建的控制器节点池的名称为 controller。代理的节点池称为 kafka。
流程
对于 Kafka 集群,创建带有
控制器角色的节点池。节点池在集群中添加控制器节点的仲裁。
控制器节点池的配置示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意对于迁移,您无法使用共享代理和控制器角色的节点池。
应用新的
KafkaNodePool资源以创建控制器。在 Cluster Operator 日志中预期在基于 ZooKeeper 的环境中使用控制器相关的错误。错误可能会阻止协调。要防止这种情况,请立即执行下一步。
通过将
strimzi.io/kraft注解设置为迁移,在Kafka资源中启用 KRaft迁移:oc annotate kafka my-cluster strimzi.io/kraft="migration" --overwrite
oc annotate kafka my-cluster strimzi.io/kraft="migration" --overwriteCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用 KRaft 迁移
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将注解应用到
Kafka资源配置会开始迁移。检查控制器是否已启动,且代理已推出:
oc get pods -n my-project
oc get pods -n my-projectCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出显示代理和控制器节点池中的节点
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查迁移的状态:
oc get kafka my-cluster -n my-project -w
oc get kafka my-cluster -n my-project -wCopy to Clipboard Copied! Toggle word wrap Toggle overflow 更新元数据状态
NAME ... METADATA STATE my-cluster ... Zookeeper my-cluster ... KRaftMigration my-cluster ... KRaftDualWriting my-cluster ... KRaftPostMigration
NAME ... METADATA STATE my-cluster ... Zookeeper my-cluster ... KRaftMigration my-cluster ... KRaftDualWriting my-cluster ... KRaftPostMigrationCopy to Clipboard Copied! Toggle word wrap Toggle overflow 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 后无法执行回滚。
-
当元数据仅存储在
当元数据状态达到
KRaftPostMigration时,通过将strimzi.io/kraft注解设置为启用,在Kafka资源配置中启用 KRaft :oc annotate kafka my-cluster strimzi.io/kraft="enabled" --overwrite
oc annotate kafka my-cluster strimzi.io/kraft="enabled" --overwriteCopy to Clipboard Copied! Toggle word wrap Toggle overflow 启用 KRaft 迁移
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查 move to full KRaft 模式的状态:
oc get kafka my-cluster -n my-project -w
oc get kafka my-cluster -n my-project -wCopy to Clipboard Copied! Toggle word wrap Toggle overflow 更新元数据状态
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
当所有 ZooKeeper 相关资源都自动删除时,
PreKRaft就是状态。 -
KRaft是 KRaft 迁移完成后的最终状态(控制器已滚动后)。
注意根据为 ZooKeeper 配置
deleteClaim的方式,其持久性卷声明(PVC)和持久性卷(PV)可能无法删除。deleteClaim指定在卸载集群时是否删除 PVC。默认值为false。-
当所有 ZooKeeper 相关资源都自动删除时,
从
Kafka资源中删除任何与 ZooKeeper 相关的配置。删除以下部分:
-
spec.zookeeper
如果存在,您还可以从 .
spec.kafka.config 部分删除以下选项:-
log.message.format.version -
inter.broker.protocol.version
删除
log.message.format.version和inter.broker.protocol.version会导致代理和控制器再次推出。删除 ZooKeeper 属性会删除与 KRaft-operated 集群中存在的 ZooKeeper 配置相关的任何警告信息。-
5.2.1. 在迁移时执行回滚 复制链接链接已复制到粘贴板!
在 Kafka 资源中启用 KRaft 完成迁移前,状态已移到 KRaft 状态,您可以执行回滚操作,如下所示:
将
strimzi.io/kraft="rollback"注解应用到Kafka资源以回滚代理。oc annotate kafka my-cluster strimzi.io/kraft="rollback" --overwrite
oc annotate kafka my-cluster strimzi.io/kraft="rollback" --overwriteCopy to Clipboard Copied! Toggle word wrap Toggle overflow 回滚 KRaft 迁移
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 迁移过程必须处于
KRaftPostMigration状态才能执行此操作。代理会被回滚,以便可以重新连接到 ZooKeeper,状态返回到KRaftDualWriting。删除 Controller 节点池:
oc delete KafkaNodePool controller -n my-project
oc delete KafkaNodePool controller -n my-projectCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
strimzi.io/kraft="disabled"注解应用到Kafka资源,将元数据状态返回到ZooKeeper。oc annotate kafka my-cluster strimzi.io/kraft="disabled" --overwrite
oc annotate kafka my-cluster strimzi.io/kraft="disabled" --overwriteCopy to Clipboard Copied! Toggle word wrap Toggle overflow 切换回使用 ZooKeeper
Copy to Clipboard Copied! Toggle word wrap Toggle overflow