KAFKA集群 和kafka-ui docker-compose 一键安装
1.docker-compose 安装
pip install docker-compose
2.docker-compose 安装 kafka集群
- 在
/data/docker-compose/
中新建docker-compose.yml
文件。 - 其中
110.41.70.109
改为自己的虚拟机ip。 - kafka-ui 为可视化kafka页面。通过
ip:8989
进行访问。 (ip是自己虚拟机的ip,我这里的就是110.41.70.109:8989
) 下面同理。 - 这里不需要Zookeeper。
- portainer是docker-compose 可视化页面(可视化真的太好用了)。可以看容器内的日志,这个重定向的kafka日志一直有问题,显示乱码,这个页面可以正常浏览。通过
ip:9000
访问。 - 内存在2g及以下不建议安装集群,直接跳转到最后,参考那个单个kafka的docker-compose.yml。
version:"3"services:#kafka可视化工具kafka-ui:container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:- 8989:8080depends_on:- kafka1
- kafka2
- kafka3
environment:- KAFKA_CLUSTERS_0_NAME=kafkaCluster
- KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=110.41.70.109:9192,110.41.70.109:9292,110.41.70.109:9392- DYNAMIC_CONFIG_ENABLED=true
networks:- mynetwork
# kafka集群kafka1:image:'bitnami/kafka:3.3.1'container_name: kafka1
user: root
ports:- 9192:9092- 9193:9093environment:### 通用配置# 允许使用kraft,即Kafka替代Zookeeper- KAFKA_ENABLE_KRAFT=yes
# kafka角色,做broker,也要做controller- KAFKA_CFG_PROCESS_ROLES=broker,controller
# 指定供外部使用的控制类请求信息- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
# 定义kafka服务端socket监听端口- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093# 定义安全协议- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
# 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可- KAFKA_KRAFT_CLUSTER_ID=LelM2dIFQkiUFvXCEcqRWA
# 集群地址- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093# 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用- ALLOW_PLAINTEXT_LISTENER=yes
# 设置broker最大内存,和初始内存- KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
# 允许自动创建主题- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
# 消息保留时长(毫秒),保留7天- KAFKA_LOG_RETENTION_MS=604800000
### broker配置# 定义外网访问地址(宿主机ip地址和端口)- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://110.41.70.109:9192# broker.id,必须唯一- KAFKA_BROKER_ID=1
volumes:- /data/bitnami/kafka1:/bitnami/kafka
networks:- mynetwork
kafka2:image:'bitnami/kafka:3.3.1'container_name: kafka2
user: root
ports:- 9292:9092- 9293:9093environment:### 通用配置# 允许使用kraft,即Kafka替代Zookeeper- KAFKA_ENABLE_KRAFT=yes
# kafka角色,做broker,也要做controller- KAFKA_CFG_PROCESS_ROLES=broker,controller
# 指定供外部使用的控制类请求信息- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
# 定义kafka服务端socket监听端口- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093# 定义安全协议- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
# 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可- KAFKA_KRAFT_CLUSTER_ID=LelM2dIFQkiUFvXCEcqRWA
# 集群地址- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093# 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用- ALLOW_PLAINTEXT_LISTENER=yes
# 设置broker最大内存,和初始内存- KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
# 允许自动创建主题- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
# 消息保留时长(毫秒),保留7天- KAFKA_LOG_RETENTION_MS=604800000
### broker配置# 定义外网访问地址(宿主机ip地址和端口)- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://110.41.70.109:9292# broker.id,必须唯一- KAFKA_BROKER_ID=2
volumes:- /data/bitnami/kafka2:/bitnami/kafka
networks:- mynetwork
kafka3:image:'bitnami/kafka:3.3.1'container_name: kafka3
user: root
ports:- 9392:9092- 9393:9093environment:### 通用配置# 允许使用kraft,即Kafka替代Zookeeper- KAFKA_ENABLE_KRAFT=yes
# kafka角色,做broker,也要做controller- KAFKA_CFG_PROCESS_ROLES=broker,controller
# 指定供外部使用的控制类请求信息- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
# 定义kafka服务端socket监听端口- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093# 定义安全协议- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
# 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可- KAFKA_KRAFT_CLUSTER_ID=LelM2dIFQkiUFvXCEcqRWA
# 集群地址- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093# 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用- ALLOW_PLAINTEXT_LISTENER=yes
# 设置broker最大内存,和初始内存- KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
# 允许自动创建主题- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
# 消息保留时长(毫秒),保留7天- KAFKA_LOG_RETENTION_MS=604800000
### broker配置# 定义外网访问地址(宿主机ip地址和端口)- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://110.41.70.109:9392# broker.id,必须唯一- KAFKA_BROKER_ID=3
volumes:- /data/bitnami/kafka3:/bitnami/kafka
networks:- mynetwork
portainer:container_name: portainer
ports:- 9000:9000restart: always
volumes:- /etc/localtime:/etc/localtime
- /var/run/docker.sock:/var/run/docker.sock
- /home/mycontainers/portainer/data:/data:rw
image: portainer/portainer
networks:- mynetwork
networks:mynetwork:driver: bridge
2.启动
- 配置国内镜像
sudo vi /etc/docker/daemon.json
- daemon.json
{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn","http://hub-mirror.c.163.com"],"max-concurrent-downloads":10,"log-driver":"json-file","log-level":"warn","log-opts":{"max-size":"10m","max-file":"3"},"data-root":"/var/lib/docker"}
- 切到目录
/data/docker-compose/
。docker-compose up -d
- 接着等待下载,自动安装
- 完成后,
docker ps
查看kafka状态。 如有自动重启等问题,说明有问题。没有的话就安装完成了。
3. 添加一个topic
方法一:kafka-ui添加
在页面Topic中点击Add即可。如果kafka-ui显示为黄色或红色,且Broker和Topics点击后一直转圈,说明端口未开放。有防火墙将防火墙放开
9192,9292,9392
三个端口。云服务器则在安全组中的入方向规则 添加端口即可。
方法二:容器内添加
- 进入容器
docker exec -it kafka1 /bin/bash
- 创建主题 (test) (ip换成自己的虚拟机ip)
kafka-topics.sh --create --topic test --partitions 3 --replication-factor 3 --bootstrap-server 110.41.70.109:9192,110.41.70.109:9292,110.41.70.109:9392
4.查看topic
#查看所有Topic
kafka-topics.sh --list --bootstrap-server 110.41.70.109:9092
#查看topic详情
kafka-topics.sh --describe --bootstrap-server 110.41.70.109:9192
5.OpenJDK报错
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Not enough space' (errno=12)
遇到上面错误,执行以下命令。在容器内执行
dd if=/dev/zero of=swapfile bs=1024 count=1000000
mkswap swapfile
swapon swapfile
这样内存就不会不足了。
6. 3个KAFKA集群 运行一段时间变成两个了?
云服务器是2g的,一个kafka就占400m多,3个直接1.2g多,加上其他的,直接爆内存了,所以改成一个kafka了,2g内存跑3个kafka真的强人所难了,所以等有更大的内存了再来装KAFKA集群吧。
下面是新的docker-compose.yml。
注意:要将
/data/bitnami
情况,不然会保留之前的数据,导致无法正常启动。
version: "3"
services:
#kafka可视化工具
kafka-ui:
container_name: kafka-ui
image: provectuslabs/kafka-ui:latest
ports:
- 8989:8080
depends_on:
- kafka1
environment:
- KAFKA_CLUSTERS_0_NAME=kafkaCluster
- KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=110.41.70.109:9192
- DYNAMIC_CONFIG_ENABLED=true
networks:
- mynetwork
# kafka集群
kafka1:
image: 'bitnami/kafka:3.3.1'
container_name: kafka1
user: root
ports:
- 9192:9092
- 9193:9093
environment:
### 通用配置
# 允许使用kraft,即Kafka替代Zookeeper
- KAFKA_ENABLE_KRAFT=yes
# kafka角色,做broker,也要做controller
- KAFKA_CFG_PROCESS_ROLES=broker,controller
# 指定供外部使用的控制类请求信息
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
# 定义kafka服务端socket监听端口
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
# 定义安全协议
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
# 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可
- KAFKA_KRAFT_CLUSTER_ID=LelM2dIFQkiUFvXCEcqRWA
# 集群地址
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093
# 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用
- ALLOW_PLAINTEXT_LISTENER=yes
# 设置broker最大内存,和初始内存
- KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
# 允许自动创建主题
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true
# 消息保留时长(毫秒),保留7天
- KAFKA_LOG_RETENTION_MS=604800000
### broker配置
# 定义外网访问地址(宿主机ip地址和端口)
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://110.41.70.109:9192
# broker.id,必须唯一
- KAFKA_BROKER_ID=1
volumes:
- /data/bitnami/kafka1:/bitnami/kafka
networks:
- mynetwork
portainer:
container_name: portainer
ports:
- 9000:9000
restart: always
volumes:
- /etc/localtime:/etc/localtime
- /var/run/docker.sock:/var/run/docker.sock
- /home/mycontainers/portainer/data:/data:rw
image: portainer/portainer
networks:
- mynetwork
networks:
mynetwork:
driver: bridge
写在最后:
装了好久,希望能帮助上大家,kafka装起来太多坑了,网上找的照着装也会有各种各样的问题,所以这里写的算是比较详细了,之前的教程kafka-ui重定向了,没注意,一直用8080访问不到,重装了好几次,后面才发现。大家可以把docker-compose.yml配置文件好好看看。
版权归原作者 Altira 所有, 如有侵权,请联系我们删除。