一、背景
阿裡雲對象存儲 OSS 是儲存海量資料的平台,支援豐富的應用。在使用過程中難免會遇到誤操作、程式 Bug、覆寫寫等導緻資料被删除的場景,對于資料的丢失會非常着急,後果也非常嚴重,甚至某些情況下還會影響你的職業生涯。OSS 每年都會遇到多起客戶誤删除資料的事件,為此 OSS 開發了 版本控制 功能,開啟該特性後,可以在誤删除資料時通過曆史版本找回資料。
二、版本控制技術介紹
存儲空間(Bucket)開啟版本控制後,OSS 會為 Bucket 中所有檔案(Object)的每個版本指定唯一的 ID 值,且 Bucket 中現有 Object 的内容、權限保持不變。開啟版本控制後,還能夠防止意外覆寫或者删除 Object ,并允許查詢、恢複 Object 的曆史版本。詳細資訊,請參考
官網介紹。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iM3E2MzITM5UWYkBjMhRmYygTM0kjN4IDMlJWNhhTNy8CX5d2bs92Yl1iclB3bsVmdlR2LcNWaw9CXt92Yu4GZjlGbh5yYjV3Lc9CX6MHc0RHaiojIsJye.png)
如上圖所示,通過 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 的 版本控制 提供了有效的資料保護方案,封裝 版本控制+生命周期 的資源回收筒也可以幫助更好的優化成本和恢複體驗,希望您能盡快開通,保護您的珍貴資料。