墙内外服务器数据异地备份方案
我们的宣传口号是:与墙斗,其乐无穷。
1、墙内服务器
1.1、需求与掣肘
需要对服务器数据进行异地备份,数据量级:GB 级。收费的阿里云 OSS 等用不起,土豪请自便。免费的 Google Drive 连不上。
1.2、方案选型
一番折腾后最终选定七牛云免费 10G 对象存储。不够用就建多个账号,用不同的 butket 来备份。
1.3、准备工具
- 七牛云账号一枚
- 安装 qshell
- 本地备份脚本,若无可参考本文 2.4 部分
1.4、实施细节
下载并设置脚本:
wget -c http://devtools.qiniu.com/qshell-linux-x64-v2.4.1.zip
unzip qshell-linux-x64-v2.4.1.zip
mv qshell-linux-x64-v2.4.1 qshell
chmod +x qshell
前往七牛云密钥管理,找到 AccessKey 与 SecretKey:
添加七牛云账号鉴权:
/path/to/qshell account <AccessKey> <SecretKey> <账户标识>
确认一下:
/path/to/qshell user ls
Name: xxxx
AccessKey: xxxx
SecretKey: xxxx
七牛官方建议大于 100MB 的文件使用 rput 来代替 fput 来实现上传。由于备份文件普通较大,这里统一使用 rput:
/path/to/qshell rput xxxx qshell-linux-x64-v2.4.1.zip /root/qshell-linux-x64-v2.4.1.zip
Uploading /root/qshell-linux-x64-v2.4.1.zip => xxxx : qshell-linux-x64-v2.4.1.zip ...
Put file /root/qshell-linux-x64-v2.4.1.zip => xxxx : qshell-linux-x64-v2.4.1.zip success!
Hash: lhKbzJ8255w0m4BKgtYpPthvU5Mc
Fsize: 9739680 ( 9.29 MB )
MimeType: application/zip
Last time: 23.54 s, Average Speed: 413.8 KB/s
上传多个备份文件,我的思路是:
- 用 bash 脚本跑批
- 事先 tar 到一个文件中,再用 qshell 上传
提供上述第二个方案的初步思路:
tar czf /www/backup/`date +%Y%m%d`.tar.gz /www/backup/site/*`date +%Y%m%d`* /www/backup/database/*`date +%Y%m%d`*
/path/to/qshell rput xxxx `date +%Y%m%d`.tar.gz /www/backup/`date +%Y%m%d`.tar.gz
rm -f /www/backup/`date +%Y%m%d`.tar.gz
至于循环备份,七牛云提供对象存储的生命周期管理。设置一下就行了:
Update:这个生命周期管理不靠谱,发现设置为一天删除也会一直存下去的情况。手动修改前述脚本如下:
#!/bin/bash
date=`date +%Y%m%d`
deldate=`date -d -5day +%Y%m%d`
/path/to/qshell delete xxxx $deldate.tar.gz
tar czf /www/backup/$date.tar.gz /www/backup/site/*$date* /www/backup/database/*$date*
/path/to/qshell rput xxxx $date.tar.gz /www/backup/$date.tar.gz
rm -f /www/backup/$date.tar.gz
2、墙外服务器
2.1、需求与掣肘
也是需要对服务器数据进行异地备份,数据量级:GB 级。优先选择免费的存储,回国较快即可。
2.2、方案选型
经测试,Google Drive 是第一选择。
2.3、准备工具
- Google 账号一枚
- 秋水逸冰的 backup.sh 脚本,已有本地备份策略的请忽略
- 安装 rclone 并完成配置(ref:通过 Rclone 挂载 Google Drive 到 VPS)
2.4、实施细节
若暂无本地备份策略,直接按这个链接的步骤操作即可;若已有本地备份策略,可在 backup.sh 的 BACKUP 数组变量中指定需要异地备份的文件路径,诸如:
BACKUP[0]="/data/backup/www_bak_`date +%Y%m%d`.tgz"
BACKUP[1]="/data/backup/db_bak_`date +%Y%m%d`.tgz"
可根据实际情况修改变量。
关于循环备份的事,若非自有脚本解决,可使用 backup.sh 的相关功能,配置以下两项即可:
LOCALAGEDAILIES(指定多少天之后删除本地旧的备份文件,默认为 7 天)
DELETE_REMOTE_FILE_FLG(删除 Google Drive 或 FTP 上备份文件的 FLG,true 为删除,false 为不删除)
最后,crontab 就略了。别忘记添加环境变量:
SHELL=/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
MAILTO=root
HOME=/root
我在实际配置过程中,曾遇到这样的报错:
Backup progress start
mysql is not installed. Install it and try again
最后在上面的环境变量基础上加上 mysql 的路径得以解决。
crontab -e
头部添加环境变量:
SHELL=/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin:/usr/local/mysql/bin
MAILTO=root
HOME=/root
- EOF -