对象版本控制

设置 用量

为了支持检索已删除或替换的对象,Cloud Storage 提供了对象版本控制功能。本页面介绍了此功能以及使用此功能时可用的选项。

简介

您可为存储桶启用对象版本控制。启用之后:

  • 您每次替换或删除有效对象版本时,只要您不指定该有效版本的世代编号,Cloud Storage 都会保留非当前对象版本。

    • 非当前版本会保留对象的名称,但由其世代编号唯一标识。

    • 非当前版本只会出现在明确要求包含它们的请求中。

  • 通过在删除请求中包含世代编号或使用对象生命周期管理,您可以永久删除对象版本。

  • 对象的非当前版本独立于任何当前版本。

如果您停用对象版本控制

  • 存储桶不再累积对象的新非当前版本。

  • 存储桶中已存在的对象版本不受影响。

注意事项

  • 无法在当前具有保留策略的存储桶上启用对象版本控制。
  • 默认情况下,您可以拥有的对象版本数不受限制。对象的每个非当前版本都按当前版本的费率计费。

  • 从存储桶中移除的对象版本的存储时长取决于添加到存储桶的时间,而非成为非当前版本的时间。

  • 如果启用版本控制,请考虑使用对象生命周期管理,此功能可以在指定时间长度后移除对象的旧版本,或者在较新版本变为非当前版本时移除对象的旧版本。如需查看一种可能的设置,请参阅用于删除对象的生命周期配置示例。

非当前对象元数据

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

每个版本(无论是当前版本还是非当前版本)都有一组元数据;只有最新的元数据世代编号才用于指代元数据。较旧的元数据世代编号不能用于访问更改后的元数据。

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

对象版本控制示例

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

您上传了一张新图片

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

即使未启用对象版本控制,cat.jpg 也会收到 generationmetageneration 编号。您可以查看对象元数据以获取这些数量。

您启用了对象版本控制

此时,您决定为存储桶启用对象版本控制。这样做不会影响 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。例如,在使用 Google Cloud CLI 时,您将使用 cat.jpg#1360887759327000 指代此版本。

您删除了图片的当前版本

您现在要删除 cat.jpg。当您执行此操作时,世代编号为 1360887759327000 的版本会变为非当前版本。您的存储桶现在包含 cat.jpg 的两个非当前版本,不包含任何当前版本。您仍然可以使用 generation 编号来指代任意一个非当前版本,但如果您尝试在没有 generation 编号的情况下访问 cat.jpg,此操作将失败。

同样地,存储桶的正常对象列出操作不会将 cat.jpg 显示为存储桶中的一个对象。如需了解如何列出对象的非当前版本,请参阅列出非当前对象版本

您停用了对象版本控制

停用了对象版本控制,这会阻止对象变为非当前版本。对象现有的非当前版本将保留在 Cloud Storage 中。即便对象版本控制被停用,cat.jpg#1360887697105000cat.jpg#1360887759327000 仍会存储在您的存储桶中,直到您通过手动操作或对象生命周期管理将它们删除。

您恢复了其中一个非当前版本

即使对象版本控制被停用,您仍可以为其中一个现有的非当前版本创建副本,从而有效地恢复版本。执行此操作后,您的存储桶将拥有 cat.jpg 的三个版本:两个非当前版本,以及一个因恢复创建的当前版本。

对象版本控制参考文档

此参考表格显示了使用对象版本控制执行某些操作时发生的情况。

对象版本控制状态 操作 结果
已停用
dog.png 替换为新版本。 新版本会替换现行版本并接收新的世代编号。系统会永久删除旧的现行版本。
复制 dog.png 的非当前版本以覆盖现行版本。1 非当前版本的副本会替换现行版本并接收新的世代编号。系统会永久删除旧的现行版本。
删除 dog.png dog.png 会被永久删除。
通过指定 dog.png 的世代编号来删除其非当前版本。1 非当前版本会被永久删除。
已启用
dog.png 替换为新版本。 新版本会替换现行版本并接收新的世代编号。旧的现行版本会变为非当前版本,并保留相同的世代编号。
复制 dog.png 的非当前版本以覆盖现行版本。 非当前版本的副本会替换现行版本并接收新的世代编号。旧的现行版本会变为非当前版本,并保留相同的世代编号。
在不指定 dog.png 世代编号的情况下删除其现行版本。 该现行版本会变为非当前版本,并保留相同的世代编号。
通过指定 dog.png 世代编号来删除其现行版本。 现行版本会被永久删除。
通过指定 dog.png 的世代编号来删除其非当前版本。 非当前版本会被永久删除。

1 如果存储桶之前启用了对象版本控制,则可能存在非当前版本。

文件恢复行为

您可以有效地将非当前对象版本恢复到当前当前版本。如需执行此操作的分步指南,请参阅恢复非当前对象版本

如果您在启用对象版本控制的情况下执行此操作,那么,当存储桶中已存在对象的有效版本时,Cloud Storage 会替换现有的有效版本,但也会将其保留为新的非当前版本。在这种情况下,您的存储桶随后会包含被替换的对象(现为非当前版本)以及该对象先前为非当前版本的两个副本(一个当前副本和一个仍为非当前版本的副本),这些内容都会产生存储费用。如需防止产生不必要的费用,请删除用于创建当前副本的非当前版本,或配置对象生命周期管理以在满足您指定的条件时移除非当前对象。

后续步骤