值此战疫时期,你感受到“数据明明就在那里,但是我够不到”的无奈了吗?
一封邮件引发的故事
陆陆续续也给VPS做过备份方案,之前一直在用的方案是使用 rclone 来实时备份网站服务器数据 ,然后存储是用了Dropbox,存储了整个数据目录,每两个小时同步一次,国外的VPS连接Dropbox很快。
备份倒是没有出过什么问题,不过最近收到了服务商的邮件,说流量快超了,到后台一看,一个月用掉了800g的流量。。。网站正常流量应该是远远没有这么多的。检查了一下,主要是因为mysql数据库和访问日志文件太大了,尤其是日志,每次同步的时候整个文件重传,用掉了不少流量,虽然已经对日志文件进行了分割,但是单个文件还是不小。之前由于直接用Dropbox,支持增量备份,所以没有太大的问题。
除了流量使用过多之外,直接同步mysql数据文件虽然可以保存所有信息,不过如果在同步过程中服务器宕机,难免会造成数据损坏,其实关于这个教训上一次迁移网站的时候就出现了,丢失了不少数据。虽然Dropbox支持版本恢复,不过那么多文件,恢复不过来,最终还是放弃了。相比较于直接保存原始文件,不如导出每个数据库的数据,这样还可以做多日备份。针对日志文件,不放在服务器备份任务里,而是启用独立的任务,定期将日志收集汇总,这样也可以方便后续的分析。
数据存储商选择
这次备份方案改造除了VPS之外,还计划将NAS的备份纳入进来。Dropbox的空间实在是太小了,付费的话感觉档位太高的,有效数据目前还不到1T。为了以后扩容方便,从安全可靠和价格各方面进行了对比,比较心水的有mega,这家主打隐私,所有数据都会先进行加密,理论上除了你自己,包括服务商在内的其他人都没有办法偷窥你的数据,$100/yr 2T的方案还是比较诱人的,而且mega即便是在国内使用,也是非常快的。但是网盘阵营的缺点很明显,就是可选档位太少,价钱不美丽。One Drive家庭版的价格也很合适。更加心水按量计费、无限容量的备份服务,主打备份的阵营里,Amazon S3比较合适,针对冷数据还推出了Amazon S3 Glacier,价钱是做到了非常低,但是对比了一下,Glacier不适合同步场景,只能做数据新增,与我所想的不符合,遂放弃。最后对比了一圈,选择了BackBlaze B2,每G每月收费$0.005,上传流量不收费,链接里有对比方案,可以看到比Amazon S3还是便宜了不少的。1T的存储量一年大概需要$60,比网盘便宜一点。因为是备份,所以下载流量的价格基本可以忽略不计。
其实还看了大容量的VPS做在线热备,但是价格感觉还是略贵一些,错过了黑五,现在的价格一点也不香。
BackBlaze B2使用
BackBlaze家网上最多是个人备份方案,也就是每个月$6就可以无限量的备份个人数据,不过收费是按照每个设备来收的,如果你只有一台电脑,平时又喜欢收藏很多东西,这个倒是一个很划算的方案了。只要不是太过分,占用几十T的空间,基本上还是不会收到警告的,BackBlaze在国内目前依旧可以使用,至于网速就因人而异了。
我这里选择的是B2方案,不限制设备数量,按量计费,而且还提供了各种平台的客户端,使用上比较方便,免费10G容量,可以用于前期的调试。
注册进入后台,选择新建bucket,可以看到多了一个存储桶,如果你不是要公开这些文件的话,类型选择私有。点击upload/download可以查看当前桶的数据。有一点需要注意一下,就是如果在客户端上对文件进行了修改,web端文件树可能不会实时更新,需要点击刷新标志进行刷新。这家会话失效的特别快,经常需要重新登录,然后建议开启二步登录验证。
作为一个比较成熟的备份服务,客户端登录使用的是加了限制的Token,而不是拥有全部权限的账号密码。
在最左边的菜单里找到App Keys
,然后点击Add a New Application Key
新增一个Key,秉持了每个key专用的原则,尽可能减少每一个Key的使用范围,比如它能访问到的桶,以及读写权限。这里本来是想设置成Write Only
,但是发现没有Read
权限rclone
同步时会提示未授权。
创建Key成功后,会显示你的id和key,其中key只会出现一次,所以要记好。
还是使用rclone来处理b2。
1 | $ rclone config |
可以使用 rclone lsd b2:/
来查看bucket数据,以及使用rclone sync
命令来同步文件夹。
备份方案改造
改造流程不算特别复杂,每个网站自身的配置文件代码等等因为基本不变化,所有可以备份原始文件,数据库的数据每次先导出。
首先创建一个今日份的备份文件,然后针对每一个站点,导出它的数据。
1 | BASE_DIR=/mnt/backup/$(date +"%Y-%m-%d") |
这里要写一个过滤规则,把mysql数据文件、日志文件排除掉。
1 | # # But only backup these matches |
有几个需要注意的地方:
- 文件按照顺序优先匹配的原则,所以范围广的要写在最后
- 这里是相对同步目录来算的,所以不用写操作系统的绝对目录
然后同步到存储服务中。
1 | rclone sync \ |
为了防止备份数据越来越多,删除七天前的备份文件。
1 | # Remove backups 7 days ago |
自动定时备份
光有备份脚本还不行,自己手动执行既麻烦又不靠谱,利用系统的定时任务来执行。
1 | # crontab -e |
每小时同步一次。这里有一点要注意一下,前面备份的文件夹是精确到日期,所以每次同步都会覆盖当天的上一次备份。