在 Docker 中搭建 Kafka 集群可以大大简化环境配置和服务管理。以下是通过 Docker Compose 快速搭建 Kafka 集群及进行基本测试的技术指南。Kafka 集群通常包含多个节点,我们将配置一个简单的 3 节点 Kafka 集群,并介绍如何进行基本的消息生产和消费测试。

1. 环境准备

确保你已经安装了 Docker 和 Docker Compose。

2. 使用 Docker Compose 配置 Kafka 集群

2.1 创建项目目录

首先,创建一个项目目录用于存放 Docker 配置文件。

mkdir kafka-docker
cd kafka-docker

2.2 创建 docker-compose.yml

接下来,创建一个 docker-compose.yml 文件,用于定义 Kafka 集群中的多个容器。这个例子使用了 3 个 Kafka 节点和一个 Zookeeper 节点。

version: '3'

services:
  zookeeper:
    image: wurstmeister/zookeeper:3.4.6
    container_name: zookeeper
    ports:
      - "2181:2181"
    networks:
      - kafka-net

  kafka1:
    image: wurstmeister/kafka:latest
    container_name: kafka1
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENER: INSIDE_kafka1:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL: PLAINTEXT
      KAFKA_LISTENER_NAME_INSIDE: INSIDE
      KAFKA_LISTENER_PORT_INSIDE: 9093
      KAFKA_LISTENER_NAME_OUTSIDE: OUTSIDE
      KAFKA_LISTENER_PORT_OUTSIDE: 9092
      KAFKA_LISTENERS: INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:9092
      KAFKA_LISTENER_NAMES: INSIDE,OUTSIDE
      KAFKA_LISTENER_INTERFACE: INSIDE
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_LISTENER_PORT_MAP: INSIDE:9093,OUTSIDE:9092
      KAFKA_LISTENER_NAME_INSIDE: INSIDE
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENER_SECURITY_PROTOCOL: PLAINTEXT
    ports:
      - "9093:9093"
      - "9092:9092"
    networks:
      - kafka-net

  kafka2:
    image: wurstmeister/kafka:latest
    container_name: kafka2
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENER: INSIDE_kafka2:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL: PLAINTEXT
      KAFKA_LISTENER_NAME_INSIDE: INSIDE
      KAFKA_LISTENER_PORT_INSIDE: 9093
      KAFKA_LISTENER_NAME_OUTSIDE: OUTSIDE
      KAFKA_LISTENER_PORT_OUTSIDE: 9092
      KAFKA_LISTENERS: INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:9092
      KAFKA_LISTENER_NAMES: INSIDE,OUTSIDE
      KAFKA_LISTENER_INTERFACE: INSIDE
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_LISTENER_PORT_MAP: INSIDE:9093,OUTSIDE:9092
      KAFKA_LISTENER_NAME_INSIDE: INSIDE
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENER_SECURITY_PROTOCOL: PLAINTEXT
    ports:
      - "9094:9093"
    networks:
      - kafka-net

  kafka3:
    image: wurstmeister/kafka:latest
    container_name: kafka3
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENER: INSIDE_kafka3:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL: PLAINTEXT
      KAFKA_LISTENER_NAME_INSIDE: INSIDE
      KAFKA_LISTENER_PORT_INSIDE: 9093
      KAFKA_LISTENER_NAME_OUTSIDE: OUTSIDE
      KAFKA_LISTENER_PORT_OUTSIDE: 9092
      KAFKA_LISTENERS: INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:9092
      KAFKA_LISTENER_NAMES: INSIDE,OUTSIDE
      KAFKA_LISTENER_INTERFACE: INSIDE
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_LISTENER_PORT_MAP: INSIDE:9093,OUTSIDE:9092
      KAFKA_LISTENER_NAME_INSIDE: INSIDE
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENER_SECURITY_PROTOCOL: PLAINTEXT
    ports:
      - "9095:9093"
    networks:
      - kafka-net

networks:
  kafka-net:
    driver: bridge

2.3 启动 Kafka 集群

使用以下命令启动 Kafka 集群:

docker-compose up -d

这将启动 Zookeeper 服务以及 3 个 Kafka 节点。

2.4 验证 Kafka 集群

通过以下命令查看 Kafka 集群中运行的容器:

docker ps

你应该能够看到 zookeeperkafka1kafka2kafka3 容器正在运行。

3. 测试 Kafka 集群

3.1 创建 Kafka Topic

使用 Kafka 提供的 kafka-topics.sh 工具创建一个 Topic。

docker exec -it kafka1 kafka-topics.sh --create --topic test-topic --bootstrap-server kafka1:9092 --partitions 3 --replication-factor 3
  • --topic test-topic:指定 topic 名称。
  • --bootstrap-server kafka1:9092:指定 Kafka 集群的地址。
  • --partitions 3:指定分区数量。
  • --replication-factor 3:指定副本数量。

3.2 生产消息

使用 Kafka 的 kafka-console-producer.sh 工具向 test-topic 发送消息。

docker exec -it kafka1 kafka-console-producer.sh --broker-list kafka1:9092,kafka2:9092,kafka3:9092 --topic test-topic

输入消息并按 Enter 键发送:

Hello Kafka
This is a test message

3.3 消费消息

使用 kafka-console-consumer.sh 工具从 test-topic 中消费消息:

docker exec -it kafka1 kafka-console-consumer.sh --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092 --topic test-topic --from-beginning

此命令将显示所有从 test-topic 中接收到的消息。

4. 集群管理和扩展

4.1 查看集群状态

使用 kafka-topics.sh 工具查看集群中的所有 topic。

docker exec -it kafka1 kafka-topics.sh --list --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092

4.2 增加 Partition

你可以为已存在的 topic 增加 partition。

docker exec -it kafka1 kafka-topics.sh --alter --topic test-topic --partitions 5 --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092

4.3 删除 Topic

你可以删除一个 topic。

docker exec -it kafka1 kafka-topics.sh --delete --topic test-topic --bootstrap-server kafka1:9092,kafka2:9092,kafka3:9092

5. 停止和删除容器

完成测试后,你可以使用以下命令停止和删除容器。

docker-compose down

这将停止所有容器并删除网络配置。

总结

通过 Docker Compose 快速搭建 Kafka 集群,不仅简化了配置和管理过程,还为开发和测试提供了灵活的环境。通过这篇指南,你可以快速配置 Kafka 集群,创建 topic,发送和消费消息,以及进行集群管理和扩展。