rclone: 文件备份到腾讯云 COS 深度归档存储

rclone 是我目前用过操作对象存储功能最完整、使用最简易的工具。

家里现在使用 Nextcloud 网盘作为统一的文件管理界面供每个成员使用,使用外部存储插件去访问本地的 minio 对象存储。minio 通过策略定义实现每个用户独享的和共享的 bucket。

本地的 minio 是 4 盘位 EC:2 结构,可以保证任意 2 块硬盘上的某个文件对象同时损坏,数据不会丢失且可自愈。家庭环境来说,这个保护级别已经足够了,但是把握起见,还是决定做一个异地备份。

minio 上的数据通过 rclone 定期手动备份到腾讯云 COS 深度归档存储,目前总数据量不足 1TB,资源包只要 120 元左右一年,存储成本非常低。

深度归档存储的特点是存储单价非常低,不过一旦需要恢复数据时,需要付出高昂的费用代价。所以我把深度归档存储纯粹当做一份保险,数据灾难时的最后一丝希望,没有意外不会请求解冻。

rclone 的数据加密功能

虽然说家庭数据没有什么怕人看的,但直接上传到公有云总觉得别扭,所以希望找到一种理想的方式可以把数据加密以后备份到云端。

不知道从什么时候开始,rclone 的存储类型中多了好几个虚拟类型,特别有用的除了我这里要说的 crypt 加密存储之外,还有 alias 存储别名。这些新增的虚拟存储类型需要搭配实体存储类型一起使用,比如你创建了一个阿里云的 OSS 存储配置,可以通过指定 bucket 名称访问账户下所有的存储桶,通过创建这个 OSS 存储的别名,可以为特定的 bucket 创建一个配置,这样就可以使用一个固定的名称访问一个特定存储桶了。

crypt 类型也是类似的用法,比如需要把文件加密存储到 COS,那么就可以在创建好 COS 配置之后,再创建一个与 COS 关联的 crypt 类型的存储,创建过程中需要提供加密信息。创建完成之后,需要加密上传的数据就直接上传到这个 crypt 存储,它会作为数据与目标 COS 之前的一个中间层,先对文件进行加密,再把加密后的文件上传到 COS。

在创建 crypt 类型的存储配置时,可以指定是否加密文件名和目录名。如果不加密的话,在 COS 控制台中看到的仍然是与本地相同的目录和文件名,但这些文件实际都是被加密的,可以随便下载一个进行验证。

在本地检索浏览 crypt 存储中的文件时,rclone 会自动进行解密显示。

特别需要注意的是,crypt 存储创建时设置的加密信息一定要记住,没有这些信息就没有办法解密文件。

rclone 备份数据到深度归档

腾讯云的 COS 深度归档存储目前只有存储资源包,还没有请求资源包。但在上传和列出文件的时候会计算请求费用,单位价格虽然很低,但是数据量大的情况下,API 请求产生的费用还是不容小觑。

因为我家 minio 上的数据会不断增长,而增量备份需要对 COS 执行 List 请求,效率低不说,还会产生一定的费用。所以在备份数据到 COS 时,可以同时指定 --max-age--no-traverse 这两个参数。

  • --max-age:可以让 rclone 只处理最近一段时间发生变化的文件,比如 --max-age 20d 是最近 20 天变化的文件。
  • --no-traverse:可以禁止 rclone 遍历远程 COS 上的文件,避免产生额外的 API 请求费用,让 rclone 一门心思只上传文件。

比如下面是我将本地 minio 所有数据加密备份到 COS 深度归档时使用的命令,不要遍历云端对象存储目录,只上传最近 20 天发生变化的文件:

$ rclone copy --max-age 20d --no-traverse minio: crypt: -P