第 4 章 迁移到 KRaft 模式


如果您使用 ZooKeeper 进行 Kafka 集群的元数据管理,您可以在 KRaft 模式中使用 Kafka。KRaft 模式替代 ZooKeeper 用于分布式协调,提供增强的可靠性、可扩展性和吞吐量。

要迁移集群,请执行以下操作:

  • 安装控制器节点仲裁来替换 ZooKeeper,以进行集群管理。
  • 通过将 zookeeper.metadata.migration.enable 属性设置为 true,在控制器配置中启用 KRaft 迁移。
  • 启动控制器,并使用相同的配置属性在当前集群代理上启用 KRaft 迁移。
  • 执行代理滚动重启以应用配置更改。
  • 迁移完成后,将代理切换到 KRaft 模式,并在控制器中禁用迁移。
重要

完成 KRaft 模式后,无法回滚到 ZooKeeper。在继续迁移前请仔细考虑这一点。

在开始迁移前,请验证您的环境是否可以支持 KRaft 模式的 Kafka:

  • 只有在专用控制器节点上支持迁移,不支持将双角色作为代理和控制器的节点。
  • 在整个迁移过程中,ZooKRaft 和 KRaft 控制器节点并行运行,集群中需要足够的计算资源。

先决条件

  • kafka 用户身份登录 Red Hat Enterprise Linux。
  • 每个主机上安装了 Apache Kafka 的流,且配置文件可用。
  • 您在 Kafka 3.7.0 或更新版本中使用 Streams for Apache Kafka 2.7 或更新版本。如果您使用早期版本的 Apache Kafka,在迁移到 KRaft 模式前升级。
  • 启用日志记录来检查迁移过程。

    log4j.properties 中为集群中的控制器和代理设置根日志记录器的 DEBUG 级别。如需详细的特定于迁移的日志,请为迁移日志记录器设置 TRACE

    控制器日志记录配置

    log4j.rootLogger=DEBUG
    log4j.logger.org.apache.kafka.metadata.migration=TRACE

