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 基础配置文件详解
# docker-compose.ymlversion: '3.8'services:kafka:image: bitnami/kafka:3.6.0container_name: kafka-standaloneports:- "9092:9092"environment:- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181- ALLOW_PLAINTEXT_LISTENER=yesdepends_on:- zookeeperzookeeper:image: bitnami/zookeeper:3.8.1container_name: zookeeperports:- "2181:2181"environment:- ALLOW_ANONYMOUS_LOGIN=yes
2.2 关键配置说明
-
监听器配置:
LISTENERS定义Broker实际监听的接口ADVERTISED_LISTENERS告知客户端的访问地址(生产环境需替换为真实IP)
-
内存优化:
environment:- KAFKA_HEAP_OPTS=-Xms512m -Xmx512m
建议设置JVM堆内存为物理内存的1/4,最大不超过8GB
-
日志配置:
volumes:- ./kafka_data:/bitnami/kafka- ./zookeeper_data:/bitnami/zookeeper
持久化存储防止容器重启数据丢失
2.3 验证部署
-
创建测试Topic:
docker exec -it kafka-standalone \kafka-topics.sh --create --topic test --partitions 1 --replication-factor 1 \--bootstrap-server localhost:9092
-
生产消费测试:
# 生产消息docker exec -it kafka-standalone \kafka-console-producer.sh --topic test --bootstrap-server localhost:9092# 消费消息docker exec -it kafka-standalone \kafka-console-consumer.sh --topic test --from-beginning \--bootstrap-server localhost:9092
三、集群模式部署方案
3.1 三节点集群配置示例
version: '3.8'services:zookeeper:image: bitnami/zookeeper:3.8.1environment:- ZOOKEEPER_CLUSTER_ID=1- ZOOKEEPER_SERVER_1=zookeeper1:2888:3888- ZOOKEEPER_SERVER_2=zookeeper2:2888:3888- ZOOKEEPER_SERVER_3=zookeeper3:2888:3888- ALLOW_ANONYMOUS_LOGIN=yesports:- "2181:2181"# 需创建三个zookeeper服务实例,此处为简化示例kafka1:image: bitnami/kafka:3.6.0environment:- KAFKA_CFG_BROKER_ID=1- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka1:9092- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper1:2181,zookeeper2:2181,zookeeper3:2181- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093depends_on:- zookeeper# 需创建kafka2、kafka3服务,修改BROKER_ID和ADVERTISED_LISTENERS
3.2 集群特有配置要点
- Broker ID:每个节点需唯一(1-255)
-
控制器配置:
environment:- KAFKA_CFG_PROCESS_ROLES=broker,controller- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
使用KRaft模式(Kafka 2.8+)可替代Zookeeper
-
副本分配策略:
# 创建Topic时指定副本分布kafka-topics.sh --create --topic clustered-topic \--partitions 3 --replication-factor 3 \--bootstrap-server kafka1:9092 \--config "replication.factor=3" \--config "min.insync.replicas=2"
四、生产环境优化建议
4.1 性能调优参数
-
磁盘IO优化:
environment:- KAFKA_CFG_LOG_FLUSH_INTERVAL_MESSAGES=10000- KAFKA_CFG_LOG_FLUSH_INTERVAL_MS=1000- KAFKA_CFG_NUM_IO_THREADS=8
-
网络优化:
environment:- KAFKA_CFG_SOCKET_SEND_BUFFER_BYTES=102400- KAFKA_CFG_SOCKET_RECEIVE_BUFFER_BYTES=102400- KAFKA_CFG_NUM_NETWORK_THREADS=3
4.2 安全配置
-
SASL认证:
environment:- KAFKA_CFG_SASL_ENABLED_MECHANISMS=SCRAM-SHA-256- KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL=SCRAM-SHA-256- KAFKA_CFG_SECURITY_INTER_BROKER_PROTOCOL=SASL_PLAINTEXT
-
ACL管理:
# 添加用户kafka-configs.sh --zookeeper zookeeper:2181 \--alter --add-config 'SCRAM-SHA-256=[iterations=8192,password=admin-pass]' \--entity-type users --entity-name admin# 授权kafka-acls.sh --bootstrap-server localhost:9092 \--add --allow-principal User:admin --operation All --topic "*"
五、常见问题解决方案
5.1 容器启动失败排查
-
Zookeeper未就绪:
- 检查
zookeeper.out日志 - 确保
SERVER_ID环境变量正确设置
- 检查
-
端口冲突:
# 检查端口占用netstat -tulnp | grep 9092# 修改docker-compose.yml中的端口映射
5.2 集群同步异常
-
副本不同步:
kafka-topics.sh --describe --topic <topic-name> \--bootstrap-server localhost:9092
检查
Under Replicated Partitions数量 -
控制器选举失败:
- 检查
kafka-controller.log - 确保
CONTROLLER_QUORUM_VOTERS配置正确
- 检查
六、进阶部署方案
6.1 使用Docker Swarm部署
# docker-stack.ymlversion: '3.8'services:kafka:image: bitnami/kafka:3.6.0deploy:replicas: 3placement:constraints: [node.role == manager]environment:- KAFKA_CFG_BROKER_ID=${STATEFULSET_ORDINAL}# 其他配置...
6.2 监控集成方案
-
Prometheus JMX Exporter:
services:kafka:image: bitnami/kafka:3.6.0ports:- "9092:9092"- "7071:7071" # JMX Exporter端口command:- /opt/bitnami/scripts/kafka/run.sh- "--java-opt=-javaagent:/opt/bitnami/jmx_exporter/jmx_prometheus_javaagent.jar=7071:/opt/bitnami/jmx_exporter/config.yml"volumes:- ./jmx_exporter_config.yml:/opt/bitnami/jmx_exporter/config.yml
-
Grafana仪表盘:
- 导入Kafka官方仪表盘ID:14413
- 关键监控指标:
kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSeckafka.server:type=ReplicaManager,name=UnderReplicatedPartitions
七、总结与最佳实践
-
资源分配原则:
- 每个Broker建议2-4个磁盘(RAID0可提升吞吐量)
- 预留30% CPU资源用于突发流量
-
版本升级策略:
- 小版本升级可直接替换镜像
- 大版本升级需先测试兼容性(特别是API变更)
-
备份恢复方案:
# 备份Topic数据kafka-run-class.sh kafka.tools.ExportZkOffsets \--zkconnect zookeeper:2181 --output /backup/offsets.txt# 恢复命令kafka-run-class.sh kafka.tools.ImportZkOffsets \--zkconnect zookeeper:2181 --input /backup/offsets.txt
通过Docker Compose部署Kafka可显著简化环境搭建过程,单机模式适合开发测试,集群模式则能满足生产环境的高可用需求。建议根据实际业务场景选择合适的部署方案,并定期进行性能调优和安全加固。