chaihongjun.me

网站服务器本地及七牛云远程备份

网站服务器本地及七牛云远程备份

前段时间爆出腾讯云出故障,然后创业企业数据丢失,造成的损失非常大。虽然使用的是阿里云的主机,但想到同样是国内的云主机就有点瑟瑟发抖,经费充足的企业可以同时在阿里云和腾讯云做好双备份,那么没有经费的我们就只好自己想办法解决,两年前写过一篇文章《linux服务器本地及七牛云远程备份》,现在看来依然有效,今天则是对那篇文章进行一次更新,大体上的流程和思路还是差不多的,只有细节地方有差异。

首先做一个备份的整体思路介绍:

  1. 本地备份:首先使用脚本对服务器上的网站数据库和网站文件做整体备份,保存周期为最近7天,存放在服务器单独一个备份目录中

  2. 远程备份:再使用七牛云的工具将在本地(服务器的备份目录)中的已经备份的文件同步传输到七牛云的空间中

首先介绍一下本地备份,本地备份主要靠如下的脚本:

#!/bin/bash
#Author:ZhangGe
#Modification by:chaihongjun
#Des:Backup database and webfile.
#Date:2018-8-16
TODAY=`date +%u`
if [ -z $1 ];then
        echo Needed Usage arguments. Please Use --help to get more infomation.
        exit 1
fi
if [ "$1" == "db" ];then
        domain=$2
        dbname=$3
        mysqluser=$4
        mysqlpd=$5
        back_path=$6
        test -d $back_path || (mkdir -p $back_path || echo "$back_path not found! Please CheckOut Or feedback to zhangge.net..." && exit 2)
        cd $back_path
        mysqldump -u$mysqluser -p$mysqlpd $dbname --skip-lock-tables>$back_path/$domain\_db_$TODAY\.sql
        test -f $back_path/$domain\_db_$TODAY\.sql || (echo "MysqlDump failed! Please CheckOut Or feedback to zhangge.net..." && exit 2)
        zip --version >/dev/null && zip -Pchaihongjun -m $back_path/$domain\_db_$TODAY\.zip $domain\_db_$TODAY\.sql
elif [ "$1" == "file" ];then
        domain=$2
        site_path=$3
        back_path=$4
        test -d $site_path || (echo "$site_path not found! Please CheckOut Or feedback to zhangge.net..." && exit 2)
        test -d $back_path || (mkdir -p $back_path || echo "$back_path not found! Please CheckOut Or feedback to zhangge.net..." && exit 2)
        test -f $back_path/$domain\_$TODAY\.zip && rm -f $back_path/$domain\_$TODAY\.zip
        cd $site_path && cd ..     
        zip --version >/dev/null && zip -Pchaihongjun -9r $back_path/$domain\_$TODAY\.zip $site_path
elif [ "$1" == "--help" ];then
        clear
        echo =====================================Help infomation=========================================
        echo 1. Use For Backup database:
        echo The \$1 must be \[db\]
        echo \$2: \[domain\]
        echo \$3: \[dbname\]
        echo \$4: \[mysqluser\]
        echo \$5: \[mysqlpassword\]
        echo \$6: \[back_path\]
        echo
        echo For example:./chaihongjun.me_backup.sh db chaihongjun.me chaihongjun.me root root /alidata1/local_backup/chaihongjun.me >/dev/null 2>&1
        echo
        echo 2. Use For Backup webfile:
        echo The \$1 must be [\file\]:
        echo \$2: \[domain\]
        echo \$3: \[site_path\]
        echo \$4: \[back_path\]
        echo
        echo For example:./chaihongjun.me_backup.sh file chaihongjun.me  /alidata1/www/web/chaihongjun.me /alidata1/local_backup/chaihongjun.me >/dev/null 2>&1
        echo =====================================End of Help==============================================
        exit 0
else
        echo "Error!Please Usage --help to get help infomation!"
        exit 2
fi

