美文网首页
一、Tomcat集群上App应用同步更新升级

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

作者: 妄语莫言 | 来源:发表于2018-08-13 16:02 被阅读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
    ##########################################################################################################
    

    相关文章

      网友评论

          本文标题:一、Tomcat集群上App应用同步更新升级

          本文链接:https://www.haomeiwen.com/subject/htdubftx.html