搭建 Kafka 集群
使用 Docker Compose 搭建 Kafka 集群。
创建 Docker Compose 配置文件
创建配置文件(目录随意)并编辑:
vim /opt/kafka/docker-compose.yml
输入内容:
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- 2181:2181
kafka1:
image: wurstmeister/kafka:2.11-0.11.0.3
depends_on:
- zookeeper
ports:
- 9093:9093
environment:
# 广播主机名称
KAFKA_ADVERTISED_HOST_NAME: kafka1
# Zookeeper 连接地址,格式:zoo1:port1, zoo2:port2:/path
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
# Kafka 启动所使用的的协议及端口
KAFKA_LISTENERS: PLAINTEXT://:9093
# Kafka 广播地址及端口(客户端连接使用),由于映射到了主机的 9093 端口,所以填写 主机IP:端口
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://172.16.0.1:9093
# 指定BrokerId,如果不指定,将会自己生成(从 0 开始)
KAFKA_BROKER_ID: 1
volumes:
- /var/run/docker.sock:/var/run/docker.sock
kafka2:
image: wurstmeister/kafka:2.11-0.11.0.3
depends_on:
- zookeeper
ports:
- 9094:9094
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka2
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: PLAINTEXT://:9094
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://172.16.0.1:9094
KAFKA_BROKER_ID: 2
volumes:
- /var/run/docker.sock:/var/run/docker.sock
kafka3:
image: wurstmeister/kafka:2.11-0.11.0.3
depends_on:
- zookeeper
ports:
- 9095:9095
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka3
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: PLAINTEXT://:9095
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://172.16.0.1:9095
KAFKA_BROKER_ID: 3
volumes:
- /var/run/docker.sock:/var/run/docker.sock
172.16.0.1 是我们给 WSL 配置的固定 IP。
启动集群
yml 文件里面配置了 3 个 Kafka 的集群,我们直接启动:
docker-compose -f /opt/kafka/docker-compose.yml up -d
查看集群状态:docker-compose ps
删除集群:docker-compose down
Kafka 启动失败
使用命令 docker ps -a
查看容器状态,发现只有 Zookeeper 启动成功,Kafka 全部失败。
使用命令 docker logs --tail 100 kafka_kafka_1
查看启动日志发现报错:
org.I0Itec.zkclient.exception.ZkException: Unable to connect to zookeeper:2181 Caused by:
java.net.UnknownHostException: zookeeper: Name does not resolve
经查询发现是由于 Ubuntu 域名解析出错,导致 Kafka 找不到 Zookeeper 而启动失败,执行以下命令:
echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf
重新启动集群即可。
Kafka 操作
以特权模式进入 Kafka 容器:
docker exec -it --privileged kafka_kafka1_1 bash
进入 bin 目录:
cd /opt/kafka_2.11-0.11.0.3/bin/
创建一个名为 first 的主题,该主题有两个分区,每个分区有两个副本:
kafka-topics.sh -zookeeper kafka_zookeeper_1 --create --topic first --partitions 2 --replication-factor 2
列出主题:--list
主题详情:--describe
删除主题:--delete
启动生产者进程:
kafka-console-producer.sh --topic first --broker-list 172.16.0.1:9092
启动消费者进程:
kafka-console-consumer.sh --topic first -zookeeper 172.16.0.1:2181
在生产者中发送消息,消费者就会进行消费。
发送消息报错
如果生产者发送消息没有响应,超时报错:
WARN Connection to node -1 could not be established. Broker may not be available.
一般是 Kafka 配置文件 server.properties 中 KAFKA_LISTENERS
和 KAFKA_ADVERTISED_LISTENERS
的 IP 不对,由于每次重启电脑后,WSL 的 IP 都会改变,所以笔者给 WSL 添加了一个固定 IP 172.16.0.1,做成开机启动 bat 脚本自动添加,有时候没有添加上,导致了这个问题。
参考
使用 docker 或者 docker-compose 部署 Zookeeper 集群
Why does the host command not resolve entries in /etc/hosts?