物件版本管理

為支援擷取已刪除或遭覆寫的物件,Cloud Storage 提供了「物件版本管理」功能。這個頁面將說明這項功能及可用選項。至於啟用和使用物件版本管理功能的方式,請參閱「使用物件版本管理」一文。

啟用「物件版本管理」功能可以避免您的 Cloud Storage 資料遭到覆寫或意外刪除。不過,啟用這項功能會增加儲存空間成本;您可以設定物件生命週期管理將舊版物件刪除,藉此降低相關費用的支出。

簡介

您可以針對值區啟用物件版本管理。啟用這項功能之後,每當物件的使用中版本遭到覆寫或刪除,Cloud Storage 就會為該項物件建立一個「封存」版本。封存版本保留使用物件名稱,但會有一個不重複的生成號碼做為識別用途。雖然所有物件都有相關聯的生成號碼,但只有封存物件需要透過生成號碼來識別。

如果啟用物件的版本管理功能,您就可以列出物件的封存版本、將物件的使用中版本還原至舊版狀態,或者視需要永久刪除封存版本。當然,您可以隨時啟用或關閉某值區的版本管理功能。一旦關閉版本管理功能,系統就會維持現有物件版本,且值區將停止累積封存物件版本。

物件版本設定詳細資訊

Cloud Storage 同時使用兩個屬性來判別物件版本;一個屬性識別物件資料版本,另一個則識別物件中繼資料的版本。就算您未啟用物件版本設定功能,這些屬性一律會和物件的目前版本一起留存。您可以將設些屬性當做條件式更新的先決條件來使用,強制依排序更新。

Cloud Storage 使用以下屬性來標記每個物件:

屬性 說明
generation 指出內容 (資料) 生成世代,並在物件內容遭到覆寫時更新。即使是同一個值區內的物件,不相關物件的生成號碼也毫無關聯。
metageneration 指出中繼資料的生成世代,並在特定內容生成世代中繼資料更新時逐次增加。物件每次產生新的 generationmetageneration 都會重設為 1。因此,如果沒有 generation 屬性,metageneration 屬性就毫無意義;兩者必須搭配使用。也就是說,將各自擁有不同資料生成世代的兩個中繼資料生成世代版本相比較,並沒有任何意義。

目前已採用保留政策的值區無法使用物件版本管理功能。

封存物件中繼資料

封存物件有自己專屬的中繼資料,而且可能和使用中物件的中繼資料不同。最重要的是,封存版本會保留其 ACL,而且不一定要具備與該物件使用中版本同樣的權限。

不論是使用中或已版本化封存,每個物件都有一組中繼資料,只有最新的 metageneration 號碼能用來指示中繼資料。您不能以較舊的 metageneration 號碼存取自其生成之後修改過的中繼資料。

您可以在要求中指定 generation,藉此更新封存物件的中繼資料。如要維護讀取-修改-寫入語意的完整,您可以使用 metageneration-match 先決條件。一旦使用這項先決條件,在您讀取中繼資料後到傳送更新的這個期間,若您嘗試更新的中繼資料有所變更,就會導致更新失敗。

物件版本管理範例

本例說明一旦您啟用物件版本管理功能,日後覆寫、更新及刪除檔案時,值區內的 cat.jpg 檔案會發生什麼事。

上傳新映像檔

您初次上傳 cat.jpg 到 Cloud Storage 後,其會收到 generation 號碼及 metageneration 號碼各一組。本例中的生成號碼是 1360887697105000;由於物件是新的,因此 metageneration 號碼是 1

就算物件版本管理功能未啟用,cat.jpg 也會收到 generationmetageneration 號碼。您可以在 gsutil 中使用 ls -L 指令查看這些號碼。如需操作說明,請參閱「查看物件中繼資料」一文。

啟用物件版本管理

在這個階段,您可以決定是否要讓值區啟用物件版本管理。啟用這項功能並不會影響 cat.jpggenerationmetageneration 號碼。

變更映像檔的中繼資料

您可以藉由新增自訂中繼資料color:black」來更新 cat.jpg 的中繼資料。更新中繼資料會導致 cat.jpgmetageneration 值增加,在本例中就是從 1 變成 2。但由於物件本身維持不變,因此 Cloud Storage 會繼續只儲存 cat.jpg 的一個版本,且版本的 generation 號碼也還是 1360887697105000

上傳新版本映像檔

您上傳了一個 cat.jpg 新版本到 Cloud Storage 值區,這時物件版本管理功能會將現有的 cat.jpg 物件移到封存狀態。封存版本會保留與先前相同的儲存空間級別及中繼資料。此外,只有在您執行顯示版本化清單時,封存版本才會出現;一般清單指令並不會顯示封存版本。封存版本現在則使用 cat.jpg#1360887697105000 這個參照號碼。

