墙内外服务器数据异地备份方案

作者:wiLdGoose 发布时间:2020 年 5 月 15 日 分类:技术 Technology

我们的宣传口号是:与墙斗,其乐无穷。

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、准备工具

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 -

标签: backup, google, gfw, server

添加新评论 »