• 【Docker安装部署Zookeeper+Kafka集群详细教程、部署过程中遇到问题&解决方案、测试集群是否部署成功】


    【Docker安装部署Zookeeper+Kafka集群详细教程】

    大部分人都是直接使用Docker-compose的方式直接部署,已经有很多了,这个地方我就不再用这样的方式实现啦,这篇文章我还是使用Docker命令的方式实现,如果Docker命令你能部署完成, 那么更简单直接的Docker-compose方式相信你也能完成。

    知识回顾:
    在学习【Docker安装部署Zookeeper+Kafka集群详细教程】之前,我们需要先去学习一下之前发布的文章,这里已经帮大家整理好了,首先就是【Docker安装部署Zookeeper集群】,再学习完这篇文章之后,接下来我们再来学习一下【Docker安装部署Kafka+Zookeeper详细教程】,好的,如果之前的你都掌握啦,那么接下来我们就一起来完成【Docker安装部署Zookeeper+Kafka集群详细教程】,因为kafka的部署是依赖zookeeper的,所以我们先来部署zookeeper,然后再部署我们的kafka。

    Zookeeper集群的搭建

    Docker拉取Zookeeper的镜像文件
    docker pull zookeeper
    
    • 1
    Docker创建 bridge 网络,创建自定义网络
    docker network create --driver bridge --subnet 172.18.0.0/16 zookeeper_network
    
    • 1
    查看已经存在的网络
    docker network ls
    
    • 1

    运行结果截图:
    在这里插入图片描述

    创建主节点挂载目录
    # 创建 zookeeper 主节点配置存放目录
    mkdir -p /mydata/zookeeper_kafka/master/conf
    # 创建 zookeeper 主节点数据存放目录
    mkdir -p /mydata/zookeeper_kafka/master/data
    # 创建 zookeeper 主节点数据日志存放目录
    mkdir -p /mydata/zookeeper_kafka/master/datalog
    # 创建 zookeeper 主节点日志存放目录
    mkdir -p /mydata/zookeeper_kafka/master/logs
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    创建从节点1挂载目录
    # 创建 zookeeper 节点1 配置存放目录
    mkdir -p /mydata/zookeeper_kafka/node1/conf
    # 创建 zookeeper 节点1 数据存放目录
    mkdir -p /mydata/zookeeper_kafka/node1/data
    # 创建 zookeeper 节点1 数据日志存放目录
    mkdir -p /mydata/zookeeper_kafka/node1/datalog
    # 创建 zookeeper 节点1 日志存放目录
    mkdir -p /mydata/zookeeper_kafka/node1/logs
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    创建从节点2挂载目录
    
    # 创建 zookeeper 节点2 配置存放目录
    mkdir -p /mydata/zookeeper_kafka/node2/conf
    # 创建 zookeeper 节点2 数据存放目录
    mkdir -p /mydata/zookeeper_kafka/node2/data
    # 创建 zookeeper 节点2 数据日志存放目录
    mkdir -p /mydata/zookeeper_kafka/node2/datalog
    # 创建 zookeeper 节点2 日志存放目录
    mkdir -p /mydata/zookeeper_kafka/node2/logs
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    运行结果截图:

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    创建主配置文件
    # zookeeper 主节点配置存放目录
    cd /mydata/zookeeper_kafka/master/conf
    # 编辑配置文件
    vim zoo.cfg
    
    • 1
    • 2
    • 3
    • 4
    创建从节点1配置文件
    # zookeeper 节点1 配置存放目录
    cd /mydata/zookeeper_kafka/node1/conf
    # 编辑配置文件
    vim zoo.cfg
    
    • 1
    • 2
    • 3
    • 4
    创建从节点2配置文件
    # zookeeper 节点2 配置存放目录
    cd /mydata/zookeeper_kafka/node2/conf
    # 编辑配置文件
    vim zoo.cfg
    
    • 1
    • 2
    • 3
    • 4

    补充:也可以直接使用cp命令,将文件复制拷贝到其他目录下:

    [root@VM-4-9-centos conf]# cp zoo.cfg /mydata/zookeeper_kafka/node1/conf 
    [root@VM-4-9-centos conf]# cp zoo.cfg /mydata/zookeeper_kafka/node2/conf 
    [root@VM-4-9-centos conf]# cd /mydata/zookeeper_kafka/node2/conf
    [root@VM-4-9-centos conf]# ls
    
    • 1
    • 2
    • 3
    • 4
    zoo.cfg配置文件中的内容
    # Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里
    dataDir=/data
    
    # 事物日志存储地点,如果没提供的话使用的则是 dataDir
    dataLogDir=/datalog
    
    # 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位
    tickTime=2000
    
    # 集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)
    initLimit=5
    
    # 集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)
    syncLimit=2
    
    # 默认值为3,不支持以系统属性方式配置。用于配置Zookeeper在自动清理的时候需要保留的快照数据文件数量和对应的事务日志文件。此参数的最小值为3,如果配置的值小于3会自动调整到3
    autopurge.snapRetainCount=3
    
    # 默认值为0,单位为小时,不支持以系统属性方式配置。用于配置Zookeeper进行历史文件自动清理的频率。如果配置为0或负数,表示不需要开启定时清理功能
    autopurge.purgeInterval=0
    
    # 默认为60,不支持以系统属性方式配置。从Socket层面限制单个客户端与单台服务器之间的并发连接数,即以ip地址来进行连接数的限制。
    # 如果设置为0,表示不做任何限制。仅仅是单台客户端与单个Zookeeper服务器连接数的限制,不能控制所有客户端的连接数总和
    maxClientCnxns=60
    
    # 3.5.0中的新功能:当设置为false时,可以在复制模式下启动单个服务器,单个参与者可以使用观察者运行,并且群集可以重新配置为一个节点,并且从一个节点。
    # 对于向后兼容性,默认值为true。可以使用QuorumPeerConfig的setStandaloneEnabled方法或通过将“standaloneEnabled = false”或“standaloneEnabled = true”添加到服务器的配置文件来设置它。
    standaloneEnabled=false
    
    # 内嵌的管理控制台,停用这个服务
    admin.enableServer=false
    
    # 开启四字命令,将所有命令添加到白名单中
    4lw.commands.whitelist=*
    
    # 集群中服务的列表
    server.1=172.18.0.6:2888:3888;2181
    server.2=172.18.0.7:2888:3888;2181
    server.3=172.18.0.8:2888:3888;2181
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    zoo.cfg配置文件中参数的说明解释说明
    tickTime=2000zookeeper里面最小的时间单位为2000ms
    initLimit=10Follower在启动过程中,会从Leader同步所有最新数据,然后确定自己能够对外服务的起始状态。Leader允许F在 initLimit 时间内完成这个工作。通常情况下,我们不用太在意这个参数的设置。如果ZK集群的数据量确实很大了,F在启动的时候,从Leader上同步数据的时间也会相应变长,因此在这种情况下,有必要适当调大这个参数了
    syncLimit=5在运行过程中,Leader负责与ZK集群中所有机器进行通信,例如通过一些心跳检测机制,来检测机器的存活状态。如果L发出心跳包在syncLimit之后,还没有从F那里收到响应,那么就认为这个F已经不在线了。注意:不要把这个参数设置得过大,否则可能会掩盖一些问题
    dataDir存储快照文件snapshot的目录。默认情况下,事务日志也会存储在这里。建议同时配置参数dataLogDir, 事务日志的写性能直接影响zk性能
    dataLogDir事务日志输出目录。尽量给事务日志的输出配置单独的磁盘或是挂载点,这将极大的提升ZK性能
    clientPort客户端连接server的端口,即对外服务端口 ,默认是2181
    server.1配置集群节点
    hadoop-node01:2888:3888主机名, 2888通信端口、3888选主端口
    集群模式启动-主节点启动
    # 启动命令
    docker run -d --restart always \
    --name zookeeper_kafka_master \
    --network zookeeper_network \
    --ip 172.18.0.6 \
    -p 2181:2181 \
    -e ZOO_MY_ID=1 \
    -v /mydata/zookeeper_kafka/master/conf/zoo.cfg:/conf/zoo.cfg \
    -v /mydata/zookeeper_kafka/master/data:/data \
    -v /mydata/zookeeper_kafka/master/datalog:/datalog \
    -v /mydata/zookeeper_kafka/master/logs:/logs \
    zookeeper
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    集群模式启动-从节点1启动
    # 启动命令
    docker run -d --restart always \
    --name zookeeper_kafka_node1 \
    --network zookeeper_network \
    --ip 172.18.0.7 \
    -p 2182:2181 \
    -e ZOO_MY_ID=2 \
    -v /mydata/zookeeper_kafka/node1/conf/zoo.cfg:/conf/zoo.cfg \
    -v /mydata/zookeeper_kafka/node1/data:/data \
    -v /mydata/zookeeper_kafka/node1/datalog:/datalog \
    -v /mydata/zookeeper_kafka/node1/logs:/logs \
    zookeeper
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    集群模式启动-从节点2启动
    # 启动命令
    docker run -d --restart always \
    --name zookeeper_kafka_node2 \
    --network zookeeper_network \
    --ip 172.18.0.8 \
    -p 2183:2181 \
    -e ZOO_MY_ID=3 \
    -v /mydata/zookeeper_kafka/node2/conf/zoo.cfg:/conf/zoo.cfg \
    -v /mydata/zookeeper_kafka/node2/data:/data \
    -v /mydata/zookeeper_kafka/node2/datalog:/datalog \
    -v /mydata/zookeeper_kafka/node2/logs:/logs \
    zookeeper
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    查看集群启动的状态
    # 在容器 zookeeper-master 中开启一个交互模式的终端
    docker exec -it zookeeper_kafka_master /bin/bash
    
    # 查看 zookeeper 状态
    cd bin
    zkServer.sh status
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    # 在容器 zookeeper-master 中开启一个交互模式的终端
    docker exec -it zookeeper_kafka_node1 /bin/bash
    
    # 查看 zookeeper 状态
    cd bin
    zkServer.sh status
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    # 在容器 zookeeper-master 中开启一个交互模式的终端
    docker exec -it zookeeper_kafka_node2 /bin/bash
    
    # 查看 zookeeper 状态
    cd bin
    zkServer.sh status
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    好了,截止到目前为止,无论你是根据我前面的文章亲自动手部署了Zookeeper集群,还是此时跟我使用Docker搭建了Zookeeper集群,一起又复习巩固了一遍,无论怎么样,一定要亲自动手实操一下。好的,接下来,我们就要部署Kafka集群啦。

    Kafka集群的搭建

    拉取kafka的镜像文件
    docker pull wurstmeister/kafka
    
    • 1
    运行kafka_zookeeper_master节点
    docker run -d --name kafka_zookeeper_master  --network zookeeper_network -p 9096:9096 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=172.18.0.6:2181,172.18.0.7:2181,172.18.0.8:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.0.4.9:9096 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9096 wurstmeister/kafka
    
    • 1
    运行kafka_zookeeper_node1节点
    docker run -d --name kafka_zookeeper_node1 --network zookeeper_network -p 9097:9097 -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=172.18.0.6:2181,172.18.0.7:2181,172.18.0.8:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.0.4.9:9097 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9097  wurstmeister/kafka
    
    • 1
    运行kafka_zookeeper_node2节点
    docker run -d --name kafka_zookeeper_node2 --network zookeeper_network -p 9098:9098 -e KAFKA_BROKER_ID=2 -e KAFKA_ZOOKEEPER_CONNECT=172.18.0.6:2181,172.18.0.7:2181,172.18.0.8:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.0.4.9:9098 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9098  wurstmeister/kafka
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    运行截图:

    在这里插入图片描述

    好了,到这里Kafka集群已经部署完成了,但是中间部署的过程中可能会出现内存不够使的情况,请看下面的解决方案。

    部署kafka集群中出现的问题(OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error=‘Out of memory’ (errno=12))

    问题描述
    [root@VM-4-9-centos ~]# docker logs 82
    [Configuring] 'advertised.listeners' in '/opt/kafka/config/server.properties'
    [Configuring] 'port' in '/opt/kafka/config/server.properties'
    Excluding KAFKA_HOME from broker config
    [Configuring] 'log.dirs' in '/opt/kafka/config/server.properties'
    [Configuring] 'listeners' in '/opt/kafka/config/server.properties'
    Excluding KAFKA_VERSION from broker config
    [Configuring] 'zookeeper.connect' in '/opt/kafka/config/server.properties'
    [Configuring] 'broker.id' in '/opt/kafka/config/server.properties'
    #
    # There is insufficient memory for the Java Runtime Environment to continue.
    # Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
    OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Out of memory' (errno=12)
    # An error report file with more information is saved as:
    # //hs_err_pid1.log
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    解决方案:
    创建swapfile:
    dd  if=/dev/zero  of=swapfile  bs=1024  count=500000  (有时会遇到dd命令不识别 可能是你安装过一次了 没事 先把swapfile删除就ok了)
    
    
    • 1
    • 2
    将swapfile设置为swap空间
    mkswap swapfile
    
    • 1
    启用交换空间
    swapon swapfile
    
    # 拓展--删除交换空间 
    swapoff swapfile
    
    • 1
    • 2
    • 3
    • 4
    可以使用free命令查看swap空间大小是否发生变化

    在这里插入图片描述

    好了,问题解决。

    测试一下Zookeeper中Kafka节点信息

    进入容器,开启客户端

    在这里插入图片描述

    查看全部节点信息

    在这里插入图片描述

    查看brokers中的信息

    在这里插入图片描述

    查看ids,kafka的broker.id以及节点下存储的详细信息

    在这里插入图片描述

    测试一下Kafka中创建一个Topic,Zookeeper中的接受情况

    创建一个Topic
    kafka-topics.sh --create --topic topic_example_1 --zookeeper zookeeper_kafka_master:2181,zookeeper_kafka_node1:2181,zookeeper_kafka_node2:2181   --replication-factor 3 --partitions 3
    
    
    • 1
    • 2
    创建命令结果:

    在这里插入图片描述

    查看zookeeper集群中topic的信息截图:

    节点1:

    在这里插入图片描述

    节点2:
    在这里插入图片描述

    节点3
    在这里插入图片描述

    其它kafka节点查看这个topic
    kafka-topics.sh --zookeeper zookeeper_kafka_master:2181,zookeeper_kafka_node1:2181,zookeeper_kafka_node2:2181 --list
    
    • 1
    不同kafka节点查看topic信息结果展示:

    节点1:
    在这里插入图片描述
    节点2:
    在这里插入图片描述

    节点3:
    在这里插入图片描述

    好了,还有更多其它的命令此处就不一个一个试了,大家可以自行尝试。创作不易,帮我点个小关注吧,笔芯 ^ _ ^ !

  • 相关阅读:
    JAVA中使用最广泛的本地缓存?Ehcache的自信从何而来2 —— Ehcache的各种项目集成与使用初体验
    用Bing绘制「V我50」漫画;GPT-5业内交流笔记;LLM大佬的跳槽建议;Stable Diffusion生态全盘点第一课 | ShowMeAI日报
    Nginx配置文件
    【Java】FileUtils练习题3
    且看五年开发码农,如何备战仨月硬刚字节面试官,轻松拿offer
    堆与堆排序
    SOAR安全事件编排自动化响应-安全运营实战
    字节流和字符流(即写文件)、FileOutputStream类
    JavaScript实现循环读入整数进行累加,直到累加的和大于1000为止的代码
    力扣21.合并两个有序链表
  • 原文地址:https://blog.csdn.net/Coder_ljw/article/details/127435897