这段时间为了学习zookeeper需要搭建zookeeper
网上的教程我差不多都看了,可以分为三类:
- 利用同一台机器搭建的伪集群,通过修改zookeeper暴露的端口号来达到搭建不同zookeeper服务
- 利用三台虚拟机搭建zookeeper服务,通过在局域网中暴露端口号搭建
- 利用docker服务快速搭建,中间使用docker-compose快速操作管理
而我本着喜欢整事的态度,准备搭建一个不同的zookeeper集群(就是玩
这个zookeeper集群有三个服务单体,其中两台是centos本地搭建的伪集群,还有一个是在docker上面搭建的一个服务
运行环境
- centos7虚拟机
- 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
注:这里的可以任意
创建配置文件
我们将之前配置的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
运行之后查看节点状态
而运行在宿主机中另外两个状态
到这里我们的搭建过程就已经结束了,中间如果有不明白的地方可以留言。
如有错误,尽请指点,多谢多谢啦!!