当前位置: 首页 > news >正文

Docker + CentOS 搭建 ZooKeeper 集群

网上的教程我差不多都看了,可以分为三类:

1. 利用同一台机器搭建的伪集群,通过修改zookeeper暴露的端口号来达到搭建不同zookeeper服务。

2. 利用三台虚拟机搭建zookeeper服务,通过在局域网中暴露端口号搭建。

3. 利用docker服务快速搭建,中间使用docker-compose快速操作管理。

 

而我本着喜欢整事的态度,准备搭建一个不同的zookeeper集群

 

这个zookeeper集群有三个服务单体,其中两台是CentOS本地搭建的伪集群,还有一个是在docker上面搭建的一个服务。

运行环境

 

  • CentOS 7虚拟机

  • docker服务和jdk8环境,这里不展开搭建

  • zookeeper3.5.7-bin.tar.gz压缩包

 

三台服务单体的IP客户端端口号分别为

2181、2182、2183

CentOS本地zookeeper服务搭建

我们先来看zookeeper本地的服务:

1.我们先到压缩包下载的路径

image

2.通过tar指令解压缩到我们的软件安装目录,这里我是解压到/opt/module

tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/module/

注:-C后面跟着你目标路径

 

这时我们到目标路径就找到我们解压缩后的文件夹。

image

名字太长不方便操作,

我们可以重命名成zookeeper-1,

再利用cp指令拷贝一份作为我们的zookeeper-2,作为我们两台zookeeper服务单机的工作目录。

搭建本地一号zookeeper

 

我们先进入zookeeper-1文件夹

在这里我们主要修改两处地方:

  • 在conf文件夹下修改zoo.cfg:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/module/zookeeper-1/data
#客户端端口号
clientPort=2181
#集群中所有节点的信息
server.21=0.0.0.0:2888:3888;2181
server.22=127.0.0.1:2889:3889;2182
#docker服务上搭建的节点
server.23=172.17.0.2:2899:3899;2183

注意:这三台服务器中在dataDir、clientPort、集群地址这三处是不同的其中。

 

dataDir为各自的数据文件夹,这里我们要求所指路径必须存在。

 

clientPort对于在同一个主机上搭建的zookeeper-1和zookeeper-2是不同的,我们这里将zookeeper-1端口号设置为2181,将zookeeper-2设置为2182。

 

集群中所有节点信息的格式统一为server.A=B:C:D

