返回

网站数据备份七牛云存储实现

虽然意识到数据的重要性,但是到现在依然没有做VPS的数据文件备份工作。 昨天遭遇《有人搞事 今天遭遇DDoS攻击》后,夜里突发奇想,开始做起来了。

我的想法是

因为现在这台主机的带宽只有1M,但我发现下载七牛的文件突发能达到10多M,所以干脆直接备份到七牛云存储好了。

  • 需要备份网站根目录下的所有文件
  • 需要备份所有的数据库文件
  • 最好数据库能独立备份成一个文件,方便还原
  • 频率一天一次

有了这个初步想法于是就开始做了!

  • 数据导出以及文件打包

/srv/backup下创建备份脚本backup.sh,并编辑如下:

vim /srv/backup/backup.sh

#!/bin/bash
find /srv/backup/2016 -type f -mtime +7 -exec rm {} \;
tar zcvf /srv/backup/2016/Files_$(date +%F).tar.gz /srv/www/html
tar zcvf /srv/backup/2016/Config_$(date +%F).tar.gz /etc/nginx/nginx.conf /etc/nginx/sites-available /etc/php5/fpm/php.ini
mysqldump -uNAME -pPASSWORD --events --ignore-table=mysql.events --all-databases > /srv/backup/2016/Data_All_$(date +%F).sql
mysqldump -uNAME -pPASSWORD qq> /srv/backup/2016/Data_qq_$(date +%F).sql
mysqldump -uNAME -pPASSWORD typecho> /srv/backup/2016/Data_typecho_$(date +%F).sql
mysqldump -uNAME -pPASSWORD shudong> /srv/backup/2016/Data_shudong_$(date +%F).sql
mysqldump -uNAME -pPASSWORD shudongipa> /srv/backup/2016/Data_shudongipa_$(date +%F).sql
mysqldump -uNAME -pPASSWORD yiyan> /srv/backup/2016/Data_yiyan_$(date +%F).sql
nohup ./qrsboxcli sync >/dev/null 2>&1 &

实现:

  1. 删除/srv/backup/2016下超过7天的文件
  2. 按Files_+日期为文件名备份网站目录/srv/www/html
  3. 按Date_All_+日期为文件名导出所有数据库
  4. 按Date_库名_+日期为文件名导出各个数据库
  5. 数据备份同步到七牛云(见下文)

相关参数: -type f 查找文件 -type d 查找目录

-mtime -7 修改时间在7天内 -mtime +7 修改时间在7天前

-exec rm {} ; 将找到的文件 (假定找到文件的名字为 a.txt), 执行 rm a.txt 命令

数据备份传输

使用到的是七牛的开发者工具qrsbox

简介 qrsbox 是七牛云存储提供的同步上传客户端工具,支持 Linux、Mac OS X、Windows 等操作系统。使用 qrsbox,可将用户本地某个目录的所有文件同步上传到七牛云存储中,同时监控目录变化,将目录中新增的文件也上传至七牛云存储。

配合操作系统已有的强大文件管理功能(分级存放、按指定项目排序、查找匹配指定条件的文件等),即可轻松优雅地完成繁复的文件管理事务。

注意:qrsbox 不会同步文件的删除操作。也就是说,如果受监控的目录中有文件被删除,已上传至七牛云存储的文件副本仍旧保留。如果用户确实需要删除该文件,可以到七牛开发者平台中删除。这一设计的目的是为了防止误删文件造成数据丢失。同时还可以收获另一个好处,就是同步上传完一个文件后,本地可以马上删除该文件以释放磁盘空间。

功能特性

  • 支持配置文件
  • 支持大文件上传
  • 支持增量部分同步更新
  • 支持在后台运行监控

下载

cd /srv/backup
wget http://devtools.qiniu.com/linux/386/qrsboxcli

我这里使用的是32位的,根据实际情况自己选择。

然后,执行以下命令进行初始化:

./qrsboxcli init <AccessKey> <SecretKey> <SyncDir> <Bucket> [<KeyPrefix>]

如: ./qrsboxcli init KnSkyJ8rIiG3UXXqOGcbK58VdK2FlILofbrZbVKA Rzg8EjYGCLBNkXXH75h3zgPgNZod1zmXU0pKWF26 /srv/backup/2016 backup

参数名称以及说明 SyncDir 本地的同步目录,该目录下的文件会随时同步上传至七牛云存储 Bucket 保存同步文件的资源空间名 KeyPrefix 文件前缀,可选。如果设置了该参数,那么上传的文件名前都会加上前缀。这个前缀主要用于在空间中区分不同上传来源的文件 最后,可以使用以下命令开始文件同步:

./qrsboxcli sync &

这里使用了 & 符号,让同步客户端进程运行在后台。如果退出终端后程序中断,请使用以下命令代替:

nohup ./qrsboxcli sync >/dev/null 2>&1 &

用户可以通过以下命令查看同步过程:

./qrsboxcli log

如果需要停止后台运行的 qrsboxcli,可以使用如下命令:

./qrsboxcli stop

如果希望改变同步目录、bucket 等运行参数,需要先用 stop 命令停止 qrsboxcli 的后台程序,重新用新的参数运行初始化命令,然后再次启动同步程序,qrsboxcli 会立刻按新的配置将新目录的文件同步至七牛云存储。

crontab定时执行任务 最后我们通过计划任务,定时运行备份脚本:

21 3 * * * sh /srv/backup/backup.sh

每日凌晨3点21分开始计划任务。

更新:

通过以上的操作,虽然实现了网站的数据文件的备份工作,但是七牛的存储空间会呈现爆炸式的增长。要自己手动去清理。

于是想出了一个优化方案。

在上面的方案中,即使昨日和今日的文件没有产生变化,依旧会产生一个备份文件,且名字和昨日不一但是文件大小等内容均一致。造成七牛云和服务器每天都要传输一遍这些内容。

进一步优化实现:

  1. 删除/srv/backup/2017下超过7天的文件避免服务器上文件堆积爆炸
  2. 备份网站目录/srv/www/html 不按Files_+日期为文件名
  3. 导出所有数据库 不按Date_All_+日期为文件名
  4. 不导出各个数据库了 且不按Date_库名_+日期为文件名
  5. 数据备份同步到七牛云(见下文)
  6. php配置文件路径更新

/srv/backup下创建备份脚本backup.sh,并编辑如下:

#! /bin/bash
find /srv/backup/2017 -type f -mtime +7 -exec rm {} \;
tar zcvf /srv/backup/2017/Files.tar.gz --exclude=/srv/www/html/phpmyadmin  /srv/www/html
tar zcvf /srv/backup/2017/Config.tar.gz /etc/nginx/nginx.conf /etc/nginx/sites-available /etc/php/7.0/fpm/php.ini  /etc/php/7.0/fpm/pool.d/www.conf
mysqldump -uNAME -pPASSWORD --events --ignore-table=mysql.events --all-databases > /srv/backup/2017/Data_All_$(date +%F).sql
mysqldump -uNAME -pPASSWORD typecho> /srv/backup/2017/Data_typecho.sql
mysqldump -uNAME -pPASSWORD shudong> /srv/backup/2017/Data_shudong.sql
nohup ./qrsboxcli sync >/dev/null 2>&1 &

64位的qrsbox下载

cd /srv/backup
wget http://devtools.qiniu.com/linux/amd64/qrsboxcli
chmod u+x qrsboxcli

后续步骤参照上面即可!

P.s.:数据库恢复

mysql -uUSER -PPASSWORD
source backup.sql;
Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 12, 2018 15:13 UTC