使用Docker Compose快速部署Kafka单机与集群环境指南

Docker Compose部署Kafka单机和集群全攻略

一、环境准备与核心组件解析

1.1 基础环境要求

部署Kafka需要满足以下条件:

  • Docker 20.10+版本(推荐最新稳定版)
  • Docker Compose v2.x(支持compose规范3.8+)
  • 主机资源:单机模式至少2GB内存,集群模式建议4核8GB+
  • 网络配置:开放9092(客户端端口)、2181(Zookeeper默认端口,集群模式)

1.2 核心组件选型

  • Zookeeper:Kafka依赖的协调服务(3.5.x+版本稳定)
  • Kafka Broker:推荐使用2.8.0+版本(修复了TLS和ACL的重要bug)
  • 镜像选择:官方bitnami/kafka镜像(包含Zookeeper集成方案)

二、单机模式部署实践

2.1 基础配置文件详解

  1. # docker-compose.yml
  2. version: '3.8'
  3. services:
  4. kafka:
  5. image: bitnami/kafka:3.6.0
  6. container_name: kafka-standalone
  7. ports:
  8. - "9092:9092"
  9. environment:
  10. - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092
  11. - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
  12. - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
  13. - ALLOW_PLAINTEXT_LISTENER=yes
  14. depends_on:
  15. - zookeeper
  16. zookeeper:
  17. image: bitnami/zookeeper:3.8.1
  18. container_name: zookeeper
  19. ports:
  20. - "2181:2181"
  21. environment:
  22. - ALLOW_ANONYMOUS_LOGIN=yes

2.2 关键配置说明

  1. 监听器配置

    • LISTENERS定义Broker实际监听的接口
    • ADVERTISED_LISTENERS告知客户端的访问地址(生产环境需替换为真实IP)
  2. 内存优化

    1. environment:
    2. - KAFKA_HEAP_OPTS=-Xms512m -Xmx512m

    建议设置JVM堆内存为物理内存的1/4,最大不超过8GB

  3. 日志配置

    1. volumes:
    2. - ./kafka_data:/bitnami/kafka
    3. - ./zookeeper_data:/bitnami/zookeeper

    持久化存储防止容器重启数据丢失

2.3 验证部署

  1. 创建测试Topic:

    1. docker exec -it kafka-standalone \
    2. kafka-topics.sh --create --topic test --partitions 1 --replication-factor 1 \
    3. --bootstrap-server localhost:9092
  2. 生产消费测试:

    1. # 生产消息
    2. docker exec -it kafka-standalone \
    3. kafka-console-producer.sh --topic test --bootstrap-server localhost:9092
    4. # 消费消息
    5. docker exec -it kafka-standalone \
    6. kafka-console-consumer.sh --topic test --from-beginning \
    7. --bootstrap-server localhost:9092

三、集群模式部署方案

3.1 三节点集群配置示例

  1. version: '3.8'
  2. services:
  3. zookeeper:
  4. image: bitnami/zookeeper:3.8.1
  5. environment:
  6. - ZOOKEEPER_CLUSTER_ID=1
  7. - ZOOKEEPER_SERVER_1=zookeeper1:2888:3888
  8. - ZOOKEEPER_SERVER_2=zookeeper2:2888:3888
  9. - ZOOKEEPER_SERVER_3=zookeeper3:2888:3888
  10. - ALLOW_ANONYMOUS_LOGIN=yes
  11. ports:
  12. - "2181:2181"
  13. # 需创建三个zookeeper服务实例,此处为简化示例
  14. kafka1:
  15. image: bitnami/kafka:3.6.0
  16. environment:
  17. - KAFKA_CFG_BROKER_ID=1
  18. - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092
  19. - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka1:9092
  20. - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181
  21. - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
  22. depends_on:
  23. - zookeeper
  24. # 需创建kafka2、kafka3服务,修改BROKER_ID和ADVERTISED_LISTENERS

3.2 集群特有配置要点

  1. Broker ID:每个节点需唯一(1-255)
  2. 控制器配置

    1. environment:
    2. - KAFKA_CFG_PROCESS_ROLES=broker,controller
    3. - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
    4. - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
    5. - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093

    使用KRaft模式(Kafka 2.8+)可替代Zookeeper

  3. 副本分配策略

    1. # 创建Topic时指定副本分布
    2. kafka-topics.sh --create --topic clustered-topic \
    3. --partitions 3 --replication-factor 3 \
    4. --bootstrap-server kafka1:9092 \
    5. --config "replication.factor=3" \
    6. --config "min.insync.replicas=2"

