Apache Kafka 2.8 首次让我们得以一窥这个广受欢迎的事件流平台的无 ZooKeeper 未来:它附带了 KIP-500(“用自管理的元数据仲裁器替换 ZooKeeper”)的预览版,您现在可以运行 Kafka 集群而无需设置和操作 Apache ZooKeeper。这不仅从操作角度简化了 Kafka 的运行,新的元数据仲裁器实现(名为“KRaft”,Kafka Raft 元数据模式)还应提供更好的扩展性,例如在处理大量主题和分区时。

我之前 在我的个人博客上写过关于 KRaft 和无 ZooKeeper 的 Kafka 的初步体验。从那时起,Debezium 社区已将其 Apache Kafka 容器镜像 升级到 2.8 版本,这使得开始自行探索运行不带 ZooKeeper 的 Kafka 变得非常简单。请注意,KRaft 模式是 Apache Kafka 当前的一个早期访问功能,不应用于生产环境。

启用 KRaft 模式

从 Debezium 1.7 版本开始,Kafka 的容器镜像支持三个新的环境变量,在运行镜像时需要指定:

  • CLUSTER_ID:一个唯一的 ID,例如“5Yr1SIgYQz-b-dgRabWx4g”;如果存在此变量,则启用 KRaft 模式。否则,镜像将像以前一样运行,并且必须配置一个指向 ZooKeeper 的引用。使用 KRaft 模式时,Kafka 集群的所有节点必须使用相同的集群 ID。可以使用 Apache Kafka 自带的 kafka-storage.sh 脚本生成值。

  • NODE_ROLE:指定 Kafka 节点的角色;必须是“controller”(控制器)、“broker”(代理)或“combined”(组合)之一。在 KRaft 模式下,Kafka 节点可以是元数据仲裁(控制器节点)的一部分,它们可以专门用于传播消息(代理节点),或者它们可以同时执行这两者(组合节点)。根据您的用例和要求,您可能例如会选择一个由三个组合节点组成的较小的 Kafka 集群,或者一个由三个控制器和七个代理组成的较大集群。如果未给出值,镜像将以组合模式启动代理。

  • NODE_ID;为集群中的每个节点指定一个唯一的 ID(1、2、3、…);以前使用的 BROKER_ID 变量已被弃用,以支持 NODE_ID;目前,它仍然支持作为新名称的别名,但使用它会在日志中触发警告,并且计划最终将其淘汰。

此外,在使用 Debezium 容器镜像以 KRaft 模式启动 Kafka 集群时,还需要提供一个环境变量:KAFKA_CONTROLLER_QUORUM_VOTERS。此变量用于将 controller.quorum.voters 配置选项传递给 Kafka,格式为“id-1@controller-node-1:controller-port-1,…​”,引用集群中的所有控制器节点,例如 KAFKA_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093

尝试一下

实际上就是这么简单。让我们看一下用于启动三个完全由组合节点组成的 Kafka 集群的 Docker Compose 文件:

version: '2'
services:
  kafka-1:
    image: debezium/kafka:1.7
    ports:
      - 19092:9092
      - 19093:9093
    environment:
      - CLUSTER_ID=5Yr1SIgYQz-b-dgRabWx4g
      - BROKER_ID=1
      - KAFKA_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093
  kafka-2:
    image: debezium/kafka:1.7
    ports:
      - 29092:9092
      - 29093:9093
    environment:
      - CLUSTER_ID=5Yr1SIgYQz-b-dgRabWx4g
      - BROKER_ID=2
      - KAFKA_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093
  kafka-3:
    image: debezium/kafka:1.7
    ports:
      - 39092:9092
      - 39093:9093
    environment:
      - CLUSTER_ID=5Yr1SIgYQz-b-dgRabWx4g
      - BROKER_ID=3
      - KAFKA_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093

只需一次 docker compose up 操作,您就可以运行您的无 ZooKeeper Kafka 集群,准备好与 Debezium、Kafka Connect 或您拥有的任何其他 Kafka 工作负载一起使用。请记住:目前还不要将其部署到生产环境 ;) 请注意,无论给定的集群是否使用 ZooKeeper,都只是 Kafka 的一个实现细节,即对于 Debezium、其历史生产者/消费者以及任何其他 Kafka 客户端来说,它完全是透明的。

