搭建 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_LISTENERSKAFKA_ADVERTISED_LISTENERS 的 IP 不对,由于每次重启电脑后,WSL 的 IP 都会改变,所以笔者给 WSL 添加了一个固定 IP 172.16.0.1,做成开机启动 bat 脚本自动添加,有时候没有添加上,导致了这个问题。

参考

使用 docker 或者 docker-compose 部署 Zookeeper 集群

如果你不会用 kafka-docker,看这里

Why does the host command not resolve entries in /etc/hosts?

How to replace mdns4_minimal with BIND?

mdns4_minimal 是什么

posted @ 2021-10-23 11:14  ageovb  阅读(206)  评论(0编辑  收藏  举报