远程多台服务器备份数据方案

场景是这样的,新接手的项目,在国外的服务器有10多台,国内的几台,部署要求在ant代码前必须全备份上一个版本,早上登录了国内的几台机器操作后,一阵烦躁,看到四川人民在受苦受难,自己的家人也遭受了几次余震,远方的人可能更加担心。尝试了下 ssh 执行远程命令,无奈于仅有的普通用户权限,写了个 sh脚本,可以ssh到每台机器执行进行备份,但是每次都要输入密码,郁闷非常。先贴一下这个 备份脚本

echo "start dump tomcat source "
# config your web project name
project_name=test
# default you can rewrite 
date_str=$(date +%Y%m%d)
# config path
extdir='/data/apache-tomcat/webapps/'
cd $extdir
# default
sudo tar -zcvf $project_name$date_str.tar.gz $project_name
echo "dump success the file at "$extdir$project_name$date_str".tar.gz"

这个会在你的工程文件夹下生成部署文档要求的备份文件,然后通过scp 命令将该文件都下载到了20台机器中,又一阵吐血

当要一个个ssh执行脚本,但是每次都要输入密码,就胃疼的厉害,于是有了下面的偷懒脚本

#!/usr/bin/expect -f
set time 30
set ipaddr "192.168.1.111"
set ipport "212"
set username "duplicatedcode"
set password "duplicatedcode"
set sh_path "/home/duplicatedcode/script/dumpTomcatSource.sh"
spawn /usr/bin/ssh -p $ipport $username@$ipaddr "sh $sh_path"
expect {
   "yes/no" {send "yes\r";exp_continue}
   "password:" {send "$password\r"}
}
expect "*]#"
exit

此时新的问题又出现了,我每次多要更改此文件,ip,端口,用户名,密码,地址,所有就有了下面的脚本

dumpFunction.sh

#!/usr/bin/expect -f
set time 30
set ipaddr [lindex $argv 0]
set ipport [lindex $argv 1]
set username [lindex $argv 2]
set password [lindex $argv 3]
set sh_path [lindex $argv 4]
spawn /usr/bin/ssh -p $ipport $username@$ipaddr "sh $sh_path"

expect {
   "yes/no" {send "yes\r";exp_continue}
   "password:" {send "$password\r"}
}
expect "*from*"

其实就是封装了一个方法,然后传入动态的参数,能够批量执行,又有下面的脚本

#!/bin/bash

# config syscofle
file_path=dump.conf
#config sh path
sh_dir=/home/duplicatedcode/script/dumpFunction.sh

#i # ipaddr
for i in `awk '{print $1}' $file_path`

do

# ipport
j=`awk -v I="$i" '{if(I==$1)print $2}' $file_path`

#username
k=`awk -v I="$i" '{if(I==$1)print $3}' $file_path`

#password
l=`awk -v I="$i" '{if(I==$1)print $4}' $file_path`

#sh_path
m=`awk -v I="$i" '{if(I==$1)print $5}' $file_path`

expect $sh_dir $i $j $k $l $m

done

awk 很久之前用过处理文件,现在又还回去了,这个sh脚本肯定有优化的空间,但是时间紧迫,就先这么着吧,虽然写的萌些,但是易读,大体的意思是读取dump.conf 文件,然后分解出需要的参数,一个for循环 执行代码,配置文件如下:

 

192.168.162.1 222 username password /home/duplicatedcode/script/dumpTomcatSource.sh
192.168.162.2 222 username password /home/duplicatedcode/script/dumpTomcatSource.sh
192.168.162.3 222 username password /home/duplicatedcode/script/dumpTomcatSource.sh

配置文件中格式是

ip 端口 用户名 密码 脚本地址

就是这么简单,然后我在一台机器上执行 dumpAll.sh  全部机器就按照部署规范进行备份了

知识点:一个是自动填充密码的,except 具体使用方法可自行google

         简单的sh脚本

扩展支持:

    如果你的应用服务器是用tomcat 那你可以找一个tomcat自启动脚本,然后像上述的思路中替换sh脚本,就可以达到全服务器重启tomcat了,当然要一台台启动,顺序来,不然蛋疼的是你自己,想想你kill掉所有的tomcat 然后启动不来的场景,启动后,最重要的就是服务的可用性,那你可以写个wget脚本,每台机器load数据,看看数据库连接,tomcat是否启动成功等也是可以的。

上面的有点像自动部署了,上面只是服务器端的自动部署的思路,包括备份,重启 ,最蛋疼的是代码的增量同步,全量覆盖谁多会做,难点在增量,我想可以结合svn的版本号来搞,服务器上直接源代码,然后增量同步代码,全量编译代码。ps:一些自动同步代码的工具列如rsync都可以实现增量,但是对比文件的时候cpu很高,基本是处于down掉的情况下,如果你的目录很多的话,你也可以取个巧,利用vi命令,在变化的目录中维护一个readme的文件,利用vi命令可以使文件夹最后修改时间的传递性,达到检查文件也能增量来比较,或者比较多不用了,直接覆盖,这样或许你需要修改rsync的源代码了,可能不可取。

  另外一种比较好的策略是,分流,做三级的rsync,1-3-9这种模式,每台机器管理同步3台机器,减少每台机器的压力,或者你自己实现一个jsp来检查文件修改时间,然后通过ftp覆盖也都是可以的,最终的目的都是在利用少量的成本下达到代码的分发效果。

或许我有兴趣搞个可以用的自动部署方案出来。(待续)

你可能感兴趣的:(远程多台服务器备份数据方案)