server.A=B:C:D;E
A 是一个数字,表示这个是第几号服务器;
集群模式下配置一个文件myid,这个文件在dataDir 目录下,这个文件里面有一个数据
就是A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与zoo.cfg 里面的配置信息比
较从而判断到底是哪个server。
B 是这个服务器的地址;我这里配置成0:0:0:0
C 是这个服务器Follower 与集群中的Leader 服务器交换信息的端口;
D 是万一集群中的Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的
Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
E 是服务节点的clientPort
  • 在dataDir设置的文件夹下创建一个myid文件,作为服务节点的标识

    image

    本文配置的三个服务节点的myid分别为

    zookeeper-1:21

    zookeeper-2:22

    zookeeper-3:23

     

    之后转到bin文件夹下,使用命令启动

    ./zkServer.sh start

     

    查看当前节点状态

    ./zkServer.sh status

    image

     

    出现上述信息说明我们启动成功,error的意思是我们还是一个单体,没有成群(因为就启动了一个zookeeper服务。

搭建本地二号服务

和之前大部分的步骤是一样的,只不过在修改zoo.cfg文件时。

我们需要将clientPort端口号修改为2182,并且修改集群信息列表。

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/module/zookeeper-2/data
#修改clientPort
clientPort=2182
#修改集群信息
server.21=127.0.0.1:2888:3888;2181
server.22=0.0.0.0:2889:3889;2182
server.23=172.17.0.2:2899:3899;2183

注意:集群信息每个节点上都不同

docker上服务节点搭建

这里我的首先是先通过dockerfile扩展官方的zookeeper镜像包,在其中更新了软件源地址

1.首先创建一个文件作为我们的dockerfile,并设置内容为:

#以官方版本呢3.5.7为基准包
FROM zookeeper:3.5.7
#修改软件源信息
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak && \
echo 'deb http://mirrors.163.com/debian/ jessie main non-free contrib' > /etc/apt/sources.list && \
echo 'deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib' >> /etc/apt/sources.list && \
echo 'deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib' >> /etc/apt/sources.list
#更新软件源
RUN apt-get upgrade
CMD echo "success......ok"

2.通过docker服务build出我们需要的镜像

docker build -f ./dockerfile -t myzookeeper:1.0 .

-f:我们编写的dockerfile地址

-t:输出我们需要的镜像的名称和版本号

注意最后还有一个点:

运行之后使用docker工具就可以看到我们的镜像

docker images

image

 

在运行我们的docker镜像之前,我们需要做一些前提工作:

 1.创建挂载路径

创建用于存储配置文件和数据的文件夹。

因为我们使用docker产生的数据和使用的配置文件等肯定是要放在CentOS本地的

mkdir -p /opt/module/zookeeper-3/conf
mkdir -p /opt/module/zookeeper-3/data

2.创建配置文件

我们将之前配置的zookeeper-2下的zoo.cfg配置文件拷贝到刚刚创建的conf文件夹下

并修改为

#修改暴露端口为2183
clientPort=2183
dataDir=/data
dataLogDir=/data/log
tickTime=2000
initLimit=10
syncLimit=5
#修改集群列表,并在末尾加上各自的clientPort
server.21=192.168.111.128:2888:3888;2181
server.22=192.168.111.128:2889:3889;2182
server.23=0.0.0.0:2899:3899;2183

3.配置id

在创建的data文件夹下新建一个myid文件,并写上内容为23

image

4.运行镜像

在经过上述准备之后,就可以运行我们生成的myzookeeper镜像了。

使用指令

docker run -v /opt/module/zookeeper-3/data:/data -v /opt/module/zookeeper-3/conf:/conf --name myzookeeper  -p 2899:2899 -p 3899:3899 -it myzookeeper:1.1  /bin/bash

命令说明:

-v:挂载我们的配置文件和数据文件夹

-p:映射我们在配置文件中设置的端口号

--name:设置启动后容器的名称

运行起来后我们就进入了容器内部,并且容器的2899/3899端口都会开放出来了。

这时我们进入bin文件夹,使用指令启动zookeeper服务

./zkServer.sh start

之后可能会这种错误,如果没有请直接跳过

cat: '/data /myid': No such file or directory clientPort not found and myid could not be determined. Terminating.

这是由于我们的zkServer.sh没有正确读取到我们的配置信息导致的,这时我们需要编辑zkServer.sh脚本将一部分信息变成固定的

if ! [ $clientPortAddress ]
then
clientPortAddress="localhost"
ficlientPort=`$GREP "^[[:space:]]*clientPort[^[:alpha:]]" "$ZOOCFG" | sed -e 's/.*=//'`if ! [[ "$clientPort"  =~ ^[0-9]+$ ]]thendataDir=`$GREP "^[[:space:]]*dataDir" "$ZOOCFG" | sed -e 's/.*=//'`#myid=`cat "$dataDir/myid"`myid=`cat "/opt/middleware/zk/data/myid"`echo "see what myid is!"echo $myidif ! [[ "$myid" =~ ^[0-9]+$ ]] ; thenecho "clientPort not found and myid could not be determined. Terminating."exit 1fiecho "see what clientPortAndAddress is!"echo $GREP "^[[:space:]]*server.$myid=.*;.*" "$ZOOCFG" | sed -e 's/.*=//' | sed -e 's/.*;//'
clientPortAndAddress=`$GREP "^[[:space:]]*server.$myid=.*;.*" "$ZOOCFG" | sed -e 's/.*=//' | sed -e 's/.*;//'`clientPortAndAddress=0.0.0.0echo $clientPortAndAddress

我也不知道是不是我的机器有问题才会出现这种bug。

运行之后查看节点状态

image

 

 而运行在宿主机中另外两个状态

image

image

 到这里我们的搭建过程就已经结束了

http://www.sczhlp.com/news/3377/

相关文章:

  • 系统架构设计专业技能 计算机组成与结构
  • 86五笔极点码表 for 鼠须管(macOS)、小狼毫(Windows)、中州韵(Ubuntu) 的简单配置
  • python之压缩(.tar.bz2、.tar.xz)
  • skywalking 子模块接口 请求头 sw8: 如何获取traceId
  • PHP 之使用HTMLPurifier过滤XSS
  • 在Windows上运行虚拟机的开源解决方案:QEMU、MSYS2和Emacs
  • DeepSeek-R1详解
  • 8-1
  • 新能源车焊接中发那科机器人保护气省气方法
  • 前端-小程序,常用标签、属性的说明
  • 【学习笔记】DP优化
  • 2025/8/1 总结
  • Android Studio安装及配置
  • 【HTTP】为什么调用接口的Authorization在传token的时候需要添加Bearer?
  • S32K148+LAN8720+lwip移植+modbus-tcpip调试
  • picocom 工具介绍
  • 杂事
  • 13.4.4 使用非极大值抑制预测边界框
  • Vercel 发布 AI SDK 5,引入语音 API;Ollama 新版本支持多模态交互 丨日报
  • CTFshow web入门 SQL注入(171-200)
  • P1549 [NOIP 1997 提高组] 棋盘问题
  • Angular中style与NgStyle使用区别
  • [Blossoms] 霓为衣兮风为马
  • sql优化谓词下推在join场景中的应用
  • MySQL主从切换原理
  • Luogu P4910 帕秋莉的手环 题解 [ 绿 ] [ 矩阵快速幂 ] [ 环形 DP ]
  • Java方法
  • wsl容易出现莫名奇妙的编译问题
  • 四:用sqoop技术将hive表数据传到mysql表中;五,使用ECharts实现数据可视化
  • 工业数采引擎-DTU