1. 概述

Docker 是软件行业中用于创建、打包和部署应用程序的最受欢迎的容器引擎之一。

在本教程中,我们将学习如何使用 Docker 进行 Apache Kafka 的设置。

关键的是,自版本 2.8.0 以来,Apache Kafka 支持无需 ZooKeeper 的模式。此外,到 Confluent 平台 7.5 版本为止,ZooKeeper 已被弃用。这就是为什么 我们特别指定了 ZooKeeper 和 Kafka 容器的版本为 7.4.4 的原因。

2. 单节点设置

单节点 Kafka 集群设置可以满足大多数本地开发需求,因此让我们首先学习这个简单的设置。

2.1. docker-compose.yml 配置

为了启动 Apache Kafka 服务器,我们首先需要启动一个 Zookeeper 服务器。

我们可以 docker-compose.yml 文件中配置这个依赖性,以确保 Zookeeper 服务器始终在 Kafka 服务器之前启动,并在之后停止。

让我们创建一个简单的 docker-compose.yml 文件,其中包含两个服务,即 zookeeperkafka

$ cat docker-compose.yml
version: '2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.4.4
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    ports:
      - 22181:2181
  
  kafka:
    image: confluentinc/cp-kafka:7.4.4
    depends_on:
      - zookeeper
    ports:
      - 29092:29092
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

在这个设置中,我们的 Zookeeper 服务器监听端口=2181kafka 服务在同一容器设置内通信。然而,对于任何在主机上运行的客户端,它将通过端口 22181 露出。

类似地,kafka 服务通过 KAFKA_ADVERTISED_LISTENERS 属性配置的环境在主机应用程序中通过端口 29092 露出,但实际在容器内部通过端口 9092 广告。

2.2. 启动 Kafka 服务器

让我们通过使用 docker-compose 命令启动容器来启动 Kafka 服务器:

$ docker-compose up -d
Creating network "kafka_default" with the default driver
Creating kafka_zookeeper_1 ... done
Creating kafka_kafka_1     ... done

现在,让我们使用 nc 命令验证两个服务器是否分别在相应的端口上监听

$ nc -zv localhost 22181
Connection to localhost port 22181 [tcp/*] succeeded!
$ nc -zv localhost 29092
Connection to localhost port 29092 [tcp/*] succeeded!

另外,我们还可以在容器启动时检查详细日志,并验证 Kafka 服务器是否已上线:

$ docker-compose logs kafka | grep -i started
kafka_1      | [2024-02-26 16:06:27,352] DEBUG [ReplicaStateMachine controllerId=1] Started replica state machine with initial state -> HashMap() (kafka.controller.ZkReplicaStateMachine)
kafka_1      | [2024-02-26 16:06:27,354] DEBUG [PartitionStateMachine controllerId=1] Started partition state machine with initial state -> HashMap() (kafka.controller.ZkPartitionStateMachine)
kafka_1      | [2024-02-26 16:06:27,365] INFO [KafkaServer id=1] started (kafka.server.KafkaServer)

完成这些步骤后,我们的 Kafka 设置即可使用。

2.3. 使用 Kafka 工具连接

最后,让我们使用 Kafka 工具 的 GUI 实用程序与我们新创建的 Kafka 服务器建立连接,稍后我们将可视化此设置:

Kafka服务器

值得注意的是,我们可能需要使用 Bootstrap servers 属性从主机机器连接到监听在端口 29092 的 Kafka 服务器

最终,我们应该能够在左侧边栏中可视化连接:

左侧边栏

因此,TopicsConsumers 的条目为空,因为这是新的设置。一旦我们有了主题,我们就可以可视化分区中的数据。此外,如果 Kafka 服务器上有活跃的消费者连接,我们也可以查看它们的详细信息。

3. Kafka 集群设置

对于更稳定的环境,我们需要一个冗余设置。让我们 扩展 docker-compose.yml 文件以创建 Apache Kafka 的多节点集群设置。

3.1. docker-compose.yml 配置

Apache Kafka 的集群设置需要 Zookeeper 服务器和 Kafka 服务器的冗余。

因此,让我们为 Zookeeper 和 Kafka 服务添加额外节点的配置:

$ cat docker-compose.yml
---
version: '2'
services:
  zookeeper-1:
    image: confluentinc/cp-zookeeper:7.4.4
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    ports:
      - 22181:2181

  zookeeper-2:
    image: confluentinc/cp-zookeeper:7.4.4
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    ports:
      - 32181:2181
  
  kafka-1:
    image: confluentinc/cp-kafka:7.4.4
    depends_on:
      - zookeeper-1
      - zookeeper-2

    ports:
      - 29092:29092
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:9092,PLAINTEXT_HOST://localhost:29092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
  kafka-2:
    image: confluentinc/cp-kafka:7.4.4
    depends_on:
      - zookeeper-1
      - zookeeper-2
    ports:
      - 39092:39092
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-2:9092,PLAINTEXT_HOST://localhost:39092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

重要的是,我们应该确保服务名称和 KAFKA_BROKER_ID 在各个服务中是唯一的

此外,每个服务必须 向主机机器暴露唯一端口。尽管 zookeeper-1zookeeper-2 监听端口 2181,它们通过端口 2218132181 分别向主机暴露。同样的逻辑适用于监听端口 2909239092kafka-1kafka-2 服务。

3.2. 启动 Kafka 集群

让我们通过使用 docker-compose 命令启动集群:

$ docker-compose up -d
Creating network "kafka_default" with the default driver
Creating kafka_zookeeper-1_1 ... done
Creating kafka_zookeeper-2_1 ... done
Creating kafka_kafka-2_1     ... done
Creating kafka_kafka-1_1     ... done

集群上线后,让我们使用 Kafka 工具连接到集群,指定 Kafka 服务器和相应端口的逗号分隔值:

Kafka服务器

最后,让我们查看集群中可用的多个代理节点:

多个代理节点

4. 总结

4. 总结

在这篇文章中,我们 使用 Docker 技术创建了 Apache Kafka 的单节点和多节点设置

我们还使用 Kafka 工具连接并可视化了配置的代理服务器详细信息。


« 上一篇: Spinnaker 简介