三种无需 Zookeeper 即可运行 Kafka 的简单方法
自从宣布删除Apache Zookeeper作为管理Apache Kafka元数据的依赖项以来已经有几年了。从 2.8 版本开始,我们现在可以在没有 Zookeeper 的情况下运行 Kafka 集群。本文将介绍开始使用容器的单节点集群的三种简单方法。
控制平面和数据平面
Apache Kafka 为其集群实现了独立的控制和数据平面。控制平面管理集群,跟踪哪些代理处于活动状态,并在集合更改时采取行动。同时,数据平面包含处理生产者和消费者及其记录所需的功能。在之前的迭代中,Zookeeper 是控制平面大部分实现的集群组件。
经过几年的工作,我们现在有了实现新控制平面的第一个版本,通常称为KIP-500的更改。Apache Kafka Raft(也称为 KRaft)是为取代 Zookeeper 而引入的新共识协议。代理现在可以担任仲裁控制器角色来管理集群控制平面。此更改简化了集群部署、监控和管理。新的 KRaft 控制器可作为 Apache Kafka 2.8 的早期访问使用。
容器化单节点
其水平扩展和管理高吞吐量的能力是实现 Apache Kafka 的最常见驱动因素。因此,您将实现一个包含许多用于生产用途的代理的集群。但是,为了简单和快速入门,我们将专注于单节点集群。
接下来,我们将使用容器来利用自包含环境的优势。我们将使用Strimzi项目容器。Strimzi 是Cloud Native Computing Foundation项目成员,它提供了一种在 Kubernetes 上运行 Apache Kafka 的简单方法,具有一组成熟的运算符和容器映像。Strimzi 团队正致力于移除其运营商中的 Zookeeper。如果您有兴趣,请跟踪他们未来在该领域的工作。
在本文中,我们将使用Quay Container Registry 中发布和可用的 Apache Kafka 2.8.1 版镜像。
Docker 或 Podman
第一个选项是在同一实例中运行具有代理和控制器角色的单个容器。我们只需要安装Docker或Podman并运行以下命令:
docker run -it --name kafka-zkless -p 9092:9092 -e LOG_DIR=/tmp/logs 域名/strimzi/kafka:latest-kafka-2.8.1-amd64 /bin/sh -c 'export CLUSTER_ID=$(bin/kafka-域名 random-uuid) && bin/kafka-域名 format -t $CLUSTER_ID -c config/kraft/域名erties && bin/kafka-server-域名 config/kraft/域名erties'
上面的命令启动一个名为“kafka-zkless”的容器并暴露标准的 Kafka 端口 9092。我们覆盖入口点并在一行中运行三个订单。第一个设置一个环境变量,为集群 ID 创建一个随机 UUID。第二部分运行`kafka-域名`脚本来格式化存储目录。最后,最后一个函数使用 KRaft 配置启动 Kafka 服务器。
您可以使用任何标准的 Kafka 工具(如kcat(以前称为 kafkacat))连接到代理以生成和使用记录。
Docker 撰写
现在,如果您更喜欢将 Kafka 作为更复杂设置的一部分运行,您可以使用Compose 规范来定义您的组件。这是 docker-compose yaml 文件的示例:
version: '2' services: kafka: container_name: kafka image: 域名/strimzi/kafka:latest-kafka-2.8.1-amd64 command: [ "sh", "-c", "export CLUSTER_ID=$$(bin/kafka-域名 random-uuid) && bin/kafka-域名 format -t $$CLUSTER_ID -c config/kraft/域名erties && bin/kafka-server-域名 config/kraft/域名erties --override 域名eners=$${KAFKA_ADVERTISED_LISTENERS} --override 域名域名=$${KAFKA_LISTENER_SECURITY_PROTOCOL_MAP} --override listeners=$${KAFKA_LISTENERS}" ] ports: - "9092:9092" environment: LOG_DIR: "/tmp/logs" KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_LISTENERS: PLAINTEXT://:29092,PLAINTEXT_HOST://:9092,CONTROLLER://:9093 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
您可以通过发出以下命令来运行上面的示例:
docker-compose up -d
它为引导服务器公开主机系统的端口 9092。如果您需要在更广泛的组合部署中访问它,您可以改用 kafka:29092。
Kubernetes 部署
最后,如果您已经在使用任何风格的 Kubernetes,您可以查看以下部署描述符:
apiVersion: apps/v1 kind: Deployment metadata: name: zkless-kafka spec: selector: matchLabels: app: zkless-kafka template: metadata: labels: app: zkless-kafka spec: containers: - name: zkless-kafka image: 域名/strimzi/kafka:latest-kafka-2.8.1-amd64 command: - /bin/sh - -c - 'export CLUSTER_ID=$(bin/kafka-域名 random-uuid) && bin/kafka-域名 format -t $CLUSTER_ID -c config/kraft/域名erties && bin/kafka-server-域名 config/kraft/域名erties --override 域名eners=${KAFKA_ADVERTISED_LISTENERS}' env: - name: LOG_DIR value: /tmp/logs - name: KAFKA_ADVERTISED_LISTENERS value: PLAINTEXT://zkless-kafka-bootstrap:9092 resources: limits: memory: "128Mi" cpu: "500m" ports: - containerPort: 9092
您可以使用以下命令应用上一个文件:
kubectl apply -f 域名
前面的命令将创建一个部署,该部署将使用zkless-kafka-bootstrap主机名公开引导服务器。它将限制对部署所在的当前命名空间的访问。您可以与宣传的听众一起玩,以根据您的需要对其进行调整。
概括
本文简要介绍了 Apache Kafka 的新控制平面实现。在上一个版本中已经完成了重要的工作,我们现在可以使用功能强大的 Zookeeperless Kafka 集群。我们回顾了使用容器映像尝试单节点集群的三种简单方法:运行简单的 docker 或 podman 命令、运行 docker-compose 或在 Kubernetes 上部署正在运行的 pod。