自定义参数
PKG_NAME= #PKG包名
TEMP_PATH= #临时目录
USER_NAME= #启动用户
ZK_NAME= #ZK服务名
ZK_PATH= #ZK安装路径
ZK_PORT= #设置ZK端口
部署参数检查
#!/bin/bash
# 检查参数是否设置
echo "=====检查参数是否设置====="
if [ ! $TEMP_PATH ];then
echo "=====$TEMP_PATH 此参数未设置,请检查!====="
exit 1
fi
if [ ! $ZK_PATH ];then
echo "=====$ZK_PATH 此参数未设置,请检查!====="
exit 1
fi
if [ ! $ZK_PORT ];then
echo "=====$ZK_PORT 此参数未设置,请检查!====="
exit 1
fi
if [ ! $ZK_NAME ];then
echo "=====$ZK_NAME 此参数未设置,请检查!====="
exit 1
fi
ISSTART=$(netstat -nutlp|grep ${ZK_PORT}|grep -v "grep"|wc -l)
# 检查端口是否已被监听
echo "=====检查端口是否已被监听====="
if [ "${ISSTART}" != "0" ]; then
echo "ZK 启动端口已监听,请重新选择端口"
exit 1
else
echo "ZK 启动端口未监听,符合预期!"
fi
# 检查目标目录是否存在
echo "=====检查目标目录是否存在====="
if [ ! -d $TEMP_PATH ];then
echo "=====$TEMP_PATH目录不存在,创建目录====="
mkdir -p $TEMP_PATH
else
echo "=====临时目录已存在,无需创建====="
fi
if [ ! -d $ZK_PATH/$ZK_PORT ];then
echo "=====$ZK_PORT 目录不存在,创建目录====="
mkdir -p $ZK_PATH/$ZK_PORT/zookeeper-data
else
echo "=====$ZK_PORT 目录已存在,退出安装====="
exit 1
fi
echo "=====部署前检查通过====="
上传并解压安装包
#!/bin/bash
CURR_DIR=$(pwd)
pwd
# 解压压缩包到指定目录
echo "=====解压压缩包到指定目录====="
unzip -o ${PKG_NAME}.zip -d $TEMP_PATH
echo "=====查看解压后的内容====="
ls $TEMP_PATH/$PKG_NAME
# 解压安装包到指定目录
echo "=====解压安装包到指定目录====="
cd $TEMP_PATH/$PKG_NAME
tar xf ${ZK_NAME}.tar.gz -C $ZK_PATH/$ZK_PORT
#mkdir -p $ZK_PATH/$ZK_PORT
#cp -r ${ZK_NAME} $ZK_PATH/$ZK_PORT
echo "=====查看解压后的内容====="
ls $ZK_PATH/$ZK_PORT/$ZK_NAME
#配置文件修改
cd ${CURR_DIR}
echo "======开始复制模板配置文件======"
cp zoo.cfg $ZK_PATH/$ZK_PORT/$ZK_NAME/conf/
cd $ZK_PATH/$ZK_PORT/$ZK_NAME/conf/
echo "=====开始修改配置文件====="
sed -i "s@^dataDir.*@dataDir=$ZK_PATH/$ZK_PORT/zookeeper-data@g" zoo.cfg
sed -i "s@^clientPort.*@clientPort=$ZK_PORT@g" zoo.cfg
sed -i "s@^server.1=.*@server.1=$server1:1$ZK_PORT:2$ZK_PORT@g" zoo.cfg
sed -i "s@^server.2=.*@server.2=$server2:1$ZK_PORT:2$ZK_PORT@g" zoo.cfg
sed -i "s@^server.3=.*@server.3=$server3:1$ZK_PORT:2$ZK_PORT@g" zoo.cfg
写入唯一标识 server1
#!/bin/bash
#写入唯一标识
echo "======写入唯一标识======"
echo '1'>$ZK_PATH/$ZK_PORT/zookeeper-data/myid
cat $ZK_PATH/$ZK_PORT/zookeeper-data/myid
写入唯一标识 server2
#!/bin/bash
#写入唯一标识
echo "======写入唯一标识======"
echo '2'>$ZK_PATH/$ZK_PORT/zookeeper-data/myid
cat $ZK_PATH/$ZK_PORT/zookeeper-data/myid
写入唯一标识 server3
#!/bin/bash
#写入唯一标识
echo "======写入唯一标识======"
echo '3'>$ZK_PATH/$ZK_PORT/zookeeper-data/myid
cat $ZK_PATH/$ZK_PORT/zookeeper-data/myid
设置启停脚本+启动
#!/bin/bash
chown -R ${USER_NAME}:${USER_NAME} $ZK_PATH
echo "=====开始设置启动脚本====="
# 设置启动脚本
cat > /usr/lib/systemd/system/zk${ZK_PORT}.service <<-EOF
[Unit]
Description=Zookeeper service
After=network.target
[Service]
Type=forking
User=${USER_NAME}
Environment=JAVA_HOME=/usr/local/jdk
Environment=ZOO_LOG_DIR=/data/public/zookeeper/${ZK_PORT}
ExecStart=$ZK_PATH/$ZK_PORT/$ZK_NAME/bin/zkServer.sh start
ExecStop=$ZK_PATH/$ZK_PORT/$ZK_NAME/bin/zkServer.sh stop
Restart=always
[Install]
WantedBy=multi-user.target
EOF
echo "=====启动并设置开机自启====="
systemctl daemon-reload
systemctl start zk${ZK_PORT}.service
systemctl enable zk${ZK_PORT}.service
echo "=====启停方式:systemctl start|stop|restart zk${ZK_PORT}====="
#按照端口判断,默认启动时间2分钟,判断两次,按需修改循环次数
echo "=====开始判断服务是否已启动成功====="
for((i=1;i<=12;i++));
do
sleep 10
ISSTART=$(netstat -nutlp|grep ${ZK_PORT}|grep -v "grep"|wc -l)
if [ "$ISSTART" != "0" ]; then
echo "发现服务端口,为确保服务真正启动成功,等待15秒后进行第二次判断!"
sleep 15
ISSTART=$(netstat -nutlp|grep ${ZK_PORT}|grep -v "grep"|wc -l)
if [ "$ISSTART" != "0" ]; then
echo "等待15秒后端口仍启动,服务第二次判断通过,服务启动成功!"
exit 0
else
echo "等待15秒后端口未启动,服务第二次判断失败,服务启动失败!"
exit 1
fi
else
echo "服务启动中,请等待!"
fi
done
echo "等待2分钟后未发现服务端口,服务启动失败!"
exit 1
验证集群状态
#!/bin/bash
ZK_STATUS=`$ZK_PATH/$ZK_PORT/$ZK_NAME/bin/zkServer.sh status |grep Mode: |awk -F ": " '{print $NF}'`
#查看集群状态
echo "=====查看集群状态,本机角色为:$ZK_STATUS====="
# 验证集群状态
if [ "$ZK_STATUS" == "follower" ] || [ "$ZK_STATUS" == "leader" ];then
echo "=====集群状态正常!====="
else
echo "=====集群状态异常!====="
exit 1
fi
清空临时目录安装包
#!/bin/bash
rm -rf ${TEMP_PATH}
mkdir -p ${TEMP_PATH}