1. 概述

Docker 是软件行业中最流行的容器引擎之一, 用于 创建、打包和部署应用程序 。在本教程中,我们将学习如何使用 Docker 进行Apache Kafka设置。

2. 单节点设置

单节点 Kafka Broker 设置可以满足大部分 本地开发需求 。那么,让我们从学习这个简单的设置开始。

2.1. docker-compose.yml 配置

要启动 Apache Kafka 服务器,首先,我们需要启动Zookeeper服务器。我们可以 docker-compose.yml 文件中配置此依赖项 ,这将确保 Zookeeper 服务器始终在 Kafka 服务器之前启动并在其之后停止。

让我们创建一个包含两个服务的简单 docker-compose.yml 文件——即 Zookeeperkafka

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 服务器正在侦听端口 = 2181kafka 服务,该服务是在同一容器设置中定义的。但是,对于在主机上运行的任何客户端,它将在端口 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-1Zookeeper-2 正在侦听端口 2181 ,但它们分别通过端口 2218132181 将其公开给主机。同样的逻辑适用于 kafka-1kafka-2 服务,它们将分别侦听端口 2909239092

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 工具来连接和可视化配置的代理服务器详细信息。