将上面的脚本文件保存成.sh结尾的文件(文件就放在root家目录下好了),比如backup.sh,并且授予可执行权限,即:

chmod +x backup.sh

使用方法:

#### 如果是想备份网站的数据库
/root/backup.sh db 网站域名 网站数据库名 数据库用户 数据库密码 数据库备份路径
# 参数说明
# db 如果是备份数据库,则这个第一个参数是必须的
# 网站域名  就是你的网站域名比如 www.domain.com
# 网站数据库名 就是你的网站mysql的数据库名称比如  www_domain_com
# 数据库用户 连接数据库用的一般是root,也可能是单独设置的
# 数据库密码 连接数据库用的密码
# 数据库备份路径 脚本备份数据生成的.sql文件存放的地方 

##  假设我想将网站  备份到 /data/local_backup/databases 目录下(数据库用户名和密码都是root)
/root/backup.sh db www.domain.com  root root /data/local_backup/databases

#### 如果是想备份网站程序文件
/root/backup.sh file 网站域名 网站路径 网站文件备份路径
# 参数说明
# file 如果是备份网站程序文化,则这个第一个参数是必须的
# 网站域名 就是你想备份的网站域名 比如   www.domain.com
# 网站路径 你的网站存放的绝对路径 比如  /data/www/www.domain.com
# 网站文件备份路径 网站文件打包备份之后想存放的地方 比如 /data/local_backup/websites

## 假设为想将网站 的全部文件打包到 /data/local_backup/websites
/root/backup.sh file www.domain.com  /data/www/www.domain.com  /data/local_backup/websites   

### 注意这里涉及文件路径都是绝对路径

再来说说这个脚本和之前的变化,其实就在程序文件打包这里,之前要求网站的域名名称和网站目录的名称必须一致,不然无法打包:

# 之前那个文章的脚本可以执行
/root/backup.sh file www.domain.com  /data/www/www.domain.com  /data/local_backup/websites 
# 之前那个文章的脚本执行不了
/root/backup.sh file www.domain.com  /data/www/domain  /data/local_backup/websites 


# 现在这个脚本可以执行
/root/backup.sh file www.domain.com  /data/www/www.domain.com  /data/local_backup/websites 
# 现在这个脚本依然可以执行
/root/backup.sh file www.domain.com  /data/www/domain  /data/local_backup/websites

目前这个脚本对已经运行的网站更有友好,不需要目录名称必须和域名一致。另外注意,脚本里面的压缩密码请改成自己的,或者去掉密码设置。

前面介绍完了本地的备份(网站程序文件会打包并zip压缩,数据库sql文件也会zip压缩),后面继续介绍将本地备份的文件同步到七牛云端。依然是思路介绍:

  1. 在七牛云创建存储空间配置密钥,注意设置好空间名称

  2. 从七牛云开发者中心下载开发者工具(qshell)并放到服务器上

  3. 初始化qshell工具

  4. 配置同步传输文件

1.创建存储空间很简单,登录七牛之后进入控制台,点击左侧的菜单栏“对象存储”

网站服务器本地及七牛云远程备份

再点击“新建存储空间”

网站服务器本地及七牛云远程备份

然后,依次设置空间名称,存储区域和访问控制。空间名称建议使用和域名相关的名称,比如域名是www.domain.com,那么空间名称就domain吧。存储区域根据你自己的想法来,服务器可能在华东或者华南,但是考虑到后续从七牛云下载这个备份,本人又在华南,所以把备份文件就存储在华南,方便以后下载。访问控制建议设置私有空间,提高安全性,防止未授权非法下载我们的文件。

网站服务器本地及七牛云远程备份

另外一个密钥设置,这里就不在赘述。如果没有使用过密钥,请点击进入控制台之后右上角的“个人面板”-“密钥管理”去申请配置,后面服务器传输文件到七牛云需要密钥。

2.接着下载工具

