博主精品——使用Nginx+Shell脚本实现双机热备,无感发包!

DBC 202 0

前情提要

默认小伙伴都是拥有一台云服务器,和一个域名哈[aru_41]

温馨提示

我们的实现思路是这样子的:

  • 所有的请求全分发到主服务,当我们进行主服务更新的时候,主服务会宕机,Nginx会帮我们把请求全部分发到备用服务上面,当主服务更新完成之后,Nginx又会自动的把所有请求全部分发到主服务上,然后我们再更新备用服务器,那么所有的服务器就更新成功了,实现了无感发包!
    • 第一步:启动两个jar包,一个主服务,一个备用服务
    • 第二步:通过 Nginx 的负载均衡来实现双机热备
    • 第三步:1、通过 git 钩子来判断是否有人 push 代码   2、每分钟 pull 一次代码(此教程用这种)
    • 第四步:通过 inotify 来对文件进行监控,如果文件代码有变化,那么就执行无感发包脚本
    • 第五步:无感发包脚本完成之后,我们通过 sendemail 来向我们发送邮件
  • 具体的大体流程如上面所示,详细流程如下

开始教程

第一步

启动 jar 包脚本

RESOURCE_NAME=test1.jar
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Stop Process...'
kill -15 $tpid
fi
sleep 5
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Kill Process!'
kill -9 $tpid
else
echo 'Stop Success!'
fi
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'App is running.'
else
    echo 'App is NOT running.'
fi
rm -f tpid
nohup java -jar  /dbc/dbc/dbc/dbc/dbc/jar/$RESOURCE_NAME  & 
echo $! > tpid
echo Start Success!

博主精品——使用Nginx+Shell脚本实现双机热备,无感发包!插图

解析

这里我们要注意的就是上面图中我箭头指向的jar包名字,这里的脚本的意思就是自动kill掉对应的jar进程,然后再后台运行这个jar包。相信很好理解![aru_43]

第二步

默认你已经有了Nginx了

说个题外话,如果你不知道什么是Nginx估计你看这篇文章也会非常的懵逼,本篇文章不解释相关技术,只注重实现,相关技术自行百度[aru_34]

1.配置一个域名,无论你是子域名还是主域名都可以

2.编写Nginx配置文件

upstream lbs2 {
   server dbc655.top:8081 ;
   server dbc655.top:8082 backup;
}
server {
    listen 80;
    server_name test.dbc655.top;
    location / {
        proxy_pass http: //lbs2;
        proxy_redirect
    default;

        #存放用户的真实ip proxy_set_header Host $host;
        proxy_set_header X - Real - IP $remote_addr;
        proxy_set_header X - Forwarded - For $proxy_add_x_forwarded_for;

        proxy_next_upstream error timeout http_503 non_idempotent;

        #开启错误拦截配置,
        一定要开启proxy_intercept_errors on;

    }#遇见错误码 < 404 500 502 503 504 > ,
    统一转化为200,并且转发到 / default_api这里,由这里返回json数据error_page 404 500 502 503 504 = 200 / default_api;
    location = /default_api {
      default_type application/json;
    return 200 '{"code":"-1","msg":"invoke fail, not found "}';
}
}
解析

可以看到,我们主服务为8081,备用服务为8082,如果主服务挂掉之后,8082才会分发请求

第三步

这里我们可以使用宝塔的计划任务帮助我们实现

解析

我相信很简单,就不说了哈,如果想自己写脚本实现也可以,但是需要自己命令行操作,可能不是特别的方便,如果你是运维当我没说[aru_57]

第四步

编写对应的监控脚本

#!/bin/bash
dir1=/dbc/dbc/dbc/dbc/xxx
dir2=/dbc/dbc/dbc/dbc/xxx
dir3=/dbc/dbc/dbc/dbc/xxx
dir4=/dbc/dbc/dbc/dbc/xxx  #指定需要监视的文件夹
rsync_file=/test.sh        #发现文件有变化时需要执行的脚本文件
while
inotifywait -r $dir1 $dir2 $dir3 $dir4 -e modify,delete,create        #
do  
         bash $rsync_file        #执行同步文件的脚本
done
解析

也非常简单,注释很清楚,我们定义我们需要监控的位置就好了,如果发现文件有变化,我们就执行脚本文件

汇总

完整脚本如下

cd /dbc/dbc/dbc/dbc/dbc


git log -1 --pretty=format:'%an'

rm -f /dbc/dbc/dbc/dbc/dbc/dbc-http/src/main/resources/application-dev.properties


