飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

三种无需 Zookeeper 即可运行 Kafka 的简单方法

时间:2022-01-04  作者:电脑狂魔  

自从宣布删除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。 

标签:Kafka
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。