对象版本控制

为了支持检索已删除或覆盖的对象,Cloud Storage 提供了对象版本控制功能。本页面介绍了此功能以及使用此功能时可用的选项。要了解如何启用和使用对象版本控制,请参阅使用对象版本控制

启用对象版本控制可防止 Cloud Storage 的数据被覆盖或意外删除。启用对象版本控制会增加存储费用,可以通过配置对象生命周期管理删除旧对象版本,以在一定程度上缓解存储费用增加。

简介

您可为存储分区启用对象版本控制。启用后,在每次覆盖或删除对象的当前版本时,Cloud Storage 都会创建对象的归档版本。归档版本会保留对象的名称,但通过世代编号进行唯一标识。虽然所有对象都具有关联的世代编号,但只有归档对象才需要通过世代编号来进行标识。

启用对象版本控制后,您可以根据需要列出对象的归档版本、将对象的当前版本还原为较旧的状态,或永久删除归档版本。您可以随时为存储分区打开或关闭版本控制。关闭版本控制后,现有对象版本会保留在原位,存储分区将停止累积新的归档对象版本。

对象版本控制详情

Cloud Storage 使用两个属性来共同标识对象的版本。一个属性用于标识对象数据的版本,另一个属性用于标识对象元数据的版本。即使未启用对象版本控制,对象的每个版本仍然会具有这些属性。这些属性可用作条件更新的先决条件,以便为更新强制排序。

Cloud Storage 使用以下属性标记每个对象:

属性 说明
generation 此属性用于标识内容(数据)的世代,并在对象内容被覆盖时更新。不相关对象的世代编号之间没有关联(即使这些对象位于同一个存储分区中)。
metageneration 此属性用于标识元数据的世代,每当指定内容世代元数据更新时,此属性便会增加。对于对象的每个新 generationmetageneration 会重置为 1。如果没有 generation 属性,则 metageneration 属性毫无意义,因此,后者必须与前者结合在一起使用。换句话说,如果两个版本具有不同的数据世代,则没有必要比较它们的元数据世代,这种做法没有任何意义。

无法在当前具有保留策略的存储分区上启用对象版本控制。

归档的对象元数据

归档对象具有自己的元数据(可能与活动对象的元数据不同)。最重要的是,归档版本会保留自己的 ACL,并且不一定与对象的当前版本具有相同的权限。

每个对象(无论是活动对象还是启用了版本控制的对象)都有一组元数据;只有最新的元数据世代编号对元数据进行了引用。较旧的元数据世代编号不能用于访问更改后的元数据。

要更新归档对象的元数据,您可以在请求中指定该对象的 generation。要确保实现安全的读取-修改-写入语义,您可以使用 metageneration-match 先决条件。如果您尝试更新的元数据在您读取元数据之后、发送更新之前发生更改,则使用此先决条件会导致更新失败。

对象版本控制示例

此示例显示了在文件 cat.jpg 位于启用了对象版本控制的存储分区的情况下,当您覆盖、更新和删除该文件时会发生的情况。

您上传了一张新图片

当您首次cat.jpg 上传到 Cloud Storage 时,它会收到一个 generation 编号和一个 metageneration 编号。在此示例中,世代编号为 1360887697105000。由于该对象是一个新对象,因此 metageneration 编号是 1

即使未启用对象版本控制,cat.jpg 也会收到 generationmetageneration 编号。您可以使用 gsutil 中的 ls -L 命令来查看这些编号。有关说明,请参阅查看对象元数据

您启用了对象版本控制

此时,您决定为存储分区启用对象版本控制。这样做不会影响 cat.jpggenerationmetageneration 编号。

您更改了图片的元数据

您可以为 cat.jpg 更新元数据,方法是添加自定义元数据color:black。更新元数据后,会导致 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
需要帮助?请访问我们的支持页面