與此同時,最新上傳的 cat.jpg 就會變成物件的使用中版本。這個新的 cat.jpg 可取得專屬的 generation 號碼,在本例中為 1360887759327000;並且也會取得專屬中繼資料和 metageneration 號碼 (也就是 1),這代表其中並沒有 color:black 中繼資料,除非您予以指定。當您存取或修改 cat.jpg, 時,這就是系統將採用的版本。或者,您可以使用 generation 號碼來指出 cat.jpg 的這個版本。舉例來說,您使用 gsutil 工具時可以將生成號碼視為 cat.jpg#1360887759327000

刪除映像檔的使用中版本

您現在刪除了 cat.jpg。當您執行這項動作,系統就會封存生成號碼為 1360887759327000 的版本。因此,您的值區現在有兩個 cat.jpg 封存版本,但已經沒有任何使用中版本。您還是可以使用 generation 號碼來代表這兩個封存版本之一,但如果您嘗試在沒有 generation 號碼的情況下存取 cat.jpg,這項作業就會失敗。

同樣地,值區的一般物件清單不會將 cat.jpg 顯示為值區中的任何一個物件。如需物件封存版本清單的詳細資訊,請參閱「列出封存的物件版本」一文。

停用物件版本管理

如果您停用物件版本管理功能,系統日後將會停止封存物件。現有的物件封存版本仍會保留在 Cloud Storage 中。除非您以手動方式或透過物件生命週期管理予以刪除,否則就算物件版本管理功能已停用,cat.jpg#1360887697105000cat.jpg#1360887759327000 仍會儲存在您的值區中。

還原其中一個封存版本

即使物件版本管理功能已停用,您還是可以藉由製作複本的方式,還原到其中一個現有的封存版本;只要將複本命名為 cat.jpg 就能做到這點。完成還原後,您的值區會有三個版本的 cat.jpg:兩個封存版本,以及一個從複本還原的使用中版本。

小秘訣

本節將介紹一些實用的秘訣,協助您更有效率地利用物件版本管理功能。

使用 gsutil

  • gsutil 工具全方位支援版本化物件的功能使用,能讓涉及物件版本管理的多項工作更容易進行。舉例來說,使用物件封存版本時,您可以在物件名稱上附加 #generation 號碼。如需使用 gsutil 進行物件版本管理的詳細資訊,請參閱「物件版本管理和並行控制」一文。

避免使用 ETag

  • 對於條件式更新,請考慮使用 generationmetageneration 號碼來替代 ETag。generationmetageneration 號碼兩者搭配使用就能追蹤所有物件更新 (包括中繼資料變更),比使用 ETag 更可靠。

瞭解檔案刪除及還原行為

  • 您可以將封存的物件版本複製到目前的使用中版本。如需複製封存物件的逐步指南,請參閱「複製封存的物件版本」說明文章。

    如果您在物件版本管理功能已啟用的情況下進行這項動作,而值區中還有物件的使用中版本,則 Cloud Storage 將會加以覆寫,並且為已覆寫物件建立新的封存版本。假如是這樣,您的值區接著就會包含已覆寫 (現在則是已封存) 物件,以及兩個先前封存的物件複本 (分別是使用中及仍為封存狀態的複本),而這些全部都會產生儲存空間費用。為避免不必要的費用,請刪除您已當做目前使用中複本來用的封存版本。

  • 假如您提出未指定生成世代的刪除要求,Cloud Storage 會將目前的使用中物件封存,而且後續如果出現未指定版本的要求,這個封存物件將會隱藏。

  • 如果您提出刪除要求且其 generation 剛好對應到目前使用中的物件,Cloud Storage 會直接刪除該物件,而不製作封存複本。

  • 如您決定刪除封存物件,Cloud Storage 將會永久刪除該版本物件。

變更物件的使用中版本時,請使用 generation-match 先決條件

  • 當您使用生成號碼,則不論某物件的狀態為使用中或已封存,只要名稱和生成號碼相符,要求就會成功。如果沒有這類物件,Cloud Storage 會傳回 404 Not Found

  • 當您使用 generation-match 先決條件,除非所要求物件的使用版本具有指定的生成號碼,否則要求不會成功。如果這類物件不存在或沒有封存版本,Cloud Storage 會傳回 412 Precondition Failed

  • 您應避免在使用 generation-match 先決條件時,又在物件名稱使用生成號碼。假如同時使用而號碼相符,設定這個先決條件等於多此一舉;但如果號碼不符,要求就會屢試屢敗。

  • 如果您透過 generation-match 先決條件提出多個並行變更要求,根據 Cloud Storage 的同步一致性,這些要求中只有一個會成功。當您需要從多個來源更新物件,又得避免使用者不小心覆寫物件,這個功能就可以派上用場。

  • 如果您上傳物件時將 generation-match 先決條件設為 0,則只有在物件當下沒有任何使用中版本時,Cloud Storage 才會執行您指定的要求。舉例來說,假設您透過 XML API 執行 PUT 要求來建立標頭為 x-goog-if-generation-match:0 的新物件,當物件不存在或物件只有封存版本時,要求就會成功。如果物件有使用中版本,Cloud Storage 就會取消更新並顯示 412 Precondition Failed 狀態碼。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Storage
需要協助嗎?請前往我們的支援網頁