1. 概述
Docker 是软件行业中最流行的容器引擎之一, 用于 创建、打包和部署应用程序 。在本教程中,我们将学习如何使用 Docker 进行Apache Kafka设置。
2. 单节点设置
单节点 Kafka Broker 设置可以满足大部分 本地开发需求 。那么,让我们从学习这个简单的设置开始。
2.1. docker-compose.yml 配置
要启动 Apache Kafka 服务器,首先,我们需要启动Zookeeper服务器。我们可以 在 docker-compose.yml 文件中配置此依赖项 ,这将确保 Zookeeper 服务器始终在 Kafka 服务器之前启动并在其之后停止。
让我们创建一个包含两个服务的简单 docker-compose.yml 文件——即 Zookeeper 和 kafka :
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
kafka:
image: confluentinc/cp-kafka:latest
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* 服务通过端口 *29092 向主机应用程序公开 ,但它实际上是在 KAFKA_ADVERTISED_LISTENERS 属性配置的 容器环境中的端口 9092 上发布的。
2.2.启动卡夫卡服务器
让我们使用 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 -z localhost 22181
Connection to localhost port 22181 [tcp/*] succeeded!
$ nc -z localhost 29092
Connection to localhost port 29092 [tcp/*] succeeded!
此外,我们还可以在容器启动时检查详细日志并验证 Kafka 服务器是否已启动:
$ docker-compose logs kafka | grep -i started
kafka_1 | [2021-04-10 22:57:40,413] DEBUG [ReplicaStateMachine controllerId=1] Started replica state machine with initial state -> HashMap() (kafka.controller.ZkReplicaStateMachine)
kafka_1 | [2021-04-10 22:57:40,418] DEBUG [PartitionStateMachine controllerId=1] Started partition state machine with initial state -> HashMap() (kafka.controller.ZkPartitionStateMachine)
kafka_1 | [2021-04-10 22:57:40,447] INFO [SocketServer brokerId=1] Started data-plane acceptor and processor(s) for endpoint : ListenerName(PLAINTEXT) (kafka.network.SocketServer)
kafka_1 | [2021-04-10 22:57:40,448] INFO [SocketServer brokerId=1] Started socket server acceptors and processors (kafka.network.SocketServer)
kafka_1 | [2021-04-10 22:57:40,458] INFO [KafkaServer id=1] started (kafka.server.KafkaServer)
这样,我们的 Kafka 设置就可以使用了。
2.3.使用Kafka工具连接
最后,让我们使用 Kafka Tool GUI 实用程序与新创建的 Kafka 服务器建立连接 ,稍后我们将可视化此设置:
我们必须注意,我们需要使用 Bootstrap 服务器 属性连接到 在主机的端口 29092 上侦听的 Kafka 服务器。
最后,我们应该能够在左侧栏上看到连接:
因此,主题和消费者的条目为空,因为它是新设置。创建主题后,我们应该能够跨分区可视化数据。此外,如果有活跃的消费者连接到我们的 Kafka 服务器,那么我们也可以查看他们的详细信息。
3.Kafka集群设置
为了获得更稳定的环境,我们需要弹性设置。因此,让 我们扩展 docker-compose.yml 文件来创建多节点 Kafka 集群设置 。
3.1. docker-compose.yml 配置
Apache Kafka 的集群设置需要为 Zookeeper 服务器和 Kafka 服务器提供冗余。因此,让我们为 Zookeeper 和 Kafka 服务各添加一个节点的配置:
---
version: '2'
services:
zookeeper-1:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
zookeeper-2:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 32181:2181
kafka-1:
image: confluentinc/cp-kafka:latest
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:latest
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 将其公开给主机。同样的逻辑适用于 kafka-1 和 kafka-2 服务,它们将分别侦听端口 29092 和 39092 。
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 服务器和相应端口指定逗号分隔值来连接到集群:
最后,我们看一下集群中可用的多个broker节点:
4。结论
在本教程中,我们 使用 Docker 技术创建 Apache Kafka 的单节点和多节点设置 。此外,我们还使用 Kafka 工具来连接和可视化配置的代理服务器详细信息。