Kafka 基于docker、docker compose环境搭建
前提
若网络不通,可以看防火墙是否关闭,还不行,可以尝试重启网络一下
#重启网卡
systemctl restart network
#关闭防火墙
systemctl status firewalld.service //查看防火墙
systemctl stop firewalld.service //临时关闭防火墙
systemctl disable firewalld.service //永久关闭防火墙
1.docker方式
网络结构如下:
1.1 安装zookeeper
1.下载镜像
docker pull zookeeper:3.4.10
2.通过镜像启动一个容器
docker run -p 2181:2181 --name my_zook -d zookeeper:3.4.10
3.进入容器
docker exec -it my_zook /bin/bash
注意:
1.通过docker下载下来的,可能conf文件夹是空的,而通过官网下载的xxx.gz的zookeeper是有配置sample.cfg文件的
4.增加配置信息
#1.在zoo根目录里创建两个目录
bash-4.3# pwd
/zookeeper-3.4.10
bash-4.3# mkdir zkData
bash-4.3# mkdir zkLogs
#2.回退到上一级,进入conf,创建配置文件zoo.cfg,写入如下信息
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/zookeeper-3.4.10/zkData
clientPort=2181
dataLogDir=/zookeeper-3.4.10/zkLogs
5.启动
//启动
bash-4.3# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Starting zookeeper ... STARTED
//查看状态
bash-4.3# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Mode: standalone
bash-4.3#
//通过docker查看启动日志
docker logs -f my_zook
Zookeeper中的配置文件zoo.cfg中参数含义解读如下:
1.tickTime =2000:通信心跳数,Zookeeper服务器与客户端心跳时间,单位毫秒
Zookeeper使用的基本时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳,时间单位为毫秒。
它用于心跳机制,并且设置最小的session超时时间为两倍心跳时间。(session的最小超时时间是2*tickTime)
2.initLimit =10:LF初始通信时限
集群中的Follower跟随者服务器与Leader领导者服务器之间初始连接时能容忍的最多心跳数(tickTime的数量)。当超过设置倍数的 tickTime 时间,则连接失败。
因为若集群多了后,初始化时间可能有些长,所以initLimit 比syncLimit 默认长,若跟随者与领导者初始化时间超过了规定时间,那么领导者便会宣布放弃领导地位,进行另一次的领导选举。
3.syncLimit =5:LF同步通信时限
集群中Leader与Follower之间的最大响应时间单位,假如响应超过syncLimit * tickTime,Leader认为Follwer死掉,从服务器列表中删除Follwer。即如果 follower 在设置的时间内不能与leader 进行通信,那么此 follower 将被丢弃。所有关联到这个跟随者的客户端将连接到另外一个跟随着。
4.dataDir:数据文件目录+数据持久化路径
主要用于保存Zookeeper中的数据。
5.clientPort =2181:客户端连接端口
监听客户端连接的端口。
注意:以上配置是以前草稿里记录的,可能记录不全或者有误,只是做个记录而已,涉及到多个搭建,还是用下面编排方便一些
1.2 安装KAFKA
1.下载镜像
docker pull wurstmeister/kafka:2.11-0.11.0.3
2.启动kafka集群
VM01:
docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.232.140:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.232.140:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka:2.11-0.11.0.3
VM02:
docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=192.168.232.141:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.232.141:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka:2.11-0.11.0.3
VM03:
docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=2 -e KAFKA_ZOOKEEPER_CONNECT=192.168.232.142:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.232.142:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka:2.11-0.11.0.3
参数说明:
-e KAFKA_BROKER_ID=0 在kafka集群中,每个kafka都有一个BROKER_ID来区分自己
-e KAFKA_ZOOKEEPER_CONNECT=192.168.139.187:2181/kafka 将配置中 KAFKA_ZOOKEEPER_CONNECT的zookeeper的端口设置为外网ip,因为127.0.0.1或0.0.0.0相对kafka镜像来说是自己的镜像内部的内部ip,docker镜像外部无法访问。
-e KAFKA_LISTENERS=PLAINTEXT://:9092 配置kafka的监听端口 就是主要用来定义Kafka Broker的Listener的配置项。 是kafka真正bind的地址
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.139.187:9092 参数的作用就是将Broker的Listener信息发布到Zookeeper中 是暴露给外部的listeners,如果没有设置,会用listeners
3.进入容器
docker exec -it kafka /bin/bash
4.创建一个topic(分区2个,副本2个)
kafka-topics.sh --zookeeper 192.168.232.140:2181 --create --replication-factor 2 --partitions 2 --topic first
5.查询topic
kafka-topics.sh --list --zookeeper 192.168.232.140:2181
2.docker-compose方式
上面第一种每个若有多个应用,就需要进行多次docker进行部署,比较麻烦,使用编排方式,可以把配置好的流程写到一个配置文件中,然后按照配置文件配置的流程进行启动,从而达到一次启动,多个应用依次启动的效果
网络结果如下:
1.随便进入一个自己指定的目录,然后在这个目录里增加一个配置文件docker-compose.yaml
version: '3.3'
services:
mysql:
container_name: mysql
image: mysql:5.7
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: "123456"
volumes:
- /opt/module/mysql/data:/var/lib/mysql
zook:
image: wurstmeister/zookeeper
ports:
- 2181:2181
container_name: zook
kafka0:
image: wurstmeister/kafka
depends_on:
- zook
container_name: kafka0
ports:
- 9092:9092
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.44.130:9092
KAFKA_LISTENERS: PLAINTEXT://kafka0:9092
KAFKA_ZOOKEEPER_CONNECT: zook:2181
KAFKA_BROKER_ID: 0
KAFKA_NUM_PARTITIONS: 2
KAFKA_DEFAULT_REPLICATION_FACTOR: 2
volumes:
- /root/data/kafka0/data:/data
- /root/data/kafka0/log:/datalog
kafka1:
image: wurstmeister/kafka
depends_on:
- zook
container_name: kafka1
ports:
- 9093:9093
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.44.130:9093
KAFKA_LISTENERS: PLAINTEXT://kafka1:9093
KAFKA_ZOOKEEPER_CONNECT: zook:2181
KAFKA_BROKER_ID: 1
KAFKA_NUM_PARTITIONS: 3
KAFKA_DEFAULT_REPLICATION_FACTOR: 2
volumes:
- /root/data/kafka1/data:/data
- /root/data/kafka1/log:/datalog
kafka2:
image: wurstmeister/kafka
depends_on:
- zook
container_name: kafka2
ports:
- 9094:9094
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.44.130:9094
KAFKA_LISTENERS: PLAINTEXT://kafka2:9094
KAFKA_ZOOKEEPER_CONNECT: zook:2181
KAFKA_BROKER_ID: 2
volumes:
- /root/data/kafka2/data:/data
- /root/data/kafka2/log:/datalog
参数说明:
1.KAFKA_ADVERTISED_LISTENERS:配置成自己物理主机的IP,这样虚拟机外部的应用就能正常访问虚拟机内部的容器应用
2.KAFKA_LISTENERS:这个是kafka每个brocker真正的IP地址
3.KAFKA_ZOOKEEPER_CONNECT:这个是每个brocker需要连接到zookeeper的地址信息
2.创建并启动容器
docker-compose -f docker-compose.yaml up -d
3.进入容器,开始创建一个topic并发送消息,并创建一个生产者,用于发送消息
docker exec -it kafka0 bash
kafka-topics.sh --zookeeper zook:2181 --create --replication-factor 2 --partitions 2 --topic testTopic
kafka-console-producer.sh --broker-list kafka0:9092 --topic testTopic
4.创建消费者,用于接收
docker exec -it kafka1 bash
kafka-console-consumer.sh --bootstrap-server kafka2:9094 --topic testTopic --from-beginning
其他常用命令
1.docker
1. 删除容器
docker ps #查看正在运行的容器
docker ps -a #查看所有容器
docker rm container_id #删除容器
2. 删除镜像
docker images //查看镜像
docker rmi image_id
3.删除网络
docker network rm 16046abbbdf2
4.查看网络
docker network ls
5.查看容器网络
docker inspect 1a92267060a4
2.compose
#1.查看进程
docker-compose ps
#2.查看端口是否正常
netstat -lnpt
3.关闭并移除
docker-compose -f docker-compose.yaml down
4.启动
docker-compose -f docker-compose.yaml up -d