云函数实时备份教程-版本控制+跨地域备份

                           
2020年03月31日

【注意】发现程序 bug ,假如从 A 存储桶备份至 B 存储桶,只能对上传到 A 中根目录的文件进行实时备份,对上传到 A 中一级及以上目录的文件,备份失败并报错。

【实时状态更新】已经提交工单反馈问题,等待解决。

无法解决】腾讯云说:这个问题得你自己解决。

【需求】

将【腾讯云 COS 】中的存储桶 A 挂载到云服务器,为了数据安全和稳定,需要对存储桶A进行备份,最好是实时备份到存储桶 B,存储桶 A 中文件更改后,存储桶 B 也立即更改,即使存储桶 A 中有数据删除操作(删除笔记),存储桶 B 中数据依然存在(不变化)。

1、存储桶A → B 实时备份
2、A 删除文件 abc.txt B 中依旧存在文件abc.txt
3、A 中文件 abc.txt 内容由 123 更改为 123456,B中文件 abc.txt 内容也由 123 更改为 123456。

【实时备份方法】现在使用了 版本控制和跨地域复制 功能进行实时备份,且数据更改/删除后仍然可以恢复之前内容。

一、版本控制功能相关介绍

版本控制概述-官方文档

设置版本控制 - 官方文档

腾讯云对象存储 COS 高可用解决方案,都在这里了! - 官方文档

开启多版本的情况下删除文件操作实际上是创建一个 0 字节的特殊 delete marker 文件

这样的话,无论对腾讯云对象存储(COS)进行什么样的改动,都是可以恢复的。

为了防止误删所有文件的历史版本,经过考虑决定使用跨地域复制功能。

二、跨地域复制功能相关介绍

跨地域复制概述 - 官方文档

设置跨地域复制 - 官方文档

腾讯云对象存储 COS 高可用解决方案,都在这里了!官方文档

假定存储文件的存储桶为 A ,用于存放备份文件的存储桶为 B

跨地域复制需要新建与 A 地域不相同的 B ,然后先将 A 中的所有文件复制到 B 中。

之后开启 A 和 B 的版本控制功能,在 A 中设置跨地域复制规则,选择目标存储桶为 B ,之后就可以使用了。

【注意】跨地域复制会产生流量,比如:北京→广州为 0.5 元 / GB。

【注意】COS 数据存储收费,比如:北京为0.08 元/GB/ 月。

【注意】低频存储,数据存储时间不足 30 天,按 30 天计算。

COS 产品定价 - 官方文档

由于云函数模板代码有 bug ,请忽略分隔符以下所有内容











由于云函数模板代码有 bug ,请忽略以下所有内容

【注意】发现程序 bug ,假如从 A 存储桶备份至 B 存储桶,只能对上传到 A 中根目录的文件进行实时备份,对上传到 A 中一级及以上目录的文件,备份失败并报错。

一、有重要笔记文件备份需求

将为知笔记部署在了私有服务器上后,为避免文件过大占用服务器所剩无几的硬盘资源,所以设置数据存储位置为【腾讯云 COS 】

但是害怕哪天自己误点删除删掉所有笔记或相关存储桶,也害怕为知笔记程序突然发疯导致数据消失,所以需要备份。

一般来说为知笔记是存储在 wikidata 文件夹,由于数据存储位置设置为【腾讯云 COS 】,所以 wikidata 目录中的 data_root 文件夹内的文件已经迁移至云端,其他文件(数据库等)依然保留在本地。

那么需要备份本地的 wikidata 目录和 COS 存储桶中的全部文件。

经实际操作,只要备份数据还在,即使数据丢失也可以完整还原。

【数据恢复方法(仅适用于数据存储位置在本地)】下载备份的 wizdata.zip 文件,将 wizdata.zip 文件解压到服务器上,重新启动镜像即可恢复数据。

【为知笔记-数据恢复方法(仅适用于数据存储位置在腾讯云COS存储桶)】下载备份的 wizdata.zip 文件和数据存储桶中的所有文件,将 wizdata.zip 文件解压并删除 data_root 目录下的所有文件,将数据存储桶中的所有文件粘贴到 data_root 目录下,重新启动镜像即可恢复数据。

本地数据备份比较简单,直接设置成每隔一小时备份并上传【腾讯云 COS 】,保留最新 200 份即可。

由于本地不需要保存数据文件,那么 wiki 目录大小为 260 MB左右,压缩后在 15 MB 左右,保留 200 份也只有约 3 GB。

但是 云端COS 存储桶的备份就不那么容易了。

所以提出以下需求

将为知笔记的数据存储位置设置为【腾讯云 COS 】中的存储桶 A,为了数据安全和稳定,需要对存储桶A进行备份,最好是实时备份到存储桶 B,存储桶 A 中文件更改后,存储桶 B 也立即更改,即使存储桶 A 中有数据删除操作(删除笔记),存储桶 B 中数据依然存在(不变化),由于为知笔记具有历史版本查看恢复功能,暂不使用版本控制功能。

总结一下,就是以下几点

1、A → B 实时备份

2、A 删除文件 abc.txt B 中依旧存在文件abc.txt

3、A 中文件 abc.txt 内容由 123 更改为 123456,B中文件 abc.txt 内容也由 123 更改为 123456。

经考虑有以下几种实现方式

1、服务器快照备份

无法实时备份,只能 6 小时左右备份一次,且回滚可能对服务器上的其他数据有影响。

2、服务器挂载 COS 存储桶后备份存储桶 A 文件至存储桶 B

无法实时备份,只能 1 小时左右备份一次。

只能进行全量备份,就是每隔一个小时压缩整个存储桶 A 挂载到本地的文件夹后上传到存储桶 B 。

数据会随着备份次数及笔记笔记内容的增多而变大,即使存储桶 A 大小为 1 MB,一个月以后,存储桶B中数据就达到了 720 MB,这时需要对存储桶 B 进行删除操作,有误删风险。

且服务器挂载【腾讯云 COS 】比较麻烦。

在网上搜索了一番之后看到了函数计算功能,简介如下

云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码。您只需使用平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。SCF 是实时文件处理和数据处理等场景下理想的计算平台。

云函数-腾讯云

最好的地方就是腾讯云提供了一些模板函数,在其中就有一个 COS 文件备份特别适合我。

二、进行基本的配置

在示例代码中填入存储桶 B 的一些信息再进行一些配置就可以使用了。

这是函数的基本配置

这里是触发器的相关设置,直接选择全部类型,这样的话,在存储桶 A 发生变化的时候就会实时同步给存储桶 B,在存储桶 A 中数据被删除时也不会删除存储桶B的文件。

三、测试一下

向存储桶 A 上传一个文件,很快就备份到了存储桶 B 。

文件大小300KB,用了 126 ms,还是很快的。

Duration:126ms Memory:64MB MemUsage:64.000000MB

用一个 280 MB 大的文件来测试下

Result:{"errorCode":-1,"errorMessage":"Task timed out after 10 seconds"} 

执行超时了,自动终止了,那增加一下超时时间到 60 秒,再试试看。

Duration:227ms Memory:64MB MemUsage:17.335938MB

嗯,执行成功了,很棒

四、费用

每个月有一定的免费额度,足够用了,也没有外网出流量,可以说是免费服务。

但是存储桶存储文件要花钱,笔记文件很少,北京地区存储价格 0.118 元/ GB /月,产生的费用也很少。

云函数相关内容就介绍到这里。

冷场莹