搜索

第 4 章 迁移到 KRaft 模式

download PDF

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

在迁移过程中,您要安装一个控制器节点的仲裁,用于替换 ZooKeeper 来管理集群。您可以通过将 zookeeper.metadata.migration.enable 属性设置为 true,在控制器配置中启用 KRaft 迁移。当控制器启动时,您可以使用同一配置属性在当前集群代理上启用 KRaft 迁移。迁移完成后,您可以将代理切换为使用 KRaft 和控制器退出迁移模式。

在开始迁移前,请验证您的环境是否可以在 KRaft 模式中支持 Kafka,因为 KRaft 不支持带有多个磁盘的 JBOD 存储。

先决条件

  • 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 连接详情
      • 控制器监听程序
      • 控制器投票的仲裁

        控制器配置示例

        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

        控制器仲裁的格式是 < node_id>@<hostname>:<port > (用逗号分开的列表)。

    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

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

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

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

      • inter-broker 协议版本设置为版本 3.5。
      • 启用迁移的标记
      • 控制器监听程序
      • 控制器投票的仲裁

      代理配置示例

      broker.id=0
      inter.broker.protocol.version=3.5
      
      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 配置

      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.metadata.migration.enable 属性。
    3. 如前所述,重启控制器。

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

      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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.