四、生产环境优化建议

4.1 性能调优参数

  1. 磁盘IO优化

    1. environment:
    2. - KAFKA_CFG_LOG_FLUSH_INTERVAL_MESSAGES=10000
    3. - KAFKA_CFG_LOG_FLUSH_INTERVAL_MS=1000
    4. - KAFKA_CFG_NUM_IO_THREADS=8
  2. 网络优化

    1. environment:
    2. - KAFKA_CFG_SOCKET_SEND_BUFFER_BYTES=102400
    3. - KAFKA_CFG_SOCKET_RECEIVE_BUFFER_BYTES=102400
    4. - KAFKA_CFG_NUM_NETWORK_THREADS=3

4.2 安全配置

  1. SASL认证

    1. environment:
    2. - KAFKA_CFG_SASL_ENABLED_MECHANISMS=SCRAM-SHA-256
    3. - KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL=SCRAM-SHA-256
    4. - KAFKA_CFG_SECURITY_INTER_BROKER_PROTOCOL=SASL_PLAINTEXT
  2. ACL管理

    1. # 添加用户
    2. kafka-configs.sh --zookeeper zookeeper:2181 \
    3. --alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=admin-pass]' \
    4. --entity-type users --entity-name admin
    5. # 授权
    6. kafka-acls.sh --bootstrap-server localhost:9092 \
    7. --add --allow-principal User:admin --operation All --topic "*"

五、常见问题解决方案

5.1 容器启动失败排查

  1. Zookeeper未就绪

    • 检查zookeeper.out日志
    • 确保SERVER_ID环境变量正确设置
  2. 端口冲突

    1. # 检查端口占用
    2. netstat -tulnp | grep 9092
    3. # 修改docker-compose.yml中的端口映射

5.2 集群同步异常

  1. 副本不同步

    1. kafka-topics.sh --describe --topic <topic-name> \
    2. --bootstrap-server localhost:9092

    检查Under Replicated Partitions数量

  2. 控制器选举失败

    • 检查kafka-controller.log
    • 确保CONTROLLER_QUORUM_VOTERS配置正确

六、进阶部署方案

6.1 使用Docker Swarm部署

  1. # docker-stack.yml
  2. version: '3.8'
  3. services:
  4. kafka:
  5. image: bitnami/kafka:3.6.0
  6. deploy:
  7. replicas: 3
  8. placement:
  9. constraints: [node.role == manager]
  10. environment:
  11. - KAFKA_CFG_BROKER_ID=${STATEFULSET_ORDINAL}
  12. # 其他配置...

6.2 监控集成方案

  1. Prometheus JMX Exporter

    1. services:
    2. kafka:
    3. image: bitnami/kafka:3.6.0
    4. ports:
    5. - "9092:9092"
    6. - "7071:7071" # JMX Exporter端口
    7. command:
    8. - /opt/bitnami/scripts/kafka/run.sh
    9. - "--java-opt=-javaagent:/opt/bitnami/jmx_exporter/jmx_prometheus_javaagent.jar=7071:/opt/bitnami/jmx_exporter/config.yml"
    10. volumes:
    11. - ./jmx_exporter_config.yml:/opt/bitnami/jmx_exporter/config.yml
  2. Grafana仪表盘

    • 导入Kafka官方仪表盘ID:14413
    • 关键监控指标:
      • kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec
      • kafka.server:type=ReplicaManager,name=UnderReplicatedPartitions

七、总结与最佳实践

  1. 资源分配原则

    • 每个Broker建议2-4个磁盘(RAID0可提升吞吐量)
    • 预留30% CPU资源用于突发流量
  2. 版本升级策略

    • 小版本升级可直接替换镜像
    • 大版本升级需先测试兼容性(特别是API变更)
  3. 备份恢复方案

    1. # 备份Topic数据
    2. kafka-run-class.sh kafka.tools.ExportZkOffsets \
    3. --zkconnect zookeeper:2181 --output /backup/offsets.txt
    4. # 恢复命令
    5. kafka-run-class.sh kafka.tools.ImportZkOffsets \
    6. --zkconnect zookeeper:2181 --input /backup/offsets.txt

通过Docker Compose部署Kafka可显著简化环境搭建过程,单机模式适合开发测试,集群模式则能满足生产环境的高可用需求。建议根据实际业务场景选择合适的部署方案,并定期进行性能调优和安全加固。