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 文件,其中包含两个服务,即 zookeeper 和 kafka:
$ 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 服务器监听端口=2181 与 kafka 服务在同一容器设置内通信。然而,对于任何在主机上运行的客户端,它将通过端口 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 服务器建立连接,稍后我们将可视化此设置:
值得注意的是,我们可能需要使用 Bootstrap servers 属性从主机机器连接到监听在端口 29092 的 Kafka 服务器。
最终,我们应该能够在左侧边栏中可视化连接:
因此,Topics 和 Consumers 的条目为空,因为这是新的设置。一旦我们有了主题,我们就可以可视化分区中的数据。此外,如果 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-1 和 zookeeper-2 监听端口 2181,它们通过端口 22181 和 32181 分别向主机暴露。同样的逻辑适用于监听端口 29092 和 39092 的 kafka-1 和 kafka-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 服务器和相应端口的逗号分隔值:
最后,让我们查看集群中可用的多个代理节点:
4. 总结
4. 总结
在这篇文章中,我们 使用 Docker 技术创建了 Apache Kafka 的单节点和多节点设置。
我们还使用 Kafka 工具连接并可视化了配置的代理服务器详细信息。