【Kafka】-1.基于docker、docker compose环境搭建

678 阅读5分钟

Kafka 基于docker、docker compose环境搭建

前提

若网络不通,可以看防火墙是否关闭,还不行,可以尝试重启网络一下

#重启网卡
systemctl restart network 

#关闭防火墙
systemctl status firewalld.service  //查看防火墙
systemctl stop firewalld.service    //临时关闭防火墙
systemctl disable firewalld.service //永久关闭防火墙

1.docker方式

网络结构如下:

image-20220702105852917

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进行部署,比较麻烦,使用编排方式,可以把配置好的流程写到一个配置文件中,然后按照配置文件配置的流程进行启动,从而达到一次启动,多个应用依次启动的效果

网络结果如下:

image-20220702112433497

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