zk集群自动化脚本搭建-只需一个脚本

2 篇文章 0 订阅

本次搭建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"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只努力的微服务

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值