6 min read

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

⚠️ 特别注意 ⚠️:对象存储是付费云存储服务,本文使用的 COS 深度归档存储以文件(对象)为单位,从上传成功开始计算存储时长,要求最低存储时间不能低于 180 天,中途删除也会按 180 天计算存储费用。特别的,更新已上传的文件(对象)本质上是删除旧的文件再上传新的文件,所以就会对旧文件结算 180 天的存储费用,同时为新文件重新计算存储时长。如果备份涉及到频繁更新文件,建议不要使用归档存储和深度归档存储。

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

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

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

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

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

腾讯云 COS 深度归档存储

在 rclone 添加 cos 深度归档存储时,存储级别 storage_class 应设置为 DEEP_ARCHIVE。例如:

[cos-chengdu]
type = s3
provider = TencentCOS
access_key_id = abcdefghijklmn
secret_access_key = opqrstuvwxyz
endpoint = cos.ap-chengdu.myqcloud.com
storage_class = DEEP_ARCHIVE

深度归档存储的特点是,你可以实时列出文件信息,比如文件名和大小等。但要将存储的文件下载到本地,需要先在腾讯云的 cos 控制台进行文件解冻(恢复),标准恢复需要 12 个小时,批量恢复需要 48 小时。等文件解冻之后在使用 rclone 复制文件到本地。

rclone 的数据加密功能

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

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

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

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

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

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


2021.11.13 补充

在创建 cyrpt 类型时,允许设置两个密码,第一个是主密码,是必须设置的。第二个是对主密码进行混淆加密的安全密码,是可选的。(⬅️理解的不一定准确,但大概就是这么回事。)

两个密码必须记住,因为重新配置的时候,这两个密码都是需要的,如果不能正确的提供这两个密码,就没有办法访问加密的数据。

特别的,在 crypt 的配置信息中,有 passwordpassword2 两个项,它们的值是经由上述两个密码加密以后的结果。这两个值也非常关键,最好也妥善记录一下。当你忘记了前面设置的两个密码的时候,通过这两条密码记录也能正常读写加密的数据。

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