一、背景
阿里云对象存储 OSS 是保存海量数据的平台,支持丰富的应用。在使用过程中难免会遇到误操作、程序 Bug、覆盖写等导致数据被删除的场景,对于数据的丢失会非常着急,后果也非常严重,甚至某些情况下还会影响你的职业生涯。OSS 每年都会遇到多起客户误删除数据的事件,为此 OSS 开发了 版本控制 功能,开启该特性后,可以在误删除数据时通过历史版本找回数据。
二、版本控制技术介绍
存储空间(Bucket)开启版本控制后,OSS 会为 Bucket 中所有文件(Object)的每个版本指定唯一的 ID 值,且 Bucket 中现有 Object 的内容、权限保持不变。开启版本控制后,还能够防止意外覆盖或者删除 Object ,并允许查询、恢复 Object 的历史版本。详细信息,请参考 官网 介绍。
如上图所示,通过 PUT 操作第一次上传同名 Object (key=example.jpg)时,原始 Object 版本(ID=111111)作为历史版本,生成的新版本(ID=222222)将作为当前版本保存在存储空间中。当再次上传同名 Object 时,原始 Object 版本(包括 ID=111111 以及 ID=222222)将作为历史版本,而生成的新版本(ID=333333)则作为当前版本保存在 Bucket 中。
三、数据防误删实际操作
3.1 开启版本控制
开启版本控制有两种方式:
- 创建时,选择开通 版本控制。
- 创建后,设置 版本控制。
因此,通过创建后设置版本控制,可以对存量的OSS数据设置版本控制,有效的保障历史数据。
3.2 上传对象
开启版本控制后,在控制台有 显示对象的历史版本 框,选择该框则可以显示对象的历史版本,如下图所示。
通过在控制台上传同名对象,则会生成多个版本,其中显示 (最新版本) 的那个对象是最新对象,更新时间 也是最近的时间。
3.3 删除对象
开启版本控制后,删除对象并不会真正删除,而是插入 删除标记,如下图所示。
删除对象后,如果没有选择 显示对象的历史版本,则在控制台显示该文件不存在,但实际上对象并未删除,因此可以支持后面的恢复操作。
3.4 快捷的恢复数据
由于开通了版本保护,数据历史版本并未删除,可以采用下图所示的顺序,DIY 恢复数据。第一步,选中 显示对象的历史版本,此时可以看到历史版本,其中显示 (删除标记) 表示该对象被删除。第二步,删除该 (删除标记) 就可以让数据在控制台重新可见。第三步,删除标记成功后,最近的版本被恢复为 (最新版本),此时不管是否选中 显示对象的历史版本,都可以在控制台看到该对象。
因此,开通了版本控制后,可以非常便捷的 DIY 恢复数据,不用再担心“误操作、程序 Bug、覆盖写”等带来的严重影响。
四、数据误删的批量修复实战(工具)
OSS 控制台提供了简单的单对象恢复能力,但是对于删除目录下的海量文件,效率就非常低下了,需要频繁的UI点击,修复速度太慢。因此 OSS 提供了 ossutil 工具,能够批量修复数据,提高修复效率。
4.1 指定前缀批量修复
整个过程如上图,参考命令为:$) ./ossutilmac64 ls oss://test-jsj-versioning/prefix/ --all-versions
| grep -rn "true true oss://"
| awk -F ' ' '{drcmd=("./ossutilmac64 rm " $10" --version-id "$7);print drcmd}'
| sh
其中,删除标记会显示 "true true",所以只需要删除匹配 前缀 的删除标记,即可恢复对象。
4.2 指定时间批量修复
整个过程如上图,参考命令为:./ossutilmac64 ls oss://test-jsj-versioning/pre- --all-versions
| awk '{(dtime=($1" "$2" "$3" "$4));
if ((dtime>="2020-06-16 16:55:05 +0800 CST")
&& (dtime<="2020-06-16 16:55:40 +0800 CST")) print}'
| grep -rn "true true oss://"
| awk -F ' ' '{drcmd=("./ossutilmac64 rm " $10" --version-id "$7);print drcmd}'
| sh
只需要删除匹配 时间范围 的删除标记,即可恢复对象。
4.3 指定修复列表文件批量修复
整个过程如上图,参考命令为:for i in
cat file_list;
do
./ossutilmac64 ls oss://test-jsj-versioning/$i --all-versions
| grep -rn "true true oss://"
| awk -F ' ' '{drcmd=("./ossutilmac64 rm " $10" --version-id "$7);print drcmd}'
| sh;
done
只需要遍历 修复列表文件,并删除对象的删除标记,即可恢复对象。
五、版本控制和生命周期结合实现类回收站(成本优化)
设置版本控制后,即使删除对象也会保留历史版本,这会带来成本的增加。为了支持版本控制的数据恢复,以及成本优化,设计了 版本控制+生命周期 的组合方案,如下图所示。
在生命周期配置中,针对 当前版本(删除标记) 和 历史版本 设置策略,可以将其在指定时间后转换为其他类型从而降低成本,也可以选择在指定天数(比如30天)之后删除,从而在 30 天内仍然可以恢复数据,类似回收站的保留时长。
六、小结
数据误删除是非常严重的事件,也是难以预防的问题。通过开通对象存储 OSS 的 版本控制 提供了有效的数据保护方案,封装 版本控制+生命周期 的回收站也可以帮助更好的优化成本和恢复体验,希望您能尽快开通,保护您的珍贵数据。