脚本编程

VPS服务器备份网站到七牛云存储的shell脚本(第二版)

Jager · 8月5日 · 2014年 · 4141次已读

上一篇文章发布了备份网站到七牛的第一版,这次应回复要求先公布同步原理及 shell 源码,让喜欢折腾的人有力可使。其实,这个备份工具的原理非常简单,就是借用了官方的同步工具,配合简单的 shell 语句即可完成。

一、备份原理

简介

qrsync 是一个根据七牛云存储 API 实现的简易命令行辅助上传同步工具,支持断点续上传,增量同步,它可将用户本地的某目录的文件同步到七牛云存储中,同步或上传几百 GB 甚至上 TB 的文件毫无鸭梨。

注意:被同步的文件名和路径必须是 utf8 编码,非 utf8 的文件名和路径将会同步失败

下载

qrsync 命令行辅助同步工具下载地址:

Mac OS: http://devtools.qiniu.io/qiniu-devtools-darwin_amd64-current.tar.gz
Linux 64bits: http://devtools.qiniu.io/qiniu-devtools-linux_amd64-current.tar.gz
Linux 32bits: http://devtools.qiniu.io/qiniu-devtools-linux_386-current.tar.gz
Linux ARMv6: http://devtools.qiniu.io/qiniu-devtools-linux_arm-current.tar.gz
Windows 32bits: http://devtools.qiniu.io/qiniu-devtools-windows_386-current.zip
Windows 64bits: http://devtools.qiniu.io/qiniu-devtools-windows_amd64-current.zip

用法

先建立一个配置文件(JSON 格式),比如叫 conf.json,内容如下:

 

{
    "src":          "/home/your/sync_dir",
    "dest":         "qiniu:
                        access_key=<AccessKey>
                        &secret_key=<SecretKey>
                        &bucket=<Bucket>
                        &key_prefix=<KeyPrefix>
                        &threshold=<Threshold>",
    "deletable":    0,
    "debug_level":  1
}

简单说明:

①、src 表示需要同步的本地目录,比如网站文件打包存放路径:/www/web_backup,或是你网站文件路径:/home/domain/zhang.ge/public_html

②、2 个 Key:access_keysecret_key,进入七牛账号设置界面可以获取到。

③、bucket 表示存放备份文件的七牛空间,建议新建一个。

④、key_prefix 表示存放在七牛空间的上一级目录名称,比如key_prefix=backup/ 则表示备份文件将存放到目标空间下的 backup 文件夹中。参数留空则表示存放到改空间的根目录。

⑤、threshold表示文件分块上传的块大小,单位为字节(Byte),可根据你本地的网络带宽来确定。

⑥、deletable  是否同步删除七牛云上的文件,通常设置 0,当本地文件删除时并不删除存储在七牛的对应文件。如果你想删除本地文件的同时也删除存储在存储在七牛的文件,则设置为 1。

Ps:以上即为此工具必备的参数,更多参数请至七牛官方文档查看。

 

在建立完 conf.json 配置文件后,就可以运行 qrsync 程序进行同步。

Unix/Linux/MacOS 系统可以用如下命令行:

./qrsync /path/of/your-conf.json

Windows 系统用户在 [开始] 菜单栏选择 [运行] 输入 cmd 回车即可打开 DOS 命令行窗口。

假设你的 qrsync.exe 和配置文件都存放在 d:/tools/,则如下执行:

D:\tools\qrsync.exe D:\tools\your-conf.json

需要注意的是,qrsync 是增量同步的,如果你上一次同步成功后修改了部分文件,那么再次运行 qrsync 时只同步新增的和被修改的文件。当然,如果上一次同步过程出错了,也可以重新运行 qrsync 程序继续同步。


 

以上即为各种系统将文件同步到七牛云存储的原理方法,我们换个想法:当我们同步的是网站打包的文件及数据库,那不就变相的实现了将网站备份到七牛云存储了吗?!

