一、Tomcat集群上App应用同步更新升级

2018-08-13  本文已影响0人  妄语莫言

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
##########################################################################################################
上一篇下一篇

猜你喜欢

热点阅读