centos7-利用docker-compose搭建kafka集群 _

集群配置信息

IP 实例名
192.168.12.136 kafka1
192.168.12.137 kafka2
192.168.12.138 kafka3

创建zookeeper集群

有些教程是一个docker-compose文件同时创建zookeeper和kafka实例,本教程未按此方式操作。先安装zookeeper集群,再安装kafka集群。zookeeper集群安装过程按照下面链接方式进行安装。(据说新版本不需要再依赖zookeeper集群,未试过)

centos7-利用docker-compose搭建zookeeper集群

防火墙设置

3台集群服务器分别开放9092、9093、9094端口号(端口号可自定义)。

#开放客户端连接kafka服务端的端口号
firewall-cmd --zone=public --add-port=9092/tcp --permanent
firewall-cmd --zone=public --add-port=9093/tcp --permanent
firewall-cmd --zone=public --add-port=9094/tcp --permanent

#重新加载防火墙规则
firewall-cmd --reload

#查看已开放的端口
firewall-cmd --zone=public --list-ports

image

image

配置主机名映射

kafka节点之间通过主机名通信,为了让集群中的每台服务器能够识别其他服务器的主机名,需要在每台集群服务器的/etc/hosts文件中添加以下内容,将IP地址与实例名进行映射
3台集群服务器分别按照如下命令配置主机名映射。

vi /etc/hosts
192.168.12.136 zoo1 kafka1
192.168.12.137 zoo1 kafka2
192.168.12.138 zoo1 kafka3

image

image

image

创建工作目录

在每台集群服务器上创建一个用于存放kafka数据和配置的目录。

mkdir -p /opt/kafka/{data,dockerfile}

注意:需要对目录添加权限,否则创建主题的时候可能会报错,日志显示以下信息:“command [/usr/local/bin/dub path /var/lib/kafka/data writable] FAILED !”

chmod -R 777 /opt/kafka/data

image
image
image

创建docker-compose.yml文件

在每台集群服务器上的 /opt/kafka/dockerfile目录下创建 docker-compose.yml文件

cd /opt/kafka/dockerfile
vi docker-compose.yml

3台集群服务器上的kafka.yml文件配置内容如下

注意:

  1. 将每个kafka实例中KAFKA_ADVERTISED_LISTENERS对应值中的IP地址换成公网IP地址或虚拟机IP地址。
  2. kafka的docker镜像有多种可供选择,例如wurstmeister/kafka、confluentinc/cp-kafka、bitnami/kafka。在生产环境中使用时,建议使用confluentinc/cp-kafka。(更换镜像源时其它配置可能需要做改动)
  3. network_mode和hostname不能同时指定,若指定hostname,则额外需要配置其它信息。
  4. 若指定network_mode:host,则不能再指定ports选项

192.168.12.136

services:
  k1:
    image: confluentinc/cp-kafka:latest
    restart: always
    container_name: k1
    network_mode: host
    environment:
      - KAFKA_BROKER_ID=1
      - KAFKA_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2181,zoo3:2181
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka1:9092
      - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=3
    volumes:
      - /opt/kafka/data:/var/lib/kafka/data

192.168.12.137

services:
  k2:
    image: confluentinc/cp-kafka:latest
    restart: always
    container_name: k2
    network_mode: host
    environment:
      - KAFKA_BROKER_ID=2
      - KAFKA_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2181,zoo3:2181
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka2:9093
      - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=3
    volumes:
      - /opt/kafka/data:/var/lib/kafka/data

192.168.12.138

services:
  k3:
    image: confluentinc/cp-kafka:latest
    restart: always
    container_name: k3
    network_mode: host
    environment:
      - KAFKA_BROKER_ID=3
      - KAFKA_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2181,zoo3:2181
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka3:9094
      - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=3
    volumes:
      - /opt/kafka/data:/var/lib/kafka/data

image
image
image

构建kafka容器

分别在三台集群机器的/opt/kafka/dockerfile目录下执行以下命令,开启kafka集群。

docker-compose up -d

注意:可能会遇到如下问题,原因你懂的,要么FQ,要么采取其它方式解决(网上说配置/etc/docker/daemon.json文件,添加镜像源配置,但是大部分的镜像源是有问题的,即使配置了也不一定有用)

image

安装成功之后如下所示

image
image
image

创建topic

选择一台集群机器创建topic,这里选择kafka1。即192.168.12.136的机器。

