docker搭建Kafka集群
基于已有的三台物理机(10.143.143.101-103)和ZooKeeper集群,以下是通过Docker搭建Kafka集群的完整方案:
# 一、部署架构设计
节点分配
- 每台物理机部署一个Kafka Broker容器,组成3节点集群。
- 使用
host
网络模式(性能最佳)或bridge
模式(需端口映射)。 - ZooKeeper集群复用现有环境,无需额外部署。
关键配置原则
KAFKA_BROKER_ID
:每台机器唯一(如101/102/103)。KAFKA_ADVERTISED_LISTENERS
:必须设置为宿主机的真实IP(否则外部客户端无法连接)。KAFKA_ZOOKEEPER_CONNECT
:指向现有ZooKeeper集群地址(如zk1:2181,zk2:2181,zk3:2181
)。
# 二、单台机器部署步骤(以10.143.143.101为例)
# 1. 拉取镜像
docker pull wurstmeister/kafka
1
# 2. 启动Kafka容器
docker run -d --name kafka101 \
--network host \ # 推荐host模式避免端口映射问题
-e KAFKA_BROKER_ID=101 \ # 与宿主机末三位一致
-e KAFKA_ZOOKEEPER_CONNECT=10.143.143.101:2181,10.143.143.102:2181,10.143.143.103:2181 \ # 替换为实际ZK地址
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.143.143.101:9092 \ # 当前宿主机IP
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \ # 容器内监听所有IP
-e KAFKA_LOG_DIRS=/kafka/logs \ # 日志目录
-v /data/kafka/logs:/kafka/logs \ # 挂载日志目录持久化
wurstmeister/kafka
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
参数说明:
KAFKA_BROKER_ID
:集群内唯一标识(102/103机器分别设为102/103)。KAFKA_ADVERTISED_LISTENERS
:客户端使用的通信地址,必须为物理机IP。- 若ZooKeeper使用非2181端口,需调整连接字符串。
# 3. 重复操作
在102、103机器执行相同命令,仅修改以下参数:
--name kafka102
/kafka103
KAFKA_BROKER_ID=102
/103
KAFKA_ADVERTISED_LISTENERS
中的IP为当前宿主机IP。
# 三、集群验证
# 1. 创建测试Topic
进入任意容器执行:
docker exec -it kafka101 sh
cd /opt/kafka/bin
# 创建Topic(3分区、3副本)
./kafka-topics.sh --create \
--bootstrap-server 10.143.143.101:9092 \
--replication-factor 3 \
--partitions 3 \
--topic test
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 2. 查看Topic状态
./kafka-topics.sh --describe \
--bootstrap-server 10.143.143.101:9092 \
--topic test
1
2
3
2
3
预期输出:
Partition
信息显示3个分区均匀分布在101/102/103节点。Replicas
显示每个分区有3个副本。
# 3. 生产消费测试
- 生产者(10.143.143.101):
./kafka-console-producer.sh \ --broker-list 10.143.143.101:9092,10.143.143.102:9092,10.143.143.103:9092 \ --topic test
1
2
3 - 消费者(10.143.143.102):若生产者输入消息后消费者能实时接收,则集群工作正常。
./kafka-console-consumer.sh \ --bootstrap-server 10.143.143.101:9092,10.143.143.102:9092,10.143.143.103:9092 \ --topic test \ --from-beginning
1
2
3
4
# 四、运维优化建议
数据持久化
挂载宿主机目录存储日志(如-v /data/kafka:/kafka
),避免容器重启数据丢失。资源限制
启动时添加--memory=2g --cpus=2
限制容器资源,防止单节点过载。监控方案
- Kafka Manager:通过Docker部署可视化管控平台:
kafka-manager: image: sheepkiller/kafka-manager ports: ["9000:9000"] environment: ZK_HOSTS: "10.143.143.101:2181,10.143.143.102:2181,10.143.143.103:2181"
1
2
3
4
5
- Kafka Manager:通过Docker部署可视化管控平台:
安全加固
- 生产环境启用SASL认证(参考的
KAFKA_CFG_SASL_ENABLED_MECHANISMS
)。 - 限制ZooKeeper访问IP(如防火墙规则)。
- 生产环境启用SASL认证(参考的
# 常见问题解决
- Broker无法注册到ZooKeeper:
检查KAFKA_ZOOKEEPER_CONNECT
地址是否正确、网络是否互通。 - 客户端连接超时:
确认KAFKA_ADVERTISED_LISTENERS
设置为物理机IP(非localhost)。 - 数据未持久化:
挂载目录后需确保容器用户有写权限(可添加--user root
临时解决)。
部署完成后,建议通过
kafka-consumer-groups.sh
验证集群负载均衡状态。如需更简化的管理,可改用Docker Compose编排(参考的yml模板)。
编辑 (opens new window)
上次更新: 2025/06/24, 00:41:57