鱼喃

听!布鲁布鲁,大鱼又在那叨叨了

VPS、NAS个人数据备份方案-BackBlaze B2

值此战疫时期,你感受到“数据明明就在那里,但是我够不到”的无奈了吗?

一封邮件引发的故事

陆陆续续也给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,比网盘便宜一点。因为是备份,所以下载流量的价格基本可以忽略不计。

19193723905630451ad405b9893735df.png

其实还看了大容量的VPS做在线热备,但是价格感觉还是略贵一些,错过了黑五,现在的价格一点也不香。

BackBlaze B2使用

BackBlaze家网上最多是个人备份方案,也就是每个月$6就可以无限量的备份个人数据,不过收费是按照每个设备来收的,如果你只有一台电脑,平时又喜欢收藏很多东西,这个倒是一个很划算的方案了。只要不是太过分,占用几十T的空间,基本上还是不会收到警告的,BackBlaze在国内目前依旧可以使用,至于网速就因人而异了。

我这里选择的是B2方案,不限制设备数量,按量计费,而且还提供了各种平台的客户端,使用上比较方便,免费10G容量,可以用于前期的调试。

注册进入后台,选择新建bucket,可以看到多了一个存储桶,如果你不是要公开这些文件的话,类型选择私有。点击upload/download可以查看当前桶的数据。有一点需要注意一下,就是如果在客户端上对文件进行了修改,web端文件树可能不会实时更新,需要点击刷新标志进行刷新。这家会话失效的特别快,经常需要重新登录,然后建议开启二步登录验证。

dd27fdcc53ce4af428e1944ed4f984f0.png

cb1a5ecc2b6ad2bb133ece33b6f6fda4.png

作为一个比较成熟的备份服务,客户端登录使用的是加了限制的Token,而不是拥有全部权限的账号密码。

在最左边的菜单里找到App Keys,然后点击Add a New Application Key新增一个Key,秉持了每个key专用的原则,尽可能减少每一个Key的使用范围,比如它能访问到的桶,以及读写权限。这里本来是想设置成Write Only,但是发现没有Read权限rclone同步时会提示未授权。

d5a0912e5c098f5aee75b7a6ac473c13.png

1743ae4f2da4bb320190dfa0a588372d.png

创建Key成功后,会显示你的id和key,其中key只会出现一次,所以要记好。

fd3a1219acd576935cdf2d7c2751c6d8.png

还是使用rclone来处理b2。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$ rclone config

n) New remote
q) Quit config
e/n/d/r/c/s/q> n
name> b2
Type of storage to configure.
Enter a string value. Press Enter for the default ("").
Choose a number from below, or type in your own value
5 / Backblaze B2
\ "b2"
Storage> 5
** See help for b2 backend at: https://rclone.org/b2/ **

Account ID or Application Key ID
Enter a string value. Press Enter for the default ("").
account> 这里是刚刚显示的KeyID
Application Key
Enter a string value. Press Enter for the default ("").
key> 这里写applicationKey
Permanently delete files on remote removal, otherwise hide files.
Enter a boolean value (true or false). Press Enter for the default ("false").
hard_delete> true
Edit advanced config? (y/n)
y) Yes
n) No
y/n> n
Remote config
--------------------
[b2]
type = b2
account = *****
key = ******
hard_delete = true
--------------------
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y

可以使用 rclone lsd b2:/来查看bucket数据,以及使用rclone sync命令来同步文件夹。

备份方案改造

改造流程不算特别复杂,每个网站自身的配置文件代码等等因为基本不变化,所有可以备份原始文件,数据库的数据每次先导出。

首先创建一个今日份的备份文件,然后针对每一个站点,导出它的数据。

1
2
3
4
5
6
BASE_DIR=/mnt/backup/$(date +"%Y-%m-%d")
mkdir -p $BASE_DIR

# Backup example.com
mkdir -p $BASE_DIR/example.com/
mysqldump -uroot -pPASSWORD chaos > $BASE_DIR/example.com/mysqldump.sql

这里要写一个过滤规则,把mysql数据文件、日志文件排除掉。

1
2
3
4
5
6
7
# # But only backup these matches
+ /nginx/conf.d/**
# Filter list for root backup
- /nginx/**
- /mysql/**
# # Baseline, include all directories
+ /**

有几个需要注意的地方:

  1. 文件按照顺序优先匹配的原则,所以范围广的要写在最后
  2. 这里是相对同步目录来算的,所以不用写操作系统的绝对目录

然后同步到存储服务中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
rclone sync \
--b2-hard-delete \
--transfers 16 \
--checkers 8 \
--filter-from /home/newnius/filter.list \
--fast-list \
--progress \
--copy-links \
--create-empty-src-dirs \
--local-no-check-updated \
/mnt/backup/ b2:/Test-newnius/

# 由于网络、版本等原因存在,会生成大量的冗余文件,每次同步之后把旧版本删除
rclone cleanup b2:/Test-newnius/

为了防止备份数据越来越多,删除七天前的备份文件。

1
2
# Remove backups 7 days ago
find /mnt/backup/* -type d -ctime +7 -exec rm -rf {} \;

自动定时备份

光有备份脚本还不行,自己手动执行既麻烦又不靠谱,利用系统的定时任务来执行。

1
2
# crontab -e
0 1 * * * /home/newnius/backup.sh

每小时同步一次。这里有一点要注意一下,前面备份的文件夹是精确到日期,所以每次同步都会覆盖当天的上一次备份。

参考

delete directories older than n days

Rclone: filter not working

Failed to copy: source file is being updated