【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

Docker创建 bridge 网络,创建自定义网络

docker network create --driver bridge --subnet 172.18.0.0/16 zookeeper_network

查看已经存在的网络

docker network ls

运行结果截图:
【Docker安装部署Zookeeper+Kafka集群详细教程、部署过程中遇到问题&解决方案、测试集群是否部署成功】_第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挂载目录

# 创建 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

创建从节点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

运行结果截图:

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

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

创建主配置文件

# zookeeper 主节点配置存放目录
cd /mydata/zookeeper_kafka/master/conf
# 编辑配置文件
vim zoo.cfg

创建从节点1配置文件

# zookeeper 节点1 配置存放目录
cd /mydata/zookeeper_kafka/node1/conf
# 编辑配置文件
vim zoo.cfg

创建从节点2配置文件

# zookeeper 节点2 配置存放目录
cd /mydata/zookeeper_kafka/node2/conf
# 编辑配置文件
vim zoo.cfg

补充:也可以直接使用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
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
zoo.cfg配置文件中参数的说明 解释说明
tickTime=2000 zookeeper里面最小的时间单位为2000ms
initLimit=10 Follower在启动过程中,会从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启动

# 启动命令
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

集群模式启动-从节点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

查看集群启动的状态

# 在容器 zookeeper-master 中开启一个交互模式的终端
docker exec -it zookeeper_kafka_master /bin/bash

# 查看 zookeeper 状态
cd bin
zkServer.sh status

在这里插入图片描述

# 在容器 zookeeper-master 中开启一个交互模式的终端
docker exec -it zookeeper_kafka_node1 /bin/bash

# 查看 zookeeper 状态
cd bin
zkServer.sh status

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

# 在容器 zookeeper-master 中开启一个交互模式的终端
docker exec -it zookeeper_kafka_node2 /bin/bash

# 查看 zookeeper 状态
cd bin
zkServer.sh status

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

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

Kafka集群的搭建

拉取kafka的镜像文件

docker pull wurstmeister/kafka

运行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

运行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

运行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



运行截图:

在这里插入图片描述

好了,到这里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

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

解决方案:

创建swapfile:
dd  if=/dev/zero  of=swapfile  bs=1024  count=500000  (有时会遇到dd命令不识别 可能是你安装过一次了 没事 先把swapfile删除就ok了)

将swapfile设置为swap空间
mkswap swapfile
启用交换空间
swapon swapfile

# 拓展--删除交换空间 
swapoff swapfile
可以使用free命令查看swap空间大小是否发生变化

在这里插入图片描述

好了,问题解决。

测试一下Zookeeper中Kafka节点信息

进入容器,开启客户端

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

查看全部节点信息

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

查看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

创建命令结果:

在这里插入图片描述

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

节点1:

在这里插入图片描述

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

节点3
【Docker安装部署Zookeeper+Kafka集群详细教程、部署过程中遇到问题&解决方案、测试集群是否部署成功】_第8张图片

其它kafka节点查看这个topic

kafka-topics.sh --zookeeper zookeeper_kafka_master:2181,zookeeper_kafka_node1:2181,zookeeper_kafka_node2:2181 --list

不同kafka节点查看topic信息结果展示:

节点1:
【Docker安装部署Zookeeper+Kafka集群详细教程、部署过程中遇到问题&解决方案、测试集群是否部署成功】_第9张图片
节点2:
【Docker安装部署Zookeeper+Kafka集群详细教程、部署过程中遇到问题&解决方案、测试集群是否部署成功】_第10张图片

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

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

你可能感兴趣的:(Kafka,Zookeeper,docker,zookeeper集群,kafka集群,集群详细部署测试,部署内存不足解决方案)