进入这个页面(https://developer.qiniu.com/kodo/tools/1302/qshell ) 在服务器上下载这个文件,或者本地下载完上传到服务器。下载之后解压完有好几个平台的文件,我们的是centos64位,所以使用qshell_linux_x64。

为了方便文件名改成了qshell_backup,记得授权这个文件可以执行权限。同样为了方便这个文件就放在root的家目录下面了。

3.初始化这个工具

初始化有两个步骤,首先是账户设置也就是涉及到密钥配置。

/root/qshell_backup account AK SK

# 这里的AK和SK请替换成密钥管理那里申请的值

 4.然后写两个配置文件:

db_backup2qiniu.conf 传输网站数据库文件到七牛的配置文件

{
   "src_dir"            :   "/data/local_backup/databases", 
   "access_key"         :   "AK",
   "secret_key"         :   "SK",
   "bucket"             :   "domain",
   "zone"               :   "hn",
   "rescan_local"       :   true,
   "skip_path_prefixes" :   ".qshell",
   "overwrite"          :   true,
   "check_hash"         :   false 
}

files_backup2qiniu.conf 传输网站文件到七牛的配置文件

{
   "src_dir"            :   "/data/local_backup/websites",
   "access_key"         :   "AK",
   "secret_key"         :   "SK",
   "bucket"             :   "domain",
   "zone"               :   "hn",
   "rescan_local"       :   true,
   "skip_path_prefixes" :   ".qshell",
   "overwrite"          :   true,
   "check_hash"         :   false 
}

将以上两个文件也存放在root家目录下,特别注意,scr_dir换成你的本地备份目录(前面本地备份存放的路径),access_key 和 secret_key换成你的ak,sk。

zone的值hn表示华南地区。

命令描述必须指定
ak七牛账号的AccessKey,可以从七牛的后台获取。
sk七牛账号的SecretKey,可以从七牛的后台获取。
bucket文件抓取后存储的空间,为空间的名字。
job任务的名称,指定这个参数主要用来将抓取成功的文件放在本地数据库中,便于后面核对。
file待抓取资源链接所在文件的本地路径,内容由待抓取的资源外链和对应的保存在七牛空间中的文件名组成的行构成。
worker抓取的并发数量,可以适当地指定较大的并发请求数量来提高批量抓取的效率,可根据目标源站实际带宽和文件平均大小来计算得出。
zone请求发送的入口区域,可以不指定,默认为 nb,即华东区域;华北区域需设置为 bc;华南区域需设置为hn;北美区域需设置为na0。

请求发送的入口区域,可以不指定,默认为 nb,即华东区域;华北区域需设置为 bc;华南区域需设置为hn;北美区域需设置为na0。

前面在控制台选择的是华南,所以这里设置成hn,bucket是设置的存储空间的名字。rescan_local设置之后只会同步变动的部分,不会全部重新同步。至此配置全部完成。

使用方法:

# 同步备份数据库文件到七牛云
/root/qshell_backup qupload 10 /root/db_backup2qiniu.conf

# 同步备份网站文件到七牛云
/root/qshell_backup qupload 10 /root/files_backup2qiniu.conf

本地备份和远程备份都可以顺利进行了。但是每天都去手动去执行命令显得繁琐,通过crontab制定一个定时任务,每天在凌晨时间先本地备份,再将本地备份文件同步到七牛云:

# 先本地备份
0 1 * * * /root/backup.sh db www.domain.com www_domain_com root root /data/local_backup/databases >/dev/null 2>&1 &
0 1 * * * /root/backup.sh file www.domain.com /data/www/www.domain.com /data/local_backup/websites >/dev/null 2>&1 &
# 延后一段时间再同步到七牛云
0 2 * * * /root/qshell_backup qupload 10 /root/db_backup2qiniu.conf >/dev/null 2>&1 &
0 2 * * * /root/qshell_backup qupload 10 /root/files_backup2qiniu.conf >/dev/null 2>&1 &

对于这几个定时任务可以先去掉重定向输出的内容>/dev/null 2>&1 & 检测任务执行是否OK。 

知识共享许可协议本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。作者:柴宏俊»