设置一个包含专用控制器和代理节点的集群也并不复杂。以下是一个包含一个控制器和三个代理节点的集群的配置(当然,在实际环境中,您会希望至少运行三个控制器,以避免单点故障):

version: '2'
services:
  kafka-1:
    image: debezium/kafka:1.7
    ports:
      - 19092:9092
      - 19093:9093
    environment:
      - CLUSTER_ID=5Yr1SIgYQz-b-dgRabWx4g
      - BROKER_ID=1
      - KAFKA_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9093
      - NODE_ROLE=controller
  kafka-2:
    image: debezium/kafka:1.7
    ports:
      - 29092:9092
      - 29093:9093
    environment:
      - CLUSTER_ID=5Yr1SIgYQz-b-dgRabWx4g
      - BROKER_ID=2
      - KAFKA_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9093
      - NODE_ROLE=broker
  kafka-3:
    image: debezium/kafka:1.7
    ports:
      - 39092:9092
      - 39093:9093
    environment:
      - CLUSTER_ID=5Yr1SIgYQz-b-dgRabWx4g
      - BROKER_ID=3
      - KAFKA_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9093
      - NODE_ROLE=broker
  kafka-4:
    image: debezium/kafka:1.7
    ports:
      - 49092:9092
      - 49093:9093
    environment:
      - CLUSTER_ID=5Yr1SIgYQz-b-dgRabWx4g
      - BROKER_ID=4
      - KAFKA_CONTROLLER_QUORUM_VOTERS=1@kafka-1:9093
      - NODE_ROLE=broker

您可以在 Debezium 示例存储库中找到这两个 Compose 文件的扩展版本(组合控制器/代理),其中还包含 Kafka Connect 和 Postgres 数据库的服务,并附带有关使用无 ZooKeeper Kafka 运行 Debezium 教程说明

随着 KRaft 模式在 Kafka 3.0 及更高版本中日趋成熟,我们可能会对容器镜像进行一些调整,以便最好地支持这种新的 Kafka 运行模式。最终,运行 ZooKeeper 的选项将被移除,但这还需要相当长的时间。

要了解有关 KRaft 的更多信息,请参阅 KIP-500 和相关的 KIPs,它们详细描述了该功能及其设计,以及 KRaft README 文件、Debezium 1.7 Apache Kafka 容器镜像的 README 以及前面提到的博客文章 “探索无 ZooKeeper 的 Kafka”

非常感谢 René Kerner 在撰写本文时提供的反馈。

Gunnar Morling

Gunnar 是一位软件工程师,内心是一个开源爱好者,目前在 Confluent 担任技术专家。此前,他曾帮助构建一个基于 Apache Flink 的实时流处理平台,并领导了 Debezium 项目,这是一个用于变更数据捕获的分布式平台。他是 Java Champion,并创立了多个开源项目,如 JfrUnit、kcctl 和 MapStruct。Gunnar 是一位热情的博主 (morling.dev),并曾在 QCon、Java One 和 Devoxx 等各种会议上发表演讲。他居住在德国汉堡。

   


关于 Debezium

Debezium 是一个开源的分布式平台,可以将现有数据库转变为事件流,使应用程序能够几乎即时地看到并响应数据库中已提交的每个行级更改。Debezium 构建在 Kafka 之上,并提供了 Kafka Connect 兼容的连接器,用于监控特定的数据库管理系统。Debezium 将数据更改的历史记录在 Kafka 日志中,这样您的应用程序可以随时停止和重新启动,并可以轻松地消费在未运行时错过的所有事件,确保所有事件都被正确且完整地处理。Debezium 在 Apache 许可证 2.0 下是 开源 的。

参与进来

我们希望您觉得 Debezium 有趣且有用,并希望尝试一下。在 Twitter @debezium 上关注我们,在 Zulip 上与我们聊天,或加入我们的 邮件列表 与社区交流。所有代码都在 GitHub 上开源,因此请在本地构建代码,帮助我们改进现有连接器并添加更多连接器。如果您发现问题或有改进 Debezium 的想法,请告诉我们或 记录一个问题

版权所有 © Debezium 及其作者。保留所有权利。有关我们的商标详情,请访问我们的 商标政策商标列表。第三方商标属于其各自所有者,在此提及并不表示任何认可或关联。
×