Kafka集群搭建指南
Kafka的运行依赖Zookeeper,本文介绍如何在docker顺利搭建一个三个broker构成的kafka集群。
📋 目录
环境说明
系统环境: Linux + CentOS + JDK8
拉取镜像
1. 拉取Zookeeper镜像
docker pull bitnami/zookeeper
2. 拉取Kafka镜像
docker pull bitnami/kafka
3. 拉取Kafka管理平台镜像
docker pull sheepkiller/kafka-manager
创建网络
创建Docker网络
docker network create knet
说明:
- 在运行容器时指定
docker run --net knet ...可以将容器置于子网中 - IP地址根据进入子网的顺序递增
- 查看子网列表:
docker network ls - 查看子网详情:
docker network inspect 子网名称
配置文件设置
约定路径
- 节点1配置文件:
/home/docker/kafka/config/node1/server.properties - 节点2配置文件:
/home/docker/kafka/config/node2/server.properties - 节点3配置文件:
/home/docker/kafka/config/node3/server.properties - Hosts文件:
/home/docker/kafka/etc/hosts
📁 节点1配置文件 (server.properties)
# broker id
broker.id=1
# 监听地址
listeners=PLAINTEXT://node1:9091
advertised.listeners=PLAINTEXT://node1:9091
# 发送响应的线程数
num.network.threads=2
# io线程数
num.io.threads=4
# 发送缓存大小
socket.send.buffer.bytes=10240
# 接收缓存大小
socket.receive.buffer.bytes=10240
# 最大请求
socket.request.max.bytes=1048576
# 分区数
num.partitions=1
# zookeeper的地址
zookeeper.connect=172.18.0.2:2181
# 允许容器监听
ALLOW_PLAINTEXT_LISTENER=yes
📁 节点2配置文件 (server.properties)
# broker id
broker.id=2
# 监听地址
listeners=PLAINTEXT://node2:9092
advertised.listeners=PLAINTEXT://node2:9092
# 发送响应的线程数
num.network.threads=2
# io线程数
num.io.threads=4
# 发送缓存大小
socket.send.buffer.bytes=10240
# 接收缓存大小
socket.receive.buffer.bytes=10240
# 最大请求
socket.request.max.bytes=1048576
# 分区数
num.partitions=1
# zookeeper的地址
zookeeper.connect=172.18.0.2:2181
# 允许容器监听
ALLOW_PLAINTEXT_LISTENER=yes
📁 节点3配置文件 (server.properties)
# broker id
broker.id=3
# 监听地址
listeners=PLAINTEXT://node3:9093
advertised.listeners=PLAINTEXT://node3:9093
# 发送响应的线程数
num.network.threads=2
# io线程数
num.io.threads=4
# 发送缓存大小
socket.send.buffer.bytes=10240
# 接收缓存大小
socket.receive.buffer.bytes=10240
# 最大请求
socket.request.max.bytes=1048576
# 分区数
num.partitions=1
# zookeeper的地址
zookeeper.connect=172.18.0.2:2181
# 允许容器监听
ALLOW_PLAINTEXT_LISTENER=yes
📁 Hosts文件配置
127.0.0.1 localhost
172.18.0.3 node1
172.18.0.4 node2
172.18.0.5 node3
注意: 请严格按照zookeeper、node1、node2、node3的顺序启动容器,因为只有这样根据子网分配IP的规律上面的hosts文件各个节点的IP才对。如果子网IP不一样请修改。
运行容器
1. 启动Zookeeper
docker run -itd --name zookeeper-server -p 12181:2181 \
--net knet -e ALLOW_ANONYMOUS_LOGIN=yes bitnami/zookeeper:latest
2. 启动Kafka节点1
docker run -itd --name kafka-node1 --net knet -p 19091:9091 \
-v /home/docker/kafka/config/node1:/bitnami/kafka/config \
-v /home/docker/kafka/etc/hosts:/etc/hosts \
-e ALLOW_PLAINTEXT_LISTENER=yes bitnami/kafka
3. 启动Kafka节点2
docker run -itd --name kafka-node2 --net knet -p 19092:9092 \
-v /home/docker/kafka/config/node2:/bitnami/kafka/config \
-v /home/docker/kafka/etc/hosts:/etc/hosts \
-e ALLOW_PLAINTEXT_LISTENER=yes bitnami/kafka
4. 启动Kafka节点3
docker run -itd --name kafka-node3 --net knet -p 19093:9093 \
-v /home/docker/kafka/config/node3:/bitnami/kafka/config \
-v /home/docker/kafka/etc/hosts:/etc/hosts \
-e ALLOW_PLAINTEXT_LISTENER=yes bitnami/kafka
参数说明
| 参数 | 说明 |
|---|---|
-e ALLOW_PLAINTEXT_LISTENER | 允许使用PLAINTEXT侦听器 |
-e KAFKA_BROKER_ID | 集群的broker的ID,该ID是集群的唯一标识 |
-e KAFKA_CFG_ZOOKEEPER_CONNECT | Zookeeper的连接地址 |
-e KAFKA_CFG_ADVERTISED_LISTENERS | Kafka发布到zookeeper供客户端使用的服务地址 |
-e TZ | 指定时区,这里指定亚洲上海时区,也就是东八区 |
集群测试
1. 检查容器状态
docker ps -a
2. 检查网络配置
docker network inspect knet
期望结果示例:
{
"Name": "knet",
"Id": "8dce5a7c2286dc412779f2eccc6da2ab48e84fd742df3466fe4f18fdc9b90556",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Containers": {
"kafka-node3": {
"Name": "kafka-node3",
"IPv4Address": "172.18.0.5/16"
},
"kafka-node2": {
"Name": "kafka-node2",
"IPv4Address": "172.18.0.4/16"
},
"kafka-node1": {
"Name": "kafka-node1",
"IPv4Address": "172.18.0.3/16"
},
"zookeeper-server": {
"Name": "zookeeper-server",
"IPv4Address": "172.18.0.2/16"
}
}
}
3. 创建主题测试
进入Node1容器:
docker exec -it kafka-node1 /bin/bash
cd /opt/bitnami/kafka/bin/
创建主题:
./kafka-topics.sh --create --topic demo1 --bootstrap-server node1:9091
# 或者
./kafka-topics.sh --create --topic demo1 --bootstrap-server 127.0.0.1:9091
期望结果:
Created topic demo1.
4. 消息发送测试
./kafka-console-producer.sh --topic demo1 --bootstrap-server node1:9091
5. 消息接收测试
进入Node2容器:
docker exec -it kafka-node2 /bin/bash
cd /opt/bitnami/kafka/bin
接收消息:
./kafka-console-consumer.sh --topic demo1 --from-beginning --bootstrap-server node2:9092
Kafka管理平台
启动管理平台
docker run -it -d --rm -p 9000:9000 \
--net knet -v /home/docker/kafka/hosts:/etc/hosts \
-e ZK_HOSTS="172.18.0.2:2181" sheepkiller/kafka-manager
访问管理界面
- 访问地址: http://192.168.31.200:9000
- IP需要替换为本机实际IP地址
单节点搭建
简单方式(无自定义网络)
# 启动Zookeeper
docker run -itd --name zookeeper-server -p 12181:2181 \
-e ALLOW_ANONYMOUS_LOGIN=yes bitnami/zookeeper:latest
# 启动Kafka
docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 \
-e ALLOW_PLAINTEXT_LISTENER=yes \
-e KAFKA_CFG_ZOOKEEPER_CONNECT=192.168.222.100:2181 \
-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.222.100:9092 \
-e TZ="Asia/Shanghai" bitnami/kafka:latest
使用子网搭建单节点
# 1. 创建网络
docker network create knet
# 2. 启动Zookeeper
docker run -itd --name zookeeper-server -p 12181:2181 \
--net knet -e ALLOW_ANONYMOUS_LOGIN=yes bitnami/zookeeper:latest
# 3. 启动Kafka
docker run -d --name kafka -p 9092:9092 --net knet \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=zookeeper-server:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.3.107:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-t wurstmeister/kafka
实际验证命令
集群验证(服务器:192.168.1.100)
# Zookeeper
docker run -itd --name zookeeper-server -p 12181:2181 \
--net knet -e ALLOW_ANONYMOUS_LOGIN=yes bitnami/zookeeper:latest
# Kafka Node1
docker run -itd --name kafka-node1 --net knet -p 19091:9091 \
-v /u1/docker/kafka/node1:/opt/bitnami/kafka/config \
-v /u1/docker/kafka/hosts:/etc/hosts \
-e ALLOW_PLAINTEXT_LISTENER=yes bitnami/kafka
# Kafka Node2
docker run -itd --name kafka-node2 --net knet -p 19092:9092 \
-v /u1/docker/kafka/node2:/opt/bitnami/kafka/config \
-v /u1/docker/kafka/hosts:/etc/hosts \
-e ALLOW_PLAINTEXT_LISTENER=yes bitnami/kafka
# Kafka Node3
docker run -itd --name kafka-node3 --net knet -p 19093:9093 \
-v /u1/docker/kafka/node3:/opt/bitnami/kafka/config \
-v /u1/docker/kafka/hosts:/etc/hosts \
-e ALLOW_PLAINTEXT_LISTENER=yes bitnami/kafka
# Kafka Manager
docker run -it -d --rm -p 9000:9000 --net knet \
-v /u1/docker/kafka/hosts:/etc/hosts \
-e ZK_HOSTS="172.18.0.2:2181" sheepkiller/kafka-manager
单节点验证(服务器:192.168.1.100)
# Zookeeper
docker run -itd --name zookeeper-server -p 12181:2181 \
-e ALLOW_ANONYMOUS_LOGIN=yes bitnami/zookeeper:latest
# Kafka
docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=192.168.1.100:12181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.100:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-t wurstmeister/kafka
故障排除
常见问题
- 连接问题: 如果遇到各种连接问题,那就是IP配置的问题,就是在监听的配置上有问题。
- 启动顺序: 必须严格按照zookeeper、node1、node2、node3的顺序启动容器。
- IP分配: 确保Hosts文件中的IP地址与实际容器IP一致。
调试命令
- 查看容器日志:
docker logs [container_name] - 进入容器调试:
docker exec -it [container_name] /bin/bash - 检查网络配置:
docker network inspect knet - 查看容器IP:
docker inspect [container_name] | grep IPAddress
🎯 总结
至此,Kafka集群搭建完成。通过本指南,您可以:
- 搭建包含3个broker的Kafka集群
- 配置Kafka管理界面进行集群监控
- 测试集群的消息收发功能
- 掌握单节点和集群两种搭建方式
如遇到问题,请检查网络配置和启动顺序。
251

被折叠的 条评论
为什么被折叠?



