最近把云服务器上的东西都搬回本地了,太贵了用不起。搬回来后,就得自己做数据备份了,云服务器上有很方便的自动快照,而本地就是一个ARM板子在跑,内存只有4Gb,做什么都得精打细算。

到网上找了一些开源的备份工具,一开始我是用的duplicati,它有web界面,各种操作都是傻瓜式的,点点点就完事了。而最后没有留下的原因有两个:一个是喜欢报错,另一个是有大量回读操作

duplicati它备份的时候经常会报错,这些错误又看不懂。我也不知道它到底备份成功了没有(反正它显示成功)。我就很怕,怕万一哪天恢复的时候,它给我来句数据损坏就麻烦了。

duplicati还有一个原因是,会大量回读之前备份好的数据文件。我知道它要回读数据来计算文件差异。但问题是我的存储后端是对象存储,而不是rsync over ssh。有个很要命的问题:对象存储的读操作是很昂贵的(读操作要按流量算钱的),但写操作是免费的。duplicati来回这么一折腾,80G的数据,每次备份我都得额外掏几块钱的流量费让它读数据,我tm?

duplicati最初可能并没有专门为对象存储做存储方式优化,所以我这个对象存储用户就很伤脑筋,每次备份都得花钱。但也不怪duplicati,duplicati的使用场景是更偏向于局域网的数据备份。

(刚登录进去就是两个警告,真的麻了)

image-20240203162612960

后面我又尝试了restic工具,虽然只有命令行操作,但功能一点也不输duplicati。它备份时速度嘎嘎快,不报错。但最后没有选它的理由也很简单,备份数据时有大量回读操作。每次备份数据我还得额外贴钱,想想也挺亏的。

最后找了一圈都没有合适的,遂决定自己整一个备份工具出来。得有这些特性:备份时不能回读、能保留多个版本和支持文件去重、突然断电数据不会挂掉、存储时要加密数据

编程语言的话选择了Rust,理由也很简单,它的内存Bug少,特别是涉及数据安全的地方,更是容不得一点闪失。还有一点就是它占用内存会比较小,ARM板子跑起来不会有太大压力。(14万个文件内存峰值大约20Mb左右)

虽然Rust性能好的,但也有一些麻烦,比如腾讯没有提供对象存储的Rust SDK,只有C和C++版本。C版本不支持Windows,用不了。C++版本又是用的c++的class写的,Rust的ABI不兼容也用不了。最后没办法自己用reqwest库自己简单撸了一个对象存储的客户端,只支持三个操作,读,写和删除。

image-20240203161133995

上传的话,是全程流式传输,不会占用太多内存,只有18Mb左右。等到后面功能稳定下来了,会将这个仓库开源的(虽然不会有人用就是了)

开始我也想过别的备份方案,比如用另外的硬盘定期同步,但是很容易被家里人拔插头,家里人不太喜欢长时间插电的东西,总觉得这玩意儿不安全。你只要不在家,定被拔插头。

还想过把数据加密后备份到公共网盘上,这个虽然成本最低,但也有文件被和谐的风险。另外要自动化上传文件,还得有三方客户端的支持才行,用这个也容易封号,就没有考虑了。

最后想来想去还是对象存储最稳妥,数据可靠性远比我自己在家折腾要可靠的多,因为备份的硬盘要是摔了丢了就麻烦了。对象存储的话价格也很便宜(相对数据安全来说),我有大约80Gb的数据要备份,每个月100Gb的容量资源包是8块钱。这么点数据量还不值得单独买硬盘组Raid 1。选对象存储也算是比较省时省力省心的方案了。

最后推荐一个帖子,里面介绍了很多开源的数据备份工具,每种工具都有自己的特点和功能 https://zhuanlan.zhihu.com/p/617916856

板子是香橙派的Zero2W。目前用了0.5G左右的内存,大约15%左右,还有很多余量。现在有了数据备份的支撑,后面考虑把Gitea也搬过来,这样局域网的速度就更快了。

image-20240203162015760.png