一、Tomcat集群上App应用同步更新升级
Tomcat作为一个轻量级的应用服务器,被广泛应用做为java程序的容器使用,很多线上的环境都是从入口的nginx服务器负载均衡到后端多个tomcat服务器组成的集群,因此每次app应用升级的时候,都需要在集群上的每台服务器进行重复的更新工作,下面是关于同步升级的两个思路
方法一、使用rsync远程数据同步服务
原理:该服务可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送
限制:采用rsync比较适合增量备份模式,比如每次只修改app项目下的配置文件,rsync第一次同步是将项目目录整体拷贝,以后进行增量同步,但实际生产中很多时候都是将项目目录进行整体打包替换掉,文件变动较大,因此该方法保留使用
方法二、利用SHELL脚本的同步服务
思路:既然每次项目目录都有变动,那么就在集群中选择一台服务器作为Master主机,其余机器作为minion从机,每次升级时候在Master上更新,然后利用脚本自动打包目录并推送到minion主机上
为了方便检查和分开测试这里将文件分开为5个
1、minion_ip_list.txt #集群minion主机IP文件,每行输入一个有效的minion主机IP,脚本会逐行读取该文件并执行相应命令
2、master_bak.sh #master主机项目备份脚本,项目部署成功后将项目目录打包,并运行下一步检测脚本
#!/bin/bash
######定义全局变量#################################################################################
#脚本位置目录
SCRIPT_DIR=/script
#备份存档目录
APP_BAK_DIR=/app_itsm_backup
#APP应用安装目录
APP_INSTALL_DIR=/usr/local/tomcat/webapps/web/ServiceHot
#minionIP列表文件位置
MINION_LIST=/script/minion_ip_list.txt
#集群miniom升级脚本文件
MINION_UPDATE_FILENAME=minion_update.sh
#当天备份文件名
APP_BAK_FILENAME=ServiceHot$(date +%Y%m%d).tar.gz
###################################################################################################
##############检查备份目录函数#####################################################################
function check_app_bak_dir()
{
if [ ! -d $APP_BAK_DIR ];then
mkdir $APP_BAK_DIR
echo "Create directory ‘$APP_BAK_DIR’"
else
echo "Cannot create directory ‘$APP_BAK_DIR’: File exists"
fi
}
###################################################################################################
##############检查存档函数#########################################################################
function check_archive()
{
if [ ! -f $APP_BAK_DIR/$APP_BAK_FILENAME ];then
echo "Create Archive ‘$APP_BAK_DIR/$APP_BAK_FILENAME’"
cd /usr/local/tomcat/webapps/web
tar -czvf $APP_BAK_DIR/$APP_BAK_FILENAME ServiceHot
echo "Create archive successfully"
else
read -p "Would you need to overlay archive(y/n)?:" i
#echo $i
if [ $i = y ];then
rm -rf $APP_BAK_DIR/$APP_BAK_FILENAME
cd /usr/local/tomcat/webapps/web
tar -czvf $APP_BAK_DIR/$APP_BAK_FILENAME ServiceHot
echo "Successfully overwrite Archive"
elif [ $i = n ];then
echo "Thanks to use,See you next time. Bye!"
exit
else
echo "You need enter y or n, Try to run script again!"
exit
fi
fi
}
###################################################################################################
check_app_bak_dir
check_archive
/script/minion_check.sh
3、minion_check.sh #检测minion主机并将升级脚本minion_update.sh推送到目标主机自动执行
备注:该脚本涉及的while read line中ssh命令的远程调用问题在下一篇文章中有解释
#!/bin/bash
###################################################################################################
#脚本位置目录
SCRIPT_DIR=/script
#集群miniom升级脚本文件
MINION_UPDATE_FILENAME=minion_update.sh
#minionIP列表文件位置
MINION_LIST=/script/minion_ip_list.txt
###################################################################################################
###############读取集群minionIP并测试是否存活######################################################
while read line
do
if test -z $line;then
continue
else
echo "Minion host:"$line
ping -c 2 $line>/dev/null
i=$(echo $?)
#echo $i
if [ $i -eq 0 ];then
echo "Push script file to $line"
ssh -n root@$line "mkdir $SCRIPT_DIR 2&1>/dev/null"
ssh -n root@$line "rm -rf $SCRIPT_DIR/$MINION_UPDATE_FILENAME"
scp $SCRIPT_DIR/$MINION_UPDATE_FILENAME root@$line:$SCRIPT_DIR
ssh -n root@$line "chmod +x $SCRIPT_DIR/*.sh"
ssh -n root@$line "$SCRIPT_DIR/$MINION_UPDATE_FILENAME"
else
echo "Minion host does not find, Check file /script/minion_ip_list.txt"
fi
fi
done < $MINION_LIST
###################################################################################################
4、minion_update.sh #集群minion主机升级脚本,从主机master上拉取项目压缩包后在本机解压并启动
#!/bin/bash
############设置全局变量################################################################################
#master主机ip
MASTER_IP=192.168.15.133
#APP更新数据包存放目录
APP_BAK_DIR=/app_itsm_backup
#APP应用安装目录
APP_INSTALL_DIR=/usr/local/tomcat/webapps/web/ServiceHot
#当天备份文件名
APP_BAK_FILENAME=ServiceHot$(date +%Y%m%d).tar.gz
#tomcat默认端口号8080
TOMCAT_DEFAULT=8080
#获取tomcat当前端口号
TOMCAT_PORT=`ss -nutlp|grep $TOMCAT_DEFAULT|grep java|awk '{print $5}'|awk -F ":" '{print $4}'`
#tomcat安装目录
TOMCAT_INSTALL_DIR=/usr/local/tomcat
#获取tomcat当前进程号
TOMCAT_PID=`ps -ef|grep tomcat|grep -v grep|grep -v script|awk '{print $2}'`
########################################################################################################
########检查更新目录后拉取更新数据包####################################################################
function check_app_update_dir()
{
if [ ! -d $APP_BAK_DIR ];then
mkdir $APP_BAK_DIR
echo "Create directory ‘$APP_BAK_DIR’"
else
echo "Cannot create directory ‘$APP_BAK_DIR’: File exists"
fi
}
function check_archive()
{
rm -rf $APP_BAK_DIR/$APP_BAK_FILENAME
echo "Pull the archive from master $MASTER_IP....."
scp root@$MASTER_IP:$APP_BAK_DIR/$APP_BAK_FILENAME $APP_BAK_DIR
}
check_app_update_dir
check_archive
########################################################################################################
########关闭tomcat函数###################################################################################
kill -9 $TOMCAT_PID &>/dev/null
#########################################################################################################
##########更新app项目####################################################################################
function update_app()
{
rm -rf $APP_INSTALL_DIR
tar -xvf $APP_BAK_DIR/$APP_BAK_FILENAME -C /usr/local/tomcat/webapps/web/
}
update_app
########################################################################################################
########重启tomcat#######################################################################################
$TOMCAT_INSTALL_DIR/bin/catalina.sh start
########################################################################################################
集群升级:
--在master上升级app项目
--传5个脚本文件到对应目录并授予执行权限
命令:chmod +x /script/*.sh
--在minion_ip_list.txt文件里输入所有minon主机的IP,每行一个
--运行备份脚本 master_bak.sh
命令:/script/master_bak.sh
5、tomcat_check.sh #tomcat端口检查脚本,自动开启tomcat进程,手动选择关闭和重启动tomcat进程,选择是否查看启动日志,该脚本为辅助工具,可自由选择是否使用
#!/bin/bash
#################端口号自定义,全局变量################################################################
#tomcat默认端口号8080
TOMCAT_DEFAULT=8080
#获取tomcat当前端口号
TOMCAT_PORT=`ss -nutlp|grep $TOMCAT_DEFAULT|grep java|awk '{print $5}'|awk -F ":" '{print $4}'`
#tomcat安装目录
TOMCAT_INSTALL_DIR=/usr/local/tomcat
#获取tomcat当前进程号
TOMCAT_PID=`ps -ef|grep tomcat|grep -v grep|grep -v script|awk '{print $2}'`
######################################################################################################
######查看实时启动日志函数############################################################################
function read_start_logs()
{
read -p "Would you need to check start logs (y or n)?:" i
if [[ $i = y ]];then
tail -f $TOMCAT_INSTALL_DIR/logs/catalina.out
elif [[ $i = n ]];then
echo "Thanks to use,See you next time. Bye!"
else
echo "You need enter y or n"
echo "Or you can use commond: tail -f $TOMCAT_INSTALL_DIR/logs/catalina.out"
fi
}
######################################################################################################
#####tomcat启动管理函数###############################################################################
if [[ $TOMCAT_PORT -eq 8080 ]];then
echo "Tomcat is already start !"
echo "Tomcat process is: $TOMCAT_PID"
read -p "Would you need to restart or stop tomcat (y=restart/n=stop)?:" i
if [[ $i = y ]];then
#echo $TOMCAT_PID
#ps -ef|grep tomcat|grep -v grep|grep -v script|awk '{print $2}'
echo "Kill tomcat process $TOMCAT_PID"
kill -9 $TOMCAT_PID
echo "Restart tomcat now!"
$TOMCAT_INSTALL_DIR/bin/catalina.sh start
echo "New tomcat process is:`ps -ef|grep tomcat|grep -v grep|grep -v script|awk '{print $2}'`"
read_start_logs
elif [[ $i = n ]];then
echo "Kill tomcat process $TOMCAT_PID"
kill -9 $TOMCAT_PID
echo "Thanks to use,See you next time. Bye!"
exit
else
echo "You need enter y or n, Try to run script again!"
exit
fi
else
echo "Start tomcat..."
$TOMCAT_INSTALL_DIR/bin/catalina.sh start
echo "New tomcat process is:`ps -ef|grep tomcat|grep -v grep|grep -v script|awk '{print $2}'`"
read_start_logs
fi
##########################################################################################################