一、背景

阿里雲對象存儲 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 的 版本控制 提供了有效的數據保護方案,封裝 版本控制+生命週期 的回收站也可以幫助更好的優化成本和恢復體驗,希望您能儘快開通,保護您的珍貴數據。

 動動小手指 瞭解更多詳情 !

相關文章