zoukankan      html  css  js  c++  java
  • 远程多台服务器备份数据方案

    场景是这样的,新接手的项目,在国外的服务器有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覆盖也都是可以的,最终的目的都是在利用少量的成本下达到代码的分发效果。

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

  • 相关阅读:
    快速幂算法
    素数筛
    数论知识点总结
    ABOUT MY NAME
    CF1043F Make It One
    树形DP
    魔兽世界联盟8.1主线任务
    模板std::mutex用法:
    【转】正确的提问方式
    第一个Python游戏窗口
  • 原文地址:https://www.cnblogs.com/duplicatedcode/p/3036790.html
Copyright © 2011-2022 走看看