Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
你可以启用 blob 版本管理,自动维护对象的旧版本。 当你启用 blob 版本控制时,可以访问 blob 的早期版本,以便在数据被修改或删除时恢复。
注意
为存储帐户启用 Blob 版本控制后,对该帐户中的 Blob 执行的每个写入操作都会创建一个新版本。 因此,启用 blob 版本管理可能会带来额外成本。 若要最大程度地降低成本,请使用 生命周期管理 策略自动删除以前的版本。
推荐的数据保护配置
Blob 版本控制是众多数据保护功能之一。 选择合适的功能或功能组合取决于你的工作负载以及你要防范的风险。 想了解更多关于Azure数据保护建议的信息,请参见数据保护概述。
版本与快照
blob版本类似于快照,但两者在制作方式和最适合用途上有所不同。 版本是自动且由系统管理的:当启用 blob 版本控制时,Azure 存储 每次写入或删除都会生成一个新版本,无需应用逻辑。 快照是手动且由应用程序驱动的:当应用决定需要时,你会明确创建某一时间点的副本。
当你希望实现自动、持续的保护,防止意外或恶意覆盖和删除时,使用版本控制功能。 当你需要有意的、特定时间点的副本时,比如计划更新前的已知良好检查点,可以使用快照。 Microsoft 建议一旦启用版本控制,就停止对块 Blob 进行快照。
Blob 版本控制的工作原理
版本在给定时间点捕获 Blob 的状态。 每个版本都有一个版本ID。 当你为存储账户启用 blob 版本控制时,Azure 存储 在你第一次创建 blob 并每次修改 blob 时,都会自动创建一个带有唯一 ID 的新版本。
版本 ID 可以标识当前版本或先前版本。 一个 blob 一次只能有一个当前版本,即其当前状态。 一个 Blob 可以有多个之前的版本。
创建一个新的 blob 时,存在一个版本,该版本就是当前版本。 修改现有 blob 时,当前版本将变为先前版本。 将创建一个新版本以捕获更新的状态,该新版本即为当前版本。 删除某个 blob 时,该 blob 的当前版本将变成先前版本,并且不再存在当前版本。 Blob 的任何先前版本都将持久化。
下图展示了写操作如何创建版本,以及之前版本如何升级为当前版本:
之前的 blob 版本是不可变的,意味着你不能修改内容或元数据。
重要
如果每个 blob 都具有大量版本,则会增加 blob 列表操作的延迟。 Azure建议为每个 Blob 维护少于 1,000 个版本。 可以使用 生命周期管理 策略自动删除旧版本。
Blob 版本控制无法帮助你从存储帐户或容器被意外删除中恢复。 若要防止意外删除存储帐户,请在存储帐户资源上配置一个锁定。 有关锁定存储帐户的详细信息,请参阅将 Azure 资源管理器锁定应用于存储帐户。
版本标识
每个 blob 版本都有独特的版本 ID。 版本ID的值是blob更新的时间戳。 你在创建版本时分配版本ID。
你可以通过使用版本ID读取或删除特定版本的blob。 如果你不包含版本ID,操作将针对当前版本。
当你执行写操作创建或修改blob时,Azure 存储会在响应中返回x-ms-version-id头。 该头包含写操作创建的 blob 当前版本的版本 ID。
版本ID在整个版本生命周期内保持不变。
写入操作时的版本控制
当你开启blob版本控制时,每次写入对blob的操作都会生成一个新版本。 写入操作包括放置 Blob、放置块列表、复制 Blob 和设置 Blob 元数据。
如果写入操作创建了一个新的 blob,生成的 blob 就是当前版本的 blob。 如果写操作修改了已有的blob,当前版本将成为之前的版本,新的当前版本捕获更新后的blob。
下图显示了写入操作对 blob 版本的影响。 为了简化,本文中的图表将版本ID显示为简单的整数值。 实际上,版本 ID 是一个时间戳。 当前版本显示为蓝色,先前版本显示为灰色。
注意
你在启用版本控制前创建的 blob 没有版本 ID。 当你修改那个blob时,修改后的blob就会变成新的当前版本,而blob的更新前状态就会变成之前的版本。 当前版本被分配一个版本ID,即其创建时间。
当你为存储账户启用 blob 版本控制时,所有对块 blob 的写入操作都会触发新版本的创建,除了 Put Block 操作。
对于页 blob 和追加 blob,只有一部分写入操作会触发版本创建。 这些操作包括:
以下操作不会触发新版本的创建:
要捕捉这些操作的变化,请手动创建快照。 更多信息请参见 Blob snapshots。
Blob 的所有版本都必须属于同一 Blob 类型。 如果 blob 有先前版本,除非先删除该 blob 及其所有版本,否则无法用另一种类型的 blob 进行覆盖。
删除操作时的版本控制
当你执行 Delete Blob 操作但未指定版本 ID,当前版本会变成之前的版本,不再有当前版本。 该操作保留了所有之前存在的blob版本。
下图显示了删除操作对接受版本控制的 blob 的影响:
若要删除 blob 的特定版本,请在删除操作中提供该版本的 ID。 如果你还为存储账户启用了 blob 软删除,系统会保留该版本直到软删除保留期结束。
将新数据写入 blob 时将创建 blob 的新当前版本。 此操作不影响现有版本,如下图所示。
访问层级
可以通过调用设置 Blob 层操作将块 blob 的任何版本(包括当前版本)移到不同的 blob 访问层。 通过将 Blob 的旧版本移至冷层或存档层,你可以享受更低的容量存储价格。 有关详细信息,请参阅 Blob 数据的热存储层、冷存储层、冷藏存储层和存档存储层。
若要自动执行将块 Blob 移动到相应层的过程,请创建 生命周期管理 策略。
启用或禁用 blob 版本控制
关于如何启用或禁用 blob 版本管理的说明,请参见 “启用和管理 blob 版本管理”。
禁用 blob 版本控制不会删除现有的 blob、版本或快照。 关闭 blob 版本管理后,你就无法创建新版本。
禁用版本控制后,修改当前版本会创建一个不是版本的 Blob 对象。 对该 blob 的所有后续更新都会覆盖其数据,不会保存先前状态。 所有现有版本都保持为以前的版本。
禁用版本控制后,你可以用版本ID读取或删除版本。 禁用版本控制后,还可以列出 blob 的版本。
对象复制依赖于 blob 版本控制。 必须先删除帐户上的任何对象复制策略,然后才能禁用 blob 版本控制。 有关对象复制的详细信息,请参阅针对块 Blob 的对象复制。
下图显示了禁用版本控制后,修改 blob 时如何创建未接受版本控制的 blob。 与 blob 关联的任何现有版本都将保持不变。
功能支持
启用 Data Lake Storage Gen2、网络文件系统 (NFS) 3.0 协议或 SSH 文件传输协议 (SFTP) 可能会影响对此功能的支持。 如果已启用这些功能中的某一项,请参阅 Azure 存储帐户中的 Blob 存储功能支持,以评估对此功能的支持。
Blob 版本控制可用于标准常规用途 v2、高级 Block Blob 和旧版 Blob 存储帐户。 目前不支持启用了分层命名空间以与 Azure Data Lake Storage 配合使用的存储帐户。
Azure 存储 REST API 2019-10-10 版及更高版本支持 blob 版本控制。
通过 Data Lake Storage API 上传的 blobs 不支持版本控制。
授予对 blob 版本的操作权限
您可以通过以下方法之一授权访问blob版本:
- 使用 Azure 角色基础访问控制(Azure RBAC)来授予 Microsoft Entra 安全主体权限。 Azure建议使用Microsoft Entra ID,以提高安全性和易用性。 有关通过 Blob 操作使用 Microsoft Entra ID 的详细信息,请参阅授权访问 Azure 存储中的数据。
- 使用共享访问签名(SAS)委托对 Blob 版本的访问权限。 为签名资源类型
bv指定版本ID,表示blob版本,以创建针对特定版本操作的SAS令牌。 有关共享访问签名的详细信息,请参阅使用共享访问签名 (SAS) 授予对 Azure 存储资源的有限访问权限。 - 使用帐户访问密钥通过共享密钥对 Blob 版本执行操作进行授权。 有关详细信息,请参阅通过共享密钥进行授权。
Blob 版本控制旨在保护数据免遭意外或恶意删除。 为了增强保护,删除 blob 版本时需要特殊权限。 以下各节描述了删除 blob 版本所需的权限。
用于删除 blob 版本的 Azure RBAC 操作
下列表显示了支持删除 blob 或 blob 版本的 Azure RBAC 操作。
| 说明 | Blob 服务操作 | 需要 Azure RBAC 数据操作 | Azure 内置角色支持 |
|---|---|---|---|
| 删除当前版本 | 删除 Blob | Microsoft.Storage/storageAccounts/blobServices/containers/blobs/delete | 存储 Blob 数据参与者 |
| 删除先前版本 | 删除 Blob | Microsoft.Storage/storageAccounts/blobServices/containers/blobs/deleteBlobVersion/action | 存储 Blob 数据所有者 |
共享访问签名 (SAS) 参数
Blob 版本的已签名资源为 bv。 有关详细信息,请参阅创建服务 SAS 或创建用户委托 SAS。
下表显示了在 SAS 上删除 blob 版本时所需的权限。
| 权限 | URI 符号 | 允许的操作 |
|---|---|---|
| 删除 | x | 删除 blob 版本。 |
对现有工作量的考虑
删除一个 blob 不再释放空间。 启用版本控制后,删除一个 blob 并不会移除它的数据。 当前版本会变成一个持续存在并持续产生费用的旧版本。 依赖删除操作来回收存储的工作负载会持续收费,直到你明确删除这些版本。
频繁覆盖的工作负载可能会累积版本。 版本会持续存在,直到你明确删除它们。 这种持久性如果管理不当,会导致版本堆积。 为了降低成本,使各版本中的块级更改按块级别计费,从而最小化每个版本的成本。
特征交互
软删除
Blob 版本控制和 Blob 软删除是推荐用于存储帐户的数据保护配置的一部分。 有关Azure数据保护建议的详细信息,请参阅数据保护概述。
覆盖 Blob 对象
如果你同时为存储帐户启用了 Blob 版本控制和 Blob 软删除,那么覆盖 Blob 时,系统会自动创建一个新的先前版本,以反映该 Blob 在写入操作之前的状态。 新版本不会被软删除,而是会持续存在,直到被显式删除。 不会创建软删除的快照。
删除 blob 或版本
如果你同时启用了存储账户的版本控制和软删除,删除一个 blob 时,当前版本的 blob 会变成之前的版本。 操作不会创建新版本或软删除快照。 软删除保留期不适用于已删除的 Blob 对象。
软删除在删除Blob版本时提供了额外的保护。 当你删除之前版本的blob时,操作会软删除该版本。 软删除的版本保存到软删除保持期结束为止,届时,会永久删除该版本。
若要删除 blob 的先前版本,请调用“删除 Blob”操作并指定版本 ID。
还原软删除的版本
在软删除保留期间,使用 取消删除 Blob 操作恢复软删除的版本。 撤消删除 Blob 操作始终会还原 Blob 的所有软删除版本。 你不能只恢复一个软删除版本。
通过 “撤销Blob ”操作恢复软删除版本,并不会让任何版本成为当前版本。 若要还原当前版本,请首先还原所有软删除的版本,然后使用复制 Blob 操作将先前版本复制到新的当前版本。
软删除保留期结束后,系统会永久删除所有软删除的 blob 版本。
Blob 快照
Blob 快照是 Blob 在特定时间点创建的只读副本。 blob快照和blob版本类似,但你或你的应用手动创建快照,而blob版本是在你为存储账户启用blob版本控制时,通过写或删除操作自动创建的。
重要
启用 blob 版本控制后,更新你的应用程序,停止对块 blob 进行快照。 如果你为存储账户启用了版本控制,版本会捕获并保存所有块 Blob 的更新和删除。 如果启用了 blob 版本管理,快照并不能对你的块 blob 数据提供额外保护,反而可能增加成本和应用复杂度。
启用版本控制时为 blob 创建快照
虽然不建议这样做,但你可以对已启用版本控制的 Blob 创建快照。 如果在启用版本控制时无法更新应用程序以停止为 blob 拍摄快照,则应用程序可以支持快照和版本。
当你对一个版本化的blob进行快照时,你会在快照的同时创建一个新版本。 你在做快照时还会创建新的当前版本。
下图显示为接受版本控制的 blob 拍摄快照时会发生的情况。 在此示意图中,版本 ID 为 2 和 3 的 blob 版本和快照包含相同的数据。
已知的限制
不支持层级命名空间(Azure Data Lake Storage)账户,或通过使用 Data Lake Storage API 上传的 blob。
它不能防止容器或账户被删除。 版本管理只在blob层面有效。 删除容器会移除所有 Blob 及其版本。 从该删除操作中恢复需要容器软删除。 防止账户被删除需要资源锁定。
版本是不可变的。 你不能更改现有版本的内容或元数据。
Blob 的所有版本都必须属于同一 Blob 类型。 除非你先删除该blob及其所有版本,否则不能用不同类型的blob覆盖它。
并非所有写入都会生成一个版本。 请参阅本文前述的例外信息。 要捕捉这些状态,请使用手动快照。
账户上存在对象复制策略时,无法禁用版本控制 。 您必须先删除所有对象复制策略。
Undelete Blob恢复所有软删除的 blob 版本,而非单个。 你不能选择性地恢复某一个版本。 取消删除操作绝不会将某个版本设为当前版本。推荐每个 blob 最多 1000 个版本。 超过它会导致blob列表性能下降。
定价和计费
启用 blob 版本管理时,可能会产生额外的数据存储费用。 在设计应用程序时,考虑这些费用的累计,以便降低成本。
系统会按与活跃数据相同的费率对 blob 版本(如 blob 快照)收费。 版本的计费方式取决于你是否为 blob(或快照)的当前版本或以前版本显式设置了访问层。 有关 Blob 层的详细信息,请参阅 Blob 数据的热访问层、冷访问层、寒访问层和存档访问层。
如果你不更改某个 blob 或版本的层级,你将按该 blob、其版本及其可能具有的任何快照中的唯一数据块收费。 更多信息,请参阅未显式设置 Blob 层级时的计费。
如果你更改了一个blob或版本的层级,无论blob和版本是否再次进入同一层级,你都会被计费整个对象。 有关详细信息,请参阅显式设置 Blob 层级时的计费。
注意
如果你为经常覆盖的数据启用版本控制,可能会在列表操作中看到存储容量费用增加和延迟增加。 为解决这些问题,建议将经常被覆盖的数据存储在一个单独的存储账户中,并关闭版本控制。
如果你在经常备份的存储账户上启用版本,当这些版本存储在凉访问层或冷访问层时,可能会触发数据检索费用。
关于 Blob 快照的计费详情,请参阅 Blob 快照。
未显式设置 Blob 访问层时的计费
如果你没有明确为 blob 的任何版本设置 blob 层,将按所有版本及其任何快照中的唯一块或页计费。 你只会对跨 Blob 版本共享的数据收费一次。 当你更新一个 blob 时,当前新版本中的数据会与之前版本中存储的数据不同,因此你需为每个块或页面中的唯一数据付费。
当你在一个块 Blob 中替换一个块时,该块会按唯一块计费。 即使块的 ID 和数据与之前版本相同,这一规则仍然适用。 当你再次提交该块后,它会与之前版本中的对应块不同,并且系统会按其数据向你收费。 同样的规则也适用于页面大块中用相同数据更新的页面。
blob存储无法判断两个块是否包含相同的数据。 你上传并提交的每个区块都被视为唯一,即使它有相同的数据和区块ID。 因为你是为独特区块计费的,请记住,启用版本管理时更新blob会导致额外的独特区块和额外费用。
启用 Blob 版本控制时,对块 Blob 调用更新操作,以使其更新尽可能少数量的块。 允许对块进行精细控制的写入操作是放置块和放置块列表。 Put Block 会暂存这些更改,但实际修改和版本创建是在 Put Block List 操作中进行的。 另一方面,Put Blob 操作会替换 blob 的全部内容,因此可能会导致额外费用。
以下场景展示了当你没有明确设置该块等级时,方块块及其版本的充能是如何累计的。
方案 1
在场景 1 中,blob 具有先前版本。 该 Blob 自版本创建以来一直未更新,因此你只需为唯一的第 1、2 和第 3 块付费。
方案 2
在情景2中,blob中的一个块(图中的块3)被更新。 即使更新的块包含相同的数据和 ID,它也与先前版本中的块 3 不同。 因此,帐户需要支付四个区块的费用。
方案 3
在情景3中,blob更新了,但版本本身没有变化。 当前的 blob 中块3被块4取代,但之前的版本仍然反映块3。 因此,帐户需要支付四个区块的费用。
方案 4
在情景4中,当前版本已完全更新,且不包含任何原始块。 因此,账户将被收取所有八个独特区块的费用——当前版本为四个,前两个版本合计为四个。 如果你用 Put Blob 操作写入 blob,这种情况就会发生,因为它替换了 blob 的全部内容。
当你明确设置了blob层级时的计费
如果你为某个 Blob、版本或快照显式设置了 Blob 访问层,你就需要为该对象在新访问层中的全部内容长度付费,无论它是否与原始访问层中的对象共享块。 你还要为原始等级中最旧版本的全部内容付费。 对于仍保留在原始层级中的任何其他早期版本或快照,你都需要为它们所共享的唯一块付费,如 未明确设置 blob 层级时的计费 中所述。
将 blob 移到新存储层
下表描述了将某个 blob 或版本迁移到新层级时的计费行为。
| 当你设定了blob等级时...... | 然后,针对以下内容进行计费... |
|---|---|
| 明确设置在某个版本上,无论是当前版本还是之前版本 | 该版本的内容总长度。 没有明确设置层的版本只会针对唯一块计费。1 |
| 设为已归档 | 所有版本和快照的完整内容长度。1 |
1如果还有其他较早版本或快照未从其原始访问层移动,则这些版本或快照将根据其包含的唯一块数计费,如 Blob 访问层未显式设置时的计费 中所述。
下图展示了当你将版本化的 blob 移动到不同层时,对象的计费方式。
你无法撤销将 Blob、版本或快照显式设置为某个层级。 如果你把一个blob移到新层级,然后再移回原层,即使它和原层级的其他对象共享块块,你也要为该对象的全部内容长度付费。
显式设置 blob 的层、版本或快照的操作包括:
在启用了软删除的情况下删除 blob
当你启用 blob 软删除时,你会为所有软删除实体支付与实时数据相同的费用。 如果你删除或覆盖了你明确为其设置层级的当前版本,你就要按完整内容长度为该软删除 blob 的任何先前版本付费。 关于 blob 版本管理和软删除如何协同工作的更多信息,请参见 功能交互。
监视和故障排除
我的LCM政策不会在预期时删除版本: 版本的时间计算依据是你最初写入其数据的时间,而不是它变成旧版本的时间。 时间从 blob 创建开始,而不是从将其推入版本历史的覆盖操作开始。 因此,一个在被覆盖前长时间保持最新的 blob,可能会生成一个在创建时就已经超过您的
daysAfterCreationGreaterThan阈值的旧版本,导致它几乎立刻被删除。 相反,最近创建的blob版本可能比预期更持久。 要确认的是,查看版本上的实际创建时间戳,而不是假设它和覆盖时间一致。禁用版本后,我的账单依然很高:现有版本会保留,直到你手动删除它们。
我无法禁用版本控制。 账户上可能配置了对象复制。 先删除所有对象复制策略,然后禁用版本控制。 或者,容器或账户上可能存在不可更改性(WORM)策略,其版本控制无法禁用。