> 注意点1: centos7.x的系统,低版本没有尝试
> 注意点2: IPADDRS的服务器间通信必须正常,防火墙关闭或开放对应集群的选举端口和通信端口以及2181
> 注意点3: !!!!!! 必须在IPADDRS中的某一台服务器上用root账号执行此脚本 !!!!!!
执行时必须在此服务器执行的命令: yum install sshpass -y
安装完成后不使用此脚本可以remove掉sshpass,自己决定
> 注意点4: ZOOHOME指定的目录下不建议存在zookeeper开头的任何文件夹,不然此脚本会影响你的
文件,删除集群时可能造成误删除.
> 注意点5: IPADDRS和PASSWORD的顺序必须一一对应,此脚本不支持为分布式安装,IPADDRS和PASSWORD和OBSERVER和MYID必须设置正确,TARNAME必须填写你上传到每台服务器的jdk压缩包名,因为jdk需要登录下载,所以此处不支持wget下载jdk,需要手动上传到每台服务器.
> 注意点6: ELECTPORT是集群选举的端口号,TELNETPORT是集群通信的端口号
#1. 安装依赖环境
脚本.sh install
#2. 目录配置和编译源码
脚本.sh make
#3. 启动集群
脚本.sh start
#4. 停止集群
脚本.sh stop
#5. 卸载集群
脚本.sh delete
#6. 重启集群
脚本.sh restart
脚本内容:
#!/bin/bash
# 基础设置
#节点选举端口,不可是2181,因为2181端口是客户端端口,选不被占用的端口
ELECTPORT=3000
#节点间通信起始端口号,不可是2181,因为2181端口是客户端端口,选不被占用的端口
TELNETPORT=2000
#服务器ip集合,数组长度必须是奇数
IPADDRS=(192.168.92.30 192.168.92.31 192.168.92.32 192.168.92.33 192.168.92.34 192.168.92.35 192.168.92.36)
#服务器密码集合,与ip对应,数组长度必须是奇数
PASSWORD=(root root root root root root root)
#observer节点配置,与IPADDRS数组中的下标对应,1就是observer节点,0不是,数组长度必须是奇数
OBSERVER=(0 0 0 0 0 1 1)
#myid标识,与IPADDRS数组中的下标对应,建议用ip地址最后一个点后的数值,192.168.92.30就用30,如果不是同一网段,可自己定义,数组长度必须是奇数
MYID=(30 31 32 33 34 35 36)
#zk安装根目录,默认安装zk3.5.6
ZOOHOME=/opt
#JDK安装根目录,最后不要加斜杠
JAVA_BASE_HOME=/usr/local
#JDK安装包文件名,版本必须大于等于1.8
TARNAME=jdk-8u231-linux-x64.tar.gz
if [ -a config.sh ]
then
source "config.sh"
fi
#安装zoo集群依赖环境以及jdk1.8
if [ "$1" == "install" ]
then
for p in ${!IPADDRS[@]}; do
IPADDR=${IPADDRS[$p]}
echo -e "\033[43;31m install $IPADDR Start \033[0m"
sshpass -p ${PASSWORD[p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "yum install wget -y && cd $JAVA_BASE_HOME && mkdir $JAVA_BASE_HOME/jdk1.8 && tar -zxf ./$TARNAME -C ./jdk1.8 --strip-components 1 && echo 'export JAVA_HOME=$JAVA_BASE_HOME/jdk1.8' >> /etc/profile && echo 'export PATH=\$JAVA_HOME/bin:\$PATH' >> /etc/profile && echo 'export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar' >> /etc/profile && source /etc/profile "
echo -e "\033[43;31m install $IPADDR End \033[0m"
done
exit 0
fi
#编译zoo集群
if [ "$1" == "make" ]
then
for p in ${!IPADDRS[@]}; do
IPADDR=${IPADDRS[$p]}
echo -e "\033[43;31m download $IPADDR Start \033[0m"
sshpass -p ${PASSWORD[p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "cd $ZOOHOME && wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.5.6/apache-zookeeper-3.5.6-bin.tar.gz && tar -zxf $ZOOHOME/apache-zookeeper-3.5.6-bin.tar.gz "
echo -e "\033[43;31m download $IPADDR End \033[0m"
PORT=$ELECTPORT
TELNET=$((TELNETPORT+i))
echo -e "\033[43;31m make $IPADDR:$PORT Start \033[0m"
MID=${MYID[p]}
echo "$MID"
left="cp -R $ZOOHOME/apache-zookeeper-3.5.6-bin $ZOOHOME/zookeeper-3.5.6-$PORT && mkdir $ZOOHOME/zookeeper-3.5.6-$PORT/logs && mkdir $ZOOHOME/zookeeper-3.5.6-$PORT/data && cp $ZOOHOME/zookeeper-3.5.6-$PORT/conf/zoo_sample.cfg $ZOOHOME/zookeeper-3.5.6-$PORT/conf/zoo.cfg && sed -i '12c #dataDir=/tmp/zookeeper' $ZOOHOME/zookeeper-3.5.6-$PORT/conf/zoo.cfg && echo 'dataDir=$ZOOHOME/zookeeper-3.5.6-$PORT/data' >> $ZOOHOME/zookeeper-3.5.6-$PORT/conf/zoo.cfg && echo 'dataLogDir=$ZOOHOME/zookeeper-3.5.6-$PORT/logs' >> $ZOOHOME/zookeeper-3.5.6-$PORT/conf/zoo.cfg && touch $ZOOHOME/zookeeper-3.5.6-$PORT/data/myid && echo '$MID' >> $ZOOHOME/zookeeper-3.5.6-$PORT/data/myid"
right=""
for two in ${!IPADDRS[@]}; do
TIP=${IPADDRS[$two]}
if [ ${OBSERVER[two]} == 1 ];then
tmp="&& echo 'server.${MYID[two]}=$TIP:$TELNET:$PORT:observer' >> $ZOOHOME/zookeeper-3.5.6-$PORT/conf/zoo.cfg "
else
tmp="&& echo 'server.${MYID[two]}=$TIP:$TELNET:$PORT' >> $ZOOHOME/zookeeper-3.5.6-$PORT/conf/zoo.cfg "
fi
right="$right $tmp"
if [[ ${OBSERVER[p]} == 1 ]] && [[ ${OBSERVER[two]} == 1 ]] ;then
right="$right && echo 'peerType=observer' >> $ZOOHOME/zookeeper-3.5.6-$PORT/conf/zoo.cfg "
fi
done;
sshpass -p ${PASSWORD[p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "$left$right"
echo -e "\033[43;31m make $IPADDR:$PORT End \033[0m"
sshpass -p ${PASSWORD[p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "rm -rf $ZOOHOME/apache-zookeeper-3.5.6-bin && rm -rf $ZOOHOME/apache-zookeeper-3.5.6-bin.tar.gz"
done
exit 0
fi
#运行集群
if [ "$1" == "start" ]
then
HOSTS=""
for p in ${!IPADDRS[@]}; do
IPADDR=${IPADDRS[$p]}
PORT=$ELECTPORT
echo -e "\033[43;31m Starting $IPADDR:$PORT Start \033[0m"
sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "export JAVA_HOME=$JAVA_BASE_HOME/jdk1.8 && cd $ZOOHOME/zookeeper-3.5.6-$PORT/bin/ && ./zkServer.sh start"
echo -e "\033[43;31m Starting $IPADDR:$PORT End \033[0m"
done
exit 0
fi
#停止集群
if [ "$1" == "stop" ]
then
for p in ${!IPADDRS[@]}; do
IPADDR=${IPADDRS[$p]}
PORT=$ELECTPORT
echo -e "\033[43;31m Stopping $IPADDR:$PORT Start \033[0m"
sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "export JAVA_HOME=$JAVA_BASE_HOME/jdk1.8 && cd $ZOOHOME/zookeeper-3.5.6-$PORT/bin/ && ./zkServer.sh stop"
echo -e "\033[43;31m Stopping $IPADDR:$PORT End \033[0m"
done
exit 0
fi
#重启集群
if [ "$1" == "restart" ]
then
for p in ${!IPADDRS[@]}; do
IPADDR=${IPADDRS[$p]}
PORT=$ELECTPORT
echo -e "\033[43;31m Restart $IPADDR:$PORT Start \033[0m"
sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "export JAVA_HOME=$JAVA_BASE_HOME/jdk1.8 && cd $ZOOHOME/zookeeper-3.5.6-$PORT/bin/ && ./zkServer.sh restart"
echo -e "\033[43;31m Restart $IPADDR:$PORT End \033[0m"
done
exit 0
fi
#删除集群
if [ "$1" == "delete" ];then
read -p "你确定要删除整个集群么?删除前请先stop,该操作会删除所有数据,输入[yes/no]?" input
echo $input
if [ $input = "yes" ];then
for p in ${!IPADDRS[@]}; do
IPADDR=${IPADDRS[$p]}
echo -e "\033[43;31m Delete $IPADDR:$PORT Start \033[0m"
sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "sed -i '/JAVA_HOME/d' /etc/profile && rm -rf $ZOOHOME/zookeeper-* && rm -rf $JAVA_BASE_HOME/jdk1.8"
echo -e "\033[43;31m Delete $IPADDR:$PORT End \033[0m"
done
fi
exit 0
fi
if [ "$1" == "service" ];then
read -p "设置成服务会重启系统,我也不建议你注册成服务,确定要操作么,输入[yes/no]?" input
echo $input
if [ $input = "yes" ];then
for p in ${!IPADDRS[@]}; do
IPADDR=${IPADDRS[$p]}
PORT=$FIRSTPORT
echo -e "\033[43;31m service $IPADDR:$PORT Start \033[0m"
zks=/usr/lib/systemd/system/zookeeper.service
sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "touch $zks && echo '[Unit]' >> $zks && echo 'Description=zookeeper-Cluster' >> $zks && echo 'After=network.target' >> $zks && echo '[Service]' >> $zks && echo 'Type=forking' >> $zks && echo 'ExecStart=$ZOOHOME/zookeeper-3.5.6-$PORT/bin/zkServer.sh start' >> $zks && echo 'ExecReload=$ZOOHOME/zookeeper-3.5.6-$PORT/bin/zkServer.sh restart' >> $zks && echo 'ExecStop=$ZOOHOME/zookeeper-3.5.6-$PORT/bin/zkServer.sh stop' >> $zks && echo 'PrivateTmp=true' >> $zks && echo '[Install]' >> $zks && echo 'WantedBy=multi-user.target' >> $zks "
echo -e "\033[43;31m service $IPADDR:$PORT End \033[0m"
echo -e "\033[43;31m systemctl $IPADDR Start \033[0m"
sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "systemctl daemon-reload && reboot"
echo -e "\033[43;31m systemctl $IPADDR End \033[0m"
done
fi
exit 0
fi
echo "Usage: $0 [install|make|start|stop|restart|delete]"
echo "install -- step1:yum安装zookeeper-3.5.6集群所需要的环境以及jdk"
echo "make -- step2:编译zookeeper-3.5.6源码并初始化zookeeper-3.5.6集群实例和配置"
echo "start -- step3:运行集群所有节点并构建成集群,注意要关闭防火墙或开放对应的端口"
echo "stop -- step4:停止集群所有节点"
echo "restart -- step4:重启集群所有节点"
echo "delete -- step5:删除前请先stop,此操作会删除整个集群所有数据包括jdk环境,请谨慎操作!"