本次搭建zk集群为了方便,以docker容器的方式来演示
1.创建三个docker实例并按装jdk8
docker run --privileged -dit --name zk1 --hostname zk1 docker.io/centos:7.6.1810 /usr/sbin/init
docker run --privileged -dit --name zk2 --hostname zk2 docker.io/centos:7.6.1810 /usr/sbin/init
docker run --privileged -dit --name zk3 --hostname zk3 docker.io/centos:7.6.1810 /usr/sbin/init
#为了方便这里直接使用yum安装
docker exec -ti zk1 /bin/bash -c "yum -y install java-1.8.0-openjdk.x86_64"
docker exec -ti zk2 /bin/bash -c "yum -y install java-1.8.0-openjdk.x86_64"
docker exec -ti zk3 /bin/bash -c "yum -y install java-1.8.0-openjdk.x86_64"
2.查出每个docker的ip(在创建时指定ip也可以)
[root@wfw zk]# docker inspect -f='{{.NetworkSettings.IPAddress}} {{.Config.Hostname}}' $(sudo docker ps -a -q) > hostname
[root@wfw zk]# ll
total 4
-rw-r--r-- 1 root root 45 Jan 11 23:30 hostname
[root@wfw zk]# cat hostname
172.17.0.4 zk3
172.17.0.3 zk2
172.17.0.2 zk1
3.配置每个docker的hosts
#将hostname文件拷贝到各个docker中的home路径下
docker cp hostname zk1:/home/hostname
docker cp hostname zk2:/home/hostname
docker cp hostname zk3:/home/hostname
#将hostname内容写入hosts文件
docker exec -ti zk1 /bin/bash -c "cat /home/hostname >> /etc/hosts"
docker exec -ti zk2 /bin/bash -c "cat /home/hostname >> /etc/hosts"
docker exec -ti zk3 /bin/bash -c "cat /home/hostname >> /etc/hosts"
4.下载zk并复制到各个docker
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
#将zk复制到各个docker的home路径下
docker cp zookeeper-3.4.10.tar.gz zk1:/home/zookeeper-3.4.10.tar.gz
docker cp zookeeper-3.4.10.tar.gz zk2:/home/zookeeper-3.4.10.tar.gz
docker cp zookeeper-3.4.10.tar.gz zk3:/home/zookeeper-3.4.10.tar.gz
#解压所有docker上的zk包
docker exec -ti zk1 /bin/bash -c "tar zxvf /home/zookeeper-3.4.10.tar.gz -C /home"
docker exec -ti zk2 /bin/bash -c "tar zxvf /home/zookeeper-3.4.10.tar.gz -C /home"
docker exec -ti zk3 /bin/bash -c "tar zxvf /home/zookeeper-3.4.10.tar.gz -C /home"
5.登陆zk1,配置zk的配置文件zoo.cfg
[root@zk1 home]# cd /home/zookeeper-3.4.10/conf/
[root@zk1 conf]# touch zoo.cfg
[root@zk1 conf]# vi zoo.cfg
[root@zk1 conf]# cat zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataLogDir=/opt/zookeeper/logs
dataDir=/opt/zookeeper/data
clientPort=2181
autopurge.snapRetainCount=500
autopurge.purgeInterval=24
server.1=zk1:2888:3888
server.2=zk2:2888:3888
server.3=zk3:2888:3888
6.拷贝zoo.cfg到其他两个docker的同路径下,为了方便也可以在宿主机中创建该文件像上述方法拷贝到所有docker
docker cp zoo.cfg zk1:/home/zookeeper-3.4.10/conf/zoo.cfg
docker cp zoo.cfg zk2:/home/zookeeper-3.4.10/conf/zoo.cfg
docker cp zoo.cfg zk3:/home/zookeeper-3.4.10/conf/zoo.cfg
7.创建data路径及myid文件
docker exec -ti zk1 /bin/bash -c "mkdir -p /opt/zookeeper/{logs,data}; echo "1" > /opt/zookeeper/data/myid"
docker exec -ti zk2 /bin/bash -c "mkdir -p /opt/zookeeper/{logs,data}; echo "2" > /opt/zookeeper/data/myid"
docker exec -ti zk3 /bin/bash -c "mkdir -p /opt/zookeeper/{logs,data}; echo "3" > /opt/zookeeper/data/myid"
8.启动每个docker中的zk进程
[root@wfw zk]# docker exec -ti zk3 /bin/bash -c "/home/zookeeper-3.4.10/bin/zkServer.sh start"
ZooKeeper JMX enabled by default
Using config: /home/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@wfw zk]# docker exec -ti zk2 /bin/bash -c "/home/zookeeper-3.4.10/bin/zkServer.sh start"
ZooKeeper JMX enabled by default
Using config: /home/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@wfw zk]# docker exec -ti zk1 /bin/bash -c "/home/zookeeper-3.4.10/bin/zkServer.sh start"
ZooKeeper JMX enabled by default
Using config: /home/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
9.查询zk状态
[root@wfw zk]# docker exec -ti zk3 /bin/bash -c "/home/zookeeper-3.4.10/bin/zkServer.sh status"
ZooKeeper JMX enabled by default
Using config: /home/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
[root@wfw zk]# docker exec -ti zk2 /bin/bash -c "/home/zookeeper-3.4.10/bin/zkServer.sh status"
ZooKeeper JMX enabled by default
Using config: /home/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: leader
[root@wfw zk]# docker exec -ti zk1 /bin/bash -c "/home/zookeeper-3.4.10/bin/zkServer.sh status"
ZooKeeper JMX enabled by default
Using config: /home/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
附:
如果三个docker已经配置了ssh免密登陆,还可以只在一个docker启动左右集群的zk进程
#!/bin/bash
usage="Usage: zkRun.sh [start|stop|status|restart]"
if [ $# -ne 1 ]; then
echo $usage
exit 1
fi
case $1 in
(start)
cmd="start"
;;
(stop)
cmd="stop"
;;
(status)
cmd="status"
;;
(restart)
cmd="restart"
;;
(*)
echo $usage
exit 1
;;
esac
docker_hostname=$(cat ./hostname|awk '{print $2}')
for salve in $docker_hostname ; do
ssh $docker_hostname "/home/zookeeper-3.4.10/bin/zkServer.sh $cmd"
done
在一开始生成hostname文件时就是直接通过查询docker容器列表详情获得的,也可以通过脚本形式来生成zk的zoo.cfg配置文件,过程也不复杂
#!/bin/bash
# zoo_gen.sh
# generate zoo.cfg
echo "tickTime=2000" >> zoo.cfg
echo "initLimit=10" >> zoo.cfg
echo "syncLimit=5" >> zoo.cfg
echo "dataLogDir=/opt/zookeeper/logs" >> zoo.cfg
echo "dataDir=/opt/zookeeper/data" >> zoo.cfg
echo "clientPort=2181" >> zoo.cfg
echo "autopurge.snapRetainCount=500" >> zoo.cfg
echo "autopurge.purgeInterval=24" >> zoo.cfg
id=0
for hostname in $(cat ./hostname|awk '{print $2}')
do
((id++))
echo "server.$id=$hostname:2888:3888" >> zoo.cfg
done
myid文件的自动生成和推送其实也不是难做,只不过需要ssh免密登陆,稍微复杂一些,这里就略过了,感兴趣的可以自己试着写写,方法思路有很多种
zk_auto.sh
#!/bin/sh
#docker pull openjdk:8u242-jdk
#wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
docker stop zk1 && docker rm zk1
docker stop zk2 && docker rm zk2
docker stop zk3 && docker rm zk3
#创建docker
image=mamohr/centos-java:latest
docker run --privileged -dit --name zk3 --hostname zk3 ${image} /usr/sbin/init
docker run --privileged -dit --name zk2 --hostname zk2 ${image} /usr/sbin/init
docker run --privileged -dit --name zk1 --hostname zk1 ${image} /usr/sbin/init
#生成hostname
docker inspect -f='{{.NetworkSettings.IPAddress}} {{.Config.Hostname}}' $(sudo docker ps -a -q) | grep zk > hostname
#将hostname文件拷贝到各个docker中的home路径下
docker cp hostname zk1:/home/hostname
docker cp hostname zk2:/home/hostname
docker cp hostname zk3:/home/hostname
#将hostname内容写入hosts文件
docker exec -ti zk1 /bin/bash -c "cat /home/hostname >> /etc/hosts"
docker exec -ti zk2 /bin/bash -c "cat /home/hostname >> /etc/hosts"
docker exec -ti zk3 /bin/bash -c "cat /home/hostname >> /etc/hosts"
#将zk复制到各个docker的home路径下
docker cp zookeeper-3.4.10.tar.gz zk1:/home/zookeeper-3.4.10.tar.gz
docker cp zookeeper-3.4.10.tar.gz zk2:/home/zookeeper-3.4.10.tar.gz
docker cp zookeeper-3.4.10.tar.gz zk3:/home/zookeeper-3.4.10.tar.gz
#解压所有docker上的zk包
docker exec -ti zk1 /bin/bash -c "tar zxf /home/zookeeper-3.4.10.tar.gz -C /home"
docker exec -ti zk2 /bin/bash -c "tar zxf /home/zookeeper-3.4.10.tar.gz -C /home"
docker exec -ti zk3 /bin/bash -c "tar zxf /home/zookeeper-3.4.10.tar.gz -C /home"
#生成zoo.cfg
echo "tickTime=2000" > zoo.cfg
echo "initLimit=10" >> zoo.cfg
echo "syncLimit=5" >> zoo.cfg
echo "dataLogDir=/opt/zookeeper/logs" >> zoo.cfg
echo "dataDir=/opt/zookeeper/data" >> zoo.cfg
echo "clientPort=2181" >> zoo.cfg
echo "autopurge.snapRetainCount=500" >> zoo.cfg
echo "autopurge.purgeInterval=24" >> zoo.cfg
id=0
for hostname in $(cat ./hostname|awk '{print $2}')
do
((id++))
echo "server.$id=$hostname:2888:3888" >> zoo.cfg
done
docker cp zoo.cfg zk1:/home/zookeeper-3.4.10/conf/zoo.cfg
docker cp zoo.cfg zk2:/home/zookeeper-3.4.10/conf/zoo.cfg
docker cp zoo.cfg zk3:/home/zookeeper-3.4.10/conf/zoo.cfg
docker exec -ti zk1 /bin/bash -c "mkdir -p /opt/zookeeper/{logs,data}; echo "1" > /opt/zookeeper/data/myid"
docker exec -ti zk2 /bin/bash -c "mkdir -p /opt/zookeeper/{logs,data}; echo "2" > /opt/zookeeper/data/myid"
docker exec -ti zk3 /bin/bash -c "mkdir -p /opt/zookeeper/{logs,data}; echo "3" > /opt/zookeeper/data/myid"
docker exec -ti zk1 /bin/bash -c "/home/zookeeper-3.4.10/bin/zkServer.sh start"
docker exec -ti zk2 /bin/bash -c "/home/zookeeper-3.4.10/bin/zkServer.sh start"
docker exec -ti zk3 /bin/bash -c "/home/zookeeper-3.4.10/bin/zkServer.sh start"
docker exec -ti zk1 /bin/bash -c "/home/zookeeper-3.4.10/bin/zkServer.sh status"
docker exec -ti zk2 /bin/bash -c "/home/zookeeper-3.4.10/bin/zkServer.sh status"
docker exec -ti zk3 /bin/bash -c "/home/zookeeper-3.4.10/bin/zkServer.sh status"

322

被折叠的 条评论
为什么被折叠?