流程

  1. 检索 Kafka 集群的集群 ID。

    使用 zookeeper-shell 工具:

    /opt/kafka/bin/zookeeper-shell.sh localhost:2181 get /cluster/id

    该命令返回集群 ID。

  2. 为集群安装 KRaft 控制器仲裁。

    1. 使用 controller.properties 文件在每个主机上配置控制器节点。

      每个控制器至少需要以下配置:

      • 唯一的节点 ID
      • migration enabled 标记设置为 true
      • zookeeper 连接详情
      • 控制器仲裁使用的监听程序名称
      • 控制器投票的仲裁
      • 用于 inter-broker 通信的监听程序名称

        控制器配置示例

        process.roles=controller
        node.id=1
        
        zookeeper.metadata.migration.enable=true
        zookeeper.connect=zoo1.my-domain.com:2181,zoo2.my-domain.com:2181,zoo3.my-domain.com:2181
        
        listeners=CONTROLLER://0.0.0.0:9090
        controller.listener.names=CONTROLLER
        listener.security.protocol.map=CONTROLLER:PLAINTEXT
        controller.quorum.voters=1@localhost:9090
        inter.broker.listener.name=PLAINTEXT

        控制器仲裁的格式是 < node_id>@<hostname>:<port > (用逗号分开的列表)。KRaft 控制器需要 inter-broker 侦听器名称来启动迁移。

    2. 为每个控制器节点设置日志目录:

      /opt/kafka/bin/kafka-storage.sh format -t <uuid> -c /opt/kafka/config/kraft/controller.properties

      返回:

      Formatting /tmp/kraft-controller-logs

      将 <uuid> 替换为您检索的集群 ID。对集群中的每个控制器节点使用相同的集群 ID。

      默认情况下,controller.properties 配置文件中指定的日志目录(log.dirs)设置为 /tmp/kraft-controller-logs/tmp 目录通常会在每次系统重启时清除,使其仅适用于开发环境。如果需要,使用逗号分隔列表设置多个日志目录。

    3. 启动每个控制器。

      /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/controller.properties
    4. 检查 Kafka 是否正在运行:

      jcmd | grep kafka

      返回:

      process ID kafka.Kafka /opt/kafka/config/kraft/controller.properties

      检查每个控制器的日志,以确保它们已成功加入 KRaft 集群:

      tail -f /opt/kafka/logs/controller.log
  3. 在每个代理上启用迁移。

    1. 如果运行,请停止主机上运行的 Kafka 代理。

      /opt/kafka/bin/kafka-server-stop.sh
      jcmd | grep kafka

      如果使用多节点集群,请参阅 第 3.6 节 “执行 Kafka 代理的安全滚动重启”

    2. 使用 server.properties 文件启用迁移。

      每个代理至少需要以下额外配置:

      • Inter-broker 协议版本设置为版本 3.7
      • 启用迁移的标记
      • 与控制器节点匹配的控制器配置
      • 控制器投票的仲裁

      代理配置示例

      broker.id=0
      inter.broker.protocol.version=3.7
      
      zookeeper.metadata.migration.enable=true
      zookeeper.connect=zoo1.my-domain.com:2181,zoo2.my-domain.com:2181,zoo3.my-domain.com:2181
      
      listeners=CONTROLLER://0.0.0.0:9090
      controller.listener.names=CONTROLLER
      listener.security.protocol.map=CONTROLLER:PLAINTEXT
      controller.quorum.voters=1@localhost:9090

      ZooKeeper 连接详情应该已存在。

    3. 重启更新的代理:

      /opt/kafka/bin/kafka-server-start.sh -daemon /opt/kafka/config/kraft/server.properties

      迁移会自动启动,可能需要一些时间,具体取决于集群中的主题和分区数量。

    4. 检查 Kafka 是否正在运行:

      jcmd | grep kafka

      返回:

      process ID kafka.Kafka /opt/kafka/config/kraft/server.properties
  4. 检查活跃控制器中的日志,以确认迁移已完成:

    /opt/kafka/bin/zookeeper-shell.sh localhost:2181 get /controller

    查找一个 INFO 日志条目,如下所示: 完成从 ZooKeeper 迁移到 KRaft 的元数据。

  5. 将每个代理切换到 KRaft 模式。

    1. 如以前一样停止代理。
    2. 更新 server.properties 文件中的代理配置:

      • 使用同一 ID 的 node.id 替换 broker.id
      • 代理添加代理 KRaft 角色
      • 删除 inter-broker 协议版本(inter.broker.protocol.version)
      • 删除启用迁移的标记(zookeeper.metadata.migration.enable)
      • 删除 ZooKeeper 配置
      • 删除控制器和代理通信的监听程序(control.plane.listener.name)

      KRaft 的代理配置示例

      node.id=0
      process.roles=broker
      
      listeners=CONTROLLER://0.0.0.0:9090
      controller.listener.names=CONTROLLER
      listener.security.protocol.map=CONTROLLER:PLAINTEXT
      controller.quorum.voters=1@localhost:9090

    3. 如果您在代理配置中使用 ACLS,请将 authorizer. class.name 属性更新为 基于 KRaft 的标准授权器。

      基于 zookeeper 的代理使用 authorizer.class.name=kafka.security.authorizer.AclAuthorizer

      迁移到基于 KRaft 的代理时,指定 authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer

    4. 如以前一样重启代理。
  6. 将每个控制器从迁移模式切换到。

    1. 如前文所述,以与代理相同的方式停止控制器。
    2. 更新 controller.properties 文件中的控制器配置:

      • 删除 ZooKeeper 连接详情
      • 删除 zookeeper.metadata.migration.enable 属性
      • 删除 inter.broker.listener.name

      以下迁移的控制器配置示例

      process.roles=controller
      node.id=1
      
      listeners=CONTROLLER://0.0.0.0:9090
      controller.listener.names=CONTROLLER
      listener.security.protocol.map=CONTROLLER:PLAINTEXT
      controller.quorum.voters=1@localhost:9090

    3. 如前文所述,以与代理相同的方式重启控制器。
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部