docker exec -it k1 kafka-topics --create --topic test_topic --bootstrap-server 192.168.12.136:9092,192.168.12.137:9093,192.168.12.138:9094 --replication-factor 3 --partitions 1

执行命令之后如下所示:

image

这里有一个警告:大致意思是告诉你创建kafka主题的时候,如果主题名称包含点号('.')或下划线('_'),可能会导致 metrics 名称冲突。‌这是因为Kafka在创建主题时会对主题名称进行解析,并生成相应的metrics名称,如果主题名称中包含点号或下划线,可能会导致metrics名称不符合规范,从而引发警告。为了避免这个问题,建议在创建Kafka主题时避免使用点号和下划线。可以选择使用其他字符或符号来替代这些特殊字符,以确保metrics名称的唯一性和规范性。例如,可以使用短横线('-')或其他不会引发冲突的字符来命名主题‌

Due to limitations in metric names, topics with a period ('.') or underscore ('_') could collide. To avoid issues it is best to use either, but not both.

注意:可能第一次执行的时候会提示“eplication factor: 3 larger than available brokers: 2”,说明有1个机器有问题,这个时候查看3台服务器容器日志,发现第2台服务器日志有1条错误数据,显示“Connection to kafka3:9092 (id: 3 rack: null) failed”,但是另外2台服务器没有,3台服务器的kafka容器状态也是Up,于是重新在kafka1机器上重新再执行创建主题命令,此时成功了,原因尚未知。

查看topic列表

3台集群机器分别进入kafka容器内部,查看是否存在刚创建的topic,如果存在则说明Kafka集群搭建成功。

docker exec -it k1 kafka-topics --list --bootstrap-server 192.168.12.136:9092,192.168.12.137:9093,192.168.12.138:9094

image

docker exec -it k2 kafka-topics --list --bootstrap-server 192.168.12.136:9092,192.168.12.137:9093,192.168.12.138:9094

image

docker exec -it k3 kafka-topics --list --bootstrap-server 192.168.12.136:9092,192.168.12.137:9093,192.168.12.138:9094

image

至此kafka集群搭建成功。

配置kafka-manager

  1. 3台集群服务器分别执行如下命令用来创建目录。
mkdir -p /opt/kafka-manager/dockerfile
  1. 在每台集群服务器上的 /opt/kafka-manager/dockerfile 目录下创建 docker-compose.yml文件。
cd /opt/kafka-manager/dockerfile
vi docker-compose.yml
  1. 3台集群服务器上的docker-compose.yml文件配置内容如下
services:
  kafka-manager:
    image: hlebalbau/kafka-manager:latest
    restart: always
    container_name: kafka-manager
    network_mode: host
    environment:
      ZK_HOSTS: zoo1:2181,zoo2:2181,zoo3:2181
      KAFKA_BROKERS: kafka1:9092,kafka2:9093,kafka3:9094
      APPLICATION_SECRET: $(openssl rand -base64 32)
      KM_ARGS: -Djava.net.preferIPv4Stack=true
  1. 3台集群服务器根据上一步创建的docker-compose.yml文件分别执行以下命令启动服务。
docker-compose up -d

image
image
image

kafka-manager配置Cluster信息

  1. master节点通过虚拟机IP+9000端口访问Kafka Manager。

http://192.168.12.136:9000/

image

注意:如果宿主机访问不了网址,先检查能不能通过ip地址ping通,如果能ping通则大概率是端口问题,可能是因为9000端口未开放,在master机器(192.168.12.136)上开放端口即可。

firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --reload

找到“Cluster”选项列表下的Add Cluster选项并点击。

image

此时跳转到Add Cluster界面。

image

分别输入以下信息:

Cluster Name:集群节点名称。

Cluster Zookeeper Hosts:按照格式输入即可

其它信息保持默认即可,然后点击底下的Save按钮。

image

添加之后界面

image

回到Clusters List界面。

image

点击刚创建的TestKafkaCluster,进入TestKafkaCluster详情界面。

image

点击“Topics”

image

点击“Brokers”

image

在Cluster下创建Topic

image

输入Topic和Partitions值,点击Create按钮。

image

添加之后,Topic由之前的2变为3

image

进入Topic列表可以看到刚创建的test信息。

image

点击test详情页面

image

image

posted @ 2025-06-03 15:51  相遇就是有缘  阅读(179)  评论(0)    收藏  举报