网上的教程我差不多都看了,可以分为三类:
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.我们先到压缩包下载的路径
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
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
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。
运行之后查看节点状态
而运行在宿主机中另外两个状态
到这里我们的搭建过程就已经结束了