二、第二版工具 shell 源码(未完待续...)

仔细看了备份原理,相信有 shell 基础的朋友很容易就可以制作一个自动备份的工具了。

下面公布下张戈写的第二版工具源码:

相比第一版:

①、增加了数据库和网站文件分离机制,可分开设定各自的备份间隔,比如数据库我需要每天备份一次,而网站文件我打算 7 天备份一次;

②、数据库备份文件先压缩后上传,减小文件体积,节省空间流量。

工具文件结构:

[root@zhang.ge ~]# tree qiniu
qiniu
|-- backup              #本地默认同步目录
|-- conf                   #配置文件存放目录
|-- main.sh           #初始化 shell 脚本
|-- QN_backup.sh     #备份及同步 shell 脚本
`-- qrsync
2 directories, 3 files

初始化脚本源码:

[root@zhang.ge ~]#vim main.sh
#!/bin/bash
#Author:ZhangGe
#Des:Backup you website to qiniu CDN.
#Date:2014.7.29
#config Em.
filepath(){
    read -p "Please input the webroot like /domain/zhang.ge/public_html:" filepath
    if [ -z $filepath ];then
        echo Nothing input!Please retry..
        filepath
    elif [ ! -d $filepath ];then
        echo $filepath not found! Press Enter_key retry!
        filepath
    fi
}
access_key(){
    read -p "Please input the access_key:" access_key
    if [ -z $access_key ];then
                echo Nothing input!Please retry..
                access_key
        fi
}
secret_key(){
    read -p "Please input the secret_key:" secret_key
    if [ -z $secret_key ];then
                echo Nothing input!Please retry..
                secret_key
        fi
}
bucket(){
    read -p "Please input the bucket name:" bucket
    if [ -z $bucket ];then
                echo Nothing input!Please retry..
                bucket
        fi
}
mysqluser(){
        read -p "Please input the mysql username:" mysqluser
        if [ -z $mysqluser ];then
                echo Nothing input!Please retry..
                mysqluser
        fi
}
mysqlpd(){
        read -p "Please input the mysql password:" mysqlpd
        if [ -z $mysqlpd ];then
                echo Nothing input!Please retry..
                mysqlpd
        fi
}
backpath(){
        read -p "Please input the backup path:" backpath
        if [ -z $backpath ];then
                backpath=`pwd`/backup
        elif [ ! -d $backpath ];then
        echo $backpath Not exist!!Please retry..
        backpath
        fi
}
dbname(){
        read -p "Please input the database name:" dbname
        if [ -z $dbname ];then
                echo Nothing input!Please retry..
                dbname
        fi
}
d_time(){
        read -p "Please input the db backup rate time(like 1/2/3..30):" d_time
        if [ -z $d_time ];then
              d_time=1
        fi
}
w_time(){
        read -p "Please input the web backup rate time(like 1/2/3..30):" w_time
        if [ -z $w_time ];then
              w_time=7
        fi
}
input(){
        clear
        filepath
        access_key
        secret_key
        bucket
        mysqluser
        mysqlpd
        dbname
        backpath
        d_time
        w_time
        }
input
cd $(cd $(dirname $BASH_SOURCE) && pwd)
echo \{\"src\":\"$backpath\",\"dest\":\"qiniu:access_key=$access_key\&secret_key=$secret_key\&bucket=$bucket\&key_prefix=backup\/\&threshold=512000\",\"deletable\":0,\"debug_level\":1\}>./conf/qrsync.conf
#crontab
test -f  /var/spool/cron/root && cp -f /var/spool/cron/root /var/spool/cron/root_bak
grep -v "QN_backup" /var/spool/cron/root >/var/spool/cron/root
echo "#Add by QN_backup Scripts"                        >>/var/spool/cron/root
echo "0 0 */$d_time * * sh `pwd`/QN_backup.sh db $mysqluser $mysqlpd $dbname $backpath"   >>/var/spool/cron/root
echo "0 0 */$w_time * * sh `pwd`/QN_backup.sh file $filepath $backpath "   >>/var/spool/cron/root
#reload the crontab
/sbin/service crond reload 2>/dev/null
echo =========================The crontab list=================================
crontab -l
echo =========================The crontab list=================================
echo compelet!
exit 0

备份及同步脚本源码:

[root@zhang.ge ~]#vim QN_backup.sh
#!/bin/bash
#Author:ZhangGe
#Des:Compress file
#Date:2014-7-29
TODAY=$(date +%Y-%m-%d)
cd $(cd $(dirname $BASH_SOURCE) && pwd)
if [ -z $1 ];then
        echo Please Usage:./QN_backup.sh back_type filepath backpath..and so on
        exit 1
fi
if [ "$1" == "db" ];then
        mysqluser=$2
        mysqlpd=$3
        dbname=$4
        backpath=$5
        if [ ! -z $backpath ];then
                rm -f $backpath/database_backup*
        fi
        mysqldump -u$mysqluser -p$mysqlpd $dbname>$backpath/database_backup_$TODAY\.sql
        zip --version >/dev/null && zip $backpath/database_backup_$TODAY\.zip $backpath/database_backup_$TODAY\.sql || tar cvzf $backpath/database_backup_$TODAY\.tar.gz $backpath/database_backup_$TODAY\.sql
fi
if [ "$1" == "file" ];then
        filepath=$2
        backpath=$3
        if [ ! -z $backpath ];then
                rm -f $backpath/website_backup*
        fi
        zip --version >/dev/null && zip $backpath/website_backup.$TODAY\.zip $WebRoot || tar cvzf $backpath/website_backup.$TODAY\.tar.gz $WebRoot
fi
./qrsync ./conf/qrsync.conf
exit 0

Ps:由于七牛最近屏蔽了空间内容查看,导致第二版备份工具未进行测试,所以张戈就不发下载地址了,回头测试无误后再来补充下。

写在最后:从前文可以看出,七牛官方提供的同步工具支持多种系统,比如 Windows,有兴趣的朋友可以参考此文,为 Windows 系统的 VPS 服务器写一个批处理脚本,来实现网站备份!当然,有此需求的朋友也可以留言,并提供 Windows 系统的 VPS 主机,只要有空,张戈可无偿添加此批处理脚本。

14 条回应
  1. 2014-8-5 · 12:26

    用了段时间的VPS,感觉太折腾了,又换回虚拟主机。七牛只听说过,没有用过、

  2. 乐心湖 2014-8-5 · 23:11

    七牛有那么好!

  3. 鞋机 2014-8-6 · 9:38

  4. 超級efly 2014-8-6 · 11:04

    前來支持一下~~博主好厲害哇!

  5. Phnomi 2014-8-6 · 19:26

    真不错!支持一下

  6. 學生網 2014-8-7 · 10:57

    我還沒有用過VPS,還是收好了

  7. BabyBichu 2014-8-11 · 12:01

    七牛缓存更新好慢,其他还好

    • avatar
      Jager 2014-8-11 · 14:21

      确实是这样

  8. 站长工具 2014-9-16 · 13:22

    就是借用了官方的同步工具,配合简单的shell语句即可完成

    • avatar
      Jager 2014-9-16 · 13:24

      有意思?

  9. 小幻 2015-8-25 · 13:57

    准备弄个玩玩~

  10. 百易吧 2016-12-7 · 17:59

    不知道博主什么时候可以弄一个rsync自动同步的,要实时同步两台vps的教程,不知道为什么根据网上的教程操作总是失败,总是一堆问题!

    • avatar
      Jager 2016-12-8 · 17:08

      请参考:http://www.ttlsa.com/web/let-infotify-rsync-fast/
      搞不定:https://zhang.ge/pay.html

  11. IT学馆 2017-5-13 · 13:13

    qrsync貌似要停用了。update.itxueguan.com,将你的腾讯云和我用了qshell来做到一起了