【教程/保姆级】利用docker+centos本地搭建三台zookeeper集群保姆级教程

这段时间为了学习zookeeper需要搭建zookeeper

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

  1. 利用同一台机器搭建的伪集群,通过修改zookeeper暴露的端口号来达到搭建不同zookeeper服务
  2. 利用三台虚拟机搭建zookeeper服务,通过在局域网中暴露端口号搭建
  3. 利用docker服务快速搭建,中间使用docker-compose快速操作管理

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

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

运行环境

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

centos本地zookeeper服务搭建

我们先来看zookeeper本地的服务

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

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

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

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

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

名字太长不方便操作,我们可以重命名成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文件,作为服务节点的标识

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

zookeeper-1:21

zookeeper-2:22

zookeeper-3:23

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

./zkServer.sh start

查看当前节点状态

./zkServer.sh status

 出现上述信息说明我们启动成功,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

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

创建挂载路径

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

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

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

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

注:这里的可以任意

创建配置文件

我们将之前配置的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

配置id

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

 运行镜像

在经过上述准备之后,就可以运行我们生成的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"
    fi
        clientPort=`$GREP "^[[:space:]]*clientPort[^[:alpha:]]" "$ZOOCFG" | sed -e 's/.*=//'`
    if ! [[ "$clientPort"  =~ ^[0-9]+$ ]]
        then
       dataDir=`$GREP "^[[:space:]]*dataDir" "$ZOOCFG" | sed -e 's/.*=//'`
	   

	   
       #myid=`cat "$dataDir/myid"`
	   
	   myid=`cat "/opt/middleware/zk/data/myid"`
	   echo "see what myid is!"
	   echo $myid
       if ! [[ "$myid" =~ ^[0-9]+$ ]] ; then
         echo "clientPort not found and myid could not be determined. Terminating."
         exit 1
       fi
	   
	   echo "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.0
	   
	   echo $clientPortAndAddress
	   
	   

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


运行之后查看节点状态

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

到这里我们的搭建过程就已经结束了,中间如果有不明白的地方可以留言。

如有错误,尽请指点,多谢多谢啦!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值