OUTPUT="$(git log -1 --pretty=format:'%an')"

OUTPUT2=" 将代码送到【test128】"

OUTPUT3=${OUTPUT}${OUTPUT2}


sendemail -f dbc@qq.com -t "dbc@qq.com" -s smtp.qq.com:587 -u "${OUTPUT3}" -o tls=yes -o message-content-type=text -o message-charset=utf8 -xu dbc@qq.com -xp uodrerisbemcbfde -m "DBC的无感自动发包即将启动!"

mvn clean 

sendemail -f dbc@qq.com -t "dbc@qq.com" -s smtp.qq.com:587 -u '【test128】主服务正在构建' -o tls=yes -o message-content-type=text -o message-charset=utf8 -xu dbc@qq.com -xp uodrerisbemcbfde -m "【test128】主服务无感构建中!"

mvn install

cd /dbc/dbc/dbc/dbc/dbc/jar

mv dbc-test1.jar

RESOURCE_NAME=dbc-test1.jar
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Stop Process...'
kill -15 $tpid
fi
sleep 5
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Kill Process!'
kill -9 $tpid
else
echo 'Stop Success!'
fi
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'App is running.'
else
    echo 'App is NOT running.'
fi
rm -f tpid
nohup java -jar dbc/jar/$RESOURCE_NAME  & 
echo $! > tpid
echo Start Success!


sendemail -f dbc@qq.com -t "dbc@qq.com" -s smtp.qq.com:587 -u '主服务【test128】无感构建完成' -o tls=yes -o message-content-type=text -o message-charset=utf8 -xu dbc@qq.com -xp uodrerisbemcbfde -m "主服务正在启动中!备用服务正在准备构建!"



cd dbc/test2/dbc

git pull

\cp dbc/application-dev.properties dbc/resources


mvn clean 


mvn install

cd dbc/test2/dbc/jar

mv dbc.jar dbc-test2.jar

RESOURCE_NAME=dbc-test2.jar
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Stop Process...'
kill -15 $tpid
fi
sleep 5
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Kill Process!'
kill -9 $tpid
else
echo 'Stop Success!'
fi
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'App is running.'
else
    echo 'App is NOT running.'
fi
rm -f tpid
nohup java -jar  dbc/jar/$RESOURCE_NAME  &  
echo $! > tpid
echo Start Success!


sleep 30


OUTPUT4="$(tail  -5 dbc/jar/logs/poverty-prevention.log)"

OUTPUT5=" 详细信息请移步DBC宝塔!\n"

OUTPUT6=${OUTPUT5}${OUTPUT4}


sendemail -f dbc@qq.com -t "dbc@qq.com" -s smtp.qq.com:587 -u "DBC无感发包脚本已经全部完成" -o tls=yes -o message-content-type=text -o message-charset=utf8 -xu dbc@qq.com -xp uodrerisbemcbfde -m "${OUTPUT6}"

巨详细解析

上面的脚本我已经进行了重度手动脱敏[aru_35],直接复制粘贴必定报错,所以得带自己的理解来看。我来从开始解释每一行的意思。

  • 第1行
    • 来到你的项目位置
  • 第4行
    • 获取git记录最后一条的作者
  • 第6行
    • 删除备用服务的配置文件(这里是因为我们为了和主服务的端口不一样,修改了配置文件,那么有可能会pull报错,这里我们为了避免报错,直接将它删除,这里也可以使用git忽略文件的操作,博主为了省事直接删除[aru_22])
  • 第9——13行
    • 拼接文本,目的是构建一条语句,告诉我们最后是谁推的代码
  • 第16——20行
    • 发送相关邮件了
  • 第22——26行
    • 相信很清晰,就是打包的操作
  • 第28——54行
    • kill进程,并且启动jar包,然后给我们发邮件
  • 第58——62行
    • 将我们修改过的配置文件强制覆盖到备用服务器的配置文件夹中
  • 第68——97行
    • 打包并kill进程,然后再启动jar包
  • 第100——110行
    • 睡眠30秒后,打印主服务器的最后5行日志并发送邮件告诉我们脚本启动完成,我们可以看到主服务是否启动成功!

大功告成![aru_50]

常见问题

监控突然无效了

温馨提示

这是因为监控的文件数量太多,然后直接爆掉了,我们可以通过修改默认的容量大小来解决这个问题,如下面这个文章操作即可!

inotify参数——文件监控时候的重要参数

5个月前 (07-08) 0
博主精品——使用Nginx+Shell脚本实现双机热备,无感发包!插图2

发表评论 取消回复
表情 图片 链接 代码

分享