内网后台同步到线上

内网后台同步到线上

一、需求引入

  上周四公司突然来个通知,说周五停电,放假一天,周六补班(工作日不上班我内心其实是窃喜的。。。因为上到周四感觉人已经比较疲累了,一定是年龄上去了的缘故 = =)

  停电意味着内网两台大服务器需要关机,关机意味着内网后台新闻发布不了,如下图。即定时上传那条路径因为没电的原因,断了。内容发布网站最重要的事通常就是每天更新内容嘛~~~当时大家都慌了,尤其老板。本来听说连停三天(周五

六、日),那就更恐怖了,3天内容不更新,中心肯定不高兴的。一边老板在看能不能临时借个类似UPS的电源,供电一天(据说公司的UPS最多只能支持供电2~3小时);一边行政经理打12345投诉。最终结果是投诉是有效的,只停周五1天,借不了UPS。老板脑洞大开,还想把两台巨无霸服务器载回家去,通电来维持这个新闻发布,想想真觉得不可思议 = =

  最终我们的开发,本着大无畏精神,决定把内网后台拉下来,放到自己办公电脑上,然后把硬盘拆下来带回家,如果真的急着更新文章,就自己发。

  幸好周五大概晚上7点的时候有电了,如果真要发文章,可以找住公司附近的同事去开服务器,开发也省事不用在自己家里电脑跑后台发新闻,据我了解应该是不急着更新的,周六回来才搞起。

  前面来龙去脉讲完(一匹布甘长 。。。)

  正题来了,老板觉得这样风险太大,漫漫暑热才刚开始,谁知道三天两头又来停电的~~开发拉后台代码到本地也挺久,因为很大,而且还得把数据库导下来,这样才能保证数据是最新的。注意上图的公司内部服务器,实际上既包括后台,也包括数据库!所以老板希望我做个把后台同步到gitlab上的,再同步到线上,防止再出现这种停电无法更新新闻的情况。

二、实现思路及问题处理

  首先我要澄清一下,上面那个图的传输同步,实际上仅仅是资源目录同步,什么意思呢,请看下图(有点丑,大家将就下)

  

  本地后台代码目录文件及文件夹实际上只有一份!现在就需要把代码目录文件和文件夹都要同步到gitlab上。

   实现思路:

  (1)后台代码目录文件拷贝一份做同步测试

  (2)gitlab上新建一个任务用于放代码目录文件及文件夹,其中需要排除静态资源目录的软连接,因为已经做过同步了

  (3)线上服务器定时拉取

  一些问题处理:

  问题一:内网软连接同步处理

  (1)后台代码目录整个拷贝一份的时候,软连接还是有的,虽然不会上传。gitlab对于已存在的目录上传,命令是这样的:

1 cd 拷贝的后台代码目录
2 git init
3 git remote add git地址
4 git add .
5 git commit -m "Initial commit"
6 git push -u origin master

  直接同步到线上,会报错软连接目的目录找不到,因为内网和线上的用户及目录稍有不同,其实“——>” 过去的目录是闪烁状态的,也就是找不到的意思。

  

   当时git push上去已经传到gitlab上了,我就尝试用.gitignore 和 .git/info/exclude 来控制不上传,发现还是没效果,最终处理方法是删除,就是上面的r、u、html。然后线上只需要改一次软连接到线上的资源目录就好。当然也可以在每次同步到线上之后,删除线上的软连接重新做(同步过去的软连接实际上是内网的软连接),不过我觉得这样处理比较麻烦。

cd xxx/gz_houtai
rm -rf html u r

   问题二:内网数据库配置连接文件不同步到gitlab处理

   这个文件就不能删了,必须传到gitlab上,不然会影响完整性,即数据库连接文件都删除了,整个后台跑不动。

   首先也是可以像问题一那种麻烦的方法,每次同步到线上之后用线上的数据库连接文件覆盖,不过我觉得太麻烦。

   我是参考这个文章解决的:https://www.cnblogs.com/mafeng/p/7635228.html

   因为已经上传过jdbc.properties 上了

git update-index --assume-unchanged WEB-INF/config/jdbc.properties

  效果如下:

 (a)内网服务器数据库连接文件

 (b)gitlab保存的数据库连接文件

 

 证明了内网提交没有同步到gitlab上了

假设如果想改成线上配置连接,可以直接在gitlab上的web页面修改

如下操作:

线上服务器读取了gitlab上的数据库连接文件,不然连不了内网的数据库ip(192.168.0.0/24 网段),这里是通过ngrok代理内网数据库,成了公网连接,这样线上服务器也能连。

 

   当然如果真的停电,这个连接配置文件要改成线上的库。所以第3个问题是内网数据库同步到线上

  

   问题三:内网数据库同步到线上

  直接贴脚本算了,因为ngrok代理的内网数据库,成了公网域名连接,所以mysqldump下来非常慢,足足半个小时,所以一天同步2次绰绰有余。如果知道停电手动运行一次更新mysql也行。

  cat mysql_sync.sh

  

 1 #!/bin/bash
 2 ## 内网数据库同步到线上天翼数据库
 3 ## on 20210518 by ljy
 4 
 5 Dump='/usr/bin/mysqldump'
 6 
 7 local_ip='ngrok.xxx.cn'
 8 local_port=xxx
 9 local_bak='/home/ljy/data_bakup/mysql_local'
10 [ ! -d ${local_bak} ] && mkdir -p ${local_bak}
11 
12 LogFile='/home/ljy/data_bakup/mysql_local/bak.log'
13 Begin=`date +"%Y年%m月%d日_%H:%M:%S"`
14 
15 echo "$Begin 数据库开始备份。。。" >> ${LogFile}
16 
17 local_user=xxx
18 local_pwd=xxx
19 db='xxx'
20 
21 remote_ip=xxx
22 remote_port=xxx
23 remote_user=xxx
24 remote_pwd='xxx'
25 
26 export LANG=en_US.UTF-8
27 Date=`date +%Y%m%d_%H%M`
28 DumpFile=$Date.sql
29 
30 ### 1、备份内网数据库
31 ${Dump} -u${local_user} -p${local_pwd} -h${local_ip} -P${local_port} ${db} > ${local_bak}/${db}_${DumpFile}
32 
33 ### 2、导入到线上mysql
34 mysql -u${remote_user} -p${remote_pwd} -h${remote_ip} -P${remote_port} ${db} < ${local_bak}/${db}_${DumpFile}
35 
36 
37 ### 3、写入到日志
38 End=`date +"%Y年%m月%d日_%H:%M:%S"`
39 echo "$End 数据库同步完成。。。" >> ${LogFile}
40 echo "############" >> ${LogFile}
41 
42 ### 4、定时删除备份的数据库
43 find ${local_bak} -type f -mtime +1 -exec rm -f {} ;
原文地址:https://www.cnblogs.com/windysai/p/14782818.html