一、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
##########################################################################################################
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容