快照是 Blob 在特定时间点创建的只读副本。 你不需要启用blob快照功能。 相反,应使用 Snapshot Blob 操作按需创建快照。 有关详细信息,请参阅 快照 Blob 操作。 你可以通过使用自定义脚本在计划中或特定操作前后捕捉 blob 的时间点副本来自动化快照创建。
推荐的数据保护配置
blob快照是多种数据保护功能之一。 选择合适的功能或功能组合取决于你的工作负载以及你要防范的风险。 想了解更多关于Azure数据保护建议的信息,请参见数据保护概述。
快照与版本
快照类似于blob版本,但两者在生成方式和最适合用途上有所不同。 快照是手动且由应用程序驱动的:当应用决定需要时,你会明确创建一个时间点副本。 版本是自动且由系统管理的:当启用 blob 版本控制时,Azure 存储 每次写入或删除都会生成一个新版本,无需应用逻辑。
当你希望实现自动、持续的保护,防止意外或恶意覆盖和删除时,使用版本控制功能。 当你需要有意创建的时间点副本时,比如计划更新前处于已知良好状态的检查点,而不是捕捉每一个变更时,才使用快照。
注意
尽管可以使用快照来近似实现版本控制行为,但 Azure 建议在 FNS 帐户上启用 Blob 版本控制,以自动防止覆盖和删除。 快照最适合用于有意进行的时间点捕获,而不适用于捕获每一次更改的保护机制。 更多信息请参见 Blob 版本管理。
快照的工作原理
blob 的快照与其基础 blob 相同,只是 blob 的 URI 后附加了一个 DateTime 值,以指示创建该快照的时间。 例如,如果页 Blob URI 为 http://storagesample.core.blob.chinacloudapi.cn/mydrives/myvhd,则快照 URI 将类似于 http://storagesample.core.blob.chinacloudapi.cn/mydrives/myvhd?snapshot=2011-03-09T01:42:34.9360000Z。
创建 Blob 的快照时,会将该 Blob 的系统属性以相同的值复制到快照中。 基本 Blob 的元数据也会复制到快照,除非创建快照时为其指定了单独的元数据。 创建快照后,可以读取、复制或删除它,但无法修改它。 任何与基本 Blob 关联的租约都不会影响快照。 无法对快照获取租约。
一个 Blob 可以有任意数目的快照。 快照会持续存在,直到你明确删除它们,无论是单独删除,还是作为基础 blob 的 删除 Blob 操作的一部分。 你可以在热层、冷层或凉层创建 Blob 快照。 你无法创建归档的blob的快照。
Important
每个blob拥有大量快照会增加blob列表操作的延迟。 Azure建议为每个 Blob 维护少于 1,000 个快照。 你可以使用生命周期管理系统自动删除旧快照。 有关生命周期管理的更多信息,请参见通过自动执行 Azure Blob 存储访问层来优化成本。
快照对于blob版本控制未涵盖的blob类型和操作尤其有用。 由于一些写操作,如 Put Page(页面 blob)和 Append Block(append blobs),即使启用了版本控制,也不会创建 blob 版本,快照为在使用这些 API 时捕捉 blob 某一时点的状态提供了一种方法。 例如,VHD 文件存储 VM 磁盘的当前信息和状态。 你可以在虚拟机内部分离磁盘或关闭虚拟机,为其 VHD 文件创建快照,之后使用该快照检索该时间点的 VHD 文件并重新创建虚拟机。
下图展示了快照的创建过程,以及快照如何被提升为当前的 blob:
管理和恢复快照
你可以创建、列出和删除快照。 你也可以用快照将基础blob恢复到早期状态。 以下章节介绍了每项操作及其相应的工具。
从快照还原 Blob 存储对象
因为你无法修改快照,所以你需要通过将快照复制到基础 blob 上来恢复基础 blob。 调用 复制 Blob 对象 操作,并将快照 URI 指定为复制源。 该过程会将该快照的状态设为当前的基础 blob,同时保留该 blob 的现有快照。
列出快照
你可以通过使用 List Blobs 操作并在 include 参数中指定 snapshots 值,枚举与基础 blob 关联的快照以跟踪当前快照。 默认情况下,列表 blobs 请求不会返回快照。 将 include=snapshots 设置为返回每个 blob 的所有快照以及基础 blob。 更多信息请参见 List Blobs。 你也可以用 Azure 存储 的 blob inventory 生成账户中 blob 的定时报告,包括快照,方法是在清单规则定义中设置 includeSnapshots 为 true。 有关详细信息,请参阅 Blob 清单。
删除快照
你必须显式删除快照。 要删除单个快照,调用 删除 Blob 操作,并在快照查询参数中指定快照的 DateTime 值。
你不能在有活跃快照的基础blob时删除它。 要删除一个基础blob及其所有快照,请调用 Delete Blob ,并将 x-ms-delete-snapshots 头部设置为 include。 要只删除快照并保留基础blob,请将头设置为 only。
用工具管理快照
您可以通过门户、Azure CLI 和 Azure PowerShell 来管理快照。
要通过 Azure 门户创建 blob 的快照,请按照以下步骤操作:
- 在 Azure 门户中导航到存储帐户。
- 在 数据存储中,找到 容器 选项,然后选择包含 Blob 的容器。
- 选择要为其创建快照的 blob。
- 在 blob 的 概览 标签页中,选择 创建快照。
- 要查看该 blob 的快照,请选择 “快照” 标签。标签列出每个快照及其捕获的日期和时间。
功能支持
该功能未对Data Lake Storage Gen2账户启用。 此外,网络文件系统(NFS)3.0协议,或SSH文件传输协议(SFTP)可能会影响对该功能的支持。 考虑替代机制。 示例包括 blob 的软删除和AzCopy。
特征交互
版本控制
启用版本控制后,快照通常对于块 Blob 是多余的。 如果你同时启用版本控制和快照,创建快照会同时创建快照和新版本。 这一过程增加了存储对象的数量,而不增加保护。 有关详细信息,请参阅 Blob 版本控制。
软删除
软删除适用于快照:当你删除快照时,它会进入软删除状态。 你可以在保留期内使用“撤销删除 Blob”来恢复它。 此外,快照的创建和计费方式会根据是否启用版本控制而有所不同。 当禁用版本控制时,覆盖一个 blob 会生成软删除的快照。 启用版本控制时,它会生成一个新版本。 如果你明确在基 blob 上设置了层级,你就要为任何之前的版本或软删除 blob 的快照按完整内容长度付费。 有关这种计费行为的详细信息,请参见定价与计费部分。 有关软删除的更多信息,请参见 Blob软删除。
对象复制
你无法复制快照。 仅复制基础 blob。 更多信息请参见 对象复制。
生命周期管理
生命周期管理可以通过策略规则中的快照子类型来定位和删除快照。 更多信息请参见 生命周期管理。
定价和计费
创建快照(它是 Blob 的只读副本)会导致帐户产生额外的数据存储费用。 在设计申请时,了解这些费用的产生方式,以降低成本。
Blob 快照和 blob 版本一样,按与活动数据相同的费率计费。 快照的计费方式取决于你是明确设置了基础 blob 的层级,还是明确为其任何快照(或版本)设置了层级。 有关 Blob 层的详细信息,请参阅 Blob 数据的访问层。
如果你不更改一个blob或快照的层级,你将被收取该blob、其快照以及可能存在的任何版本中的唯一数据块费用。 有关详细信息,请参阅在未显式设置 Blob 层级时进行计费。
如果你更改了一个 blob 或快照的层级,无论 blob 和快照最终是否回到同一层级,你都将按整个对象计费。 有关详细信息,请参阅在显式设置了 blob 层级时进行计费。
有关 blob 版本的计费详细信息,请参阅 Blob 版本控制。
使用快照管理最大限度地降低成本
为了避免额外费用,请谨慎管理你的快照。 请遵循以下最佳实践,帮助降低快照存储所产生的成本:
- 除非应用程序设计需要保留与 Blob 关联的快照,否则请在更新 Blob 时删除并重新创建这些快照,即使你使用相同的数据进行更新也是如此。 通过删除并重新创建 blob 的快照,可以确保 blob 和快照不会出现不一致。
- 如果要保留 Blob 的快照,请避免在更新 Blob 时调用覆盖整个 Blob 的方法。 相反,更新尽可能少的区块数量以保持成本低。
未显式设置 Blob 访问层时的计费
如果你没有明确为基础 blob 或其任何快照设置 blob 层级,你就需要为在该 blob、其快照及其任何版本之间的唯一块或页付费。 你只需为 blob 及其快照共享的数据支付一次费用。 当你更新一个 blob 时,基础 blob 中的数据会与快照中存储的数据不同,你需要为每个块或页面支付唯一数据费用。
当你在块 Blob 中替换一个块时,之后你需要为该块按唯一块付费。 即使块的块ID和数据与快照中的相同,这条规则依然适用。 当你再次提交该块后,它会与快照中的对应块出现差异,你需要为它的数据付费。 同样的规则也适用于页 blob 中用相同数据更新的页面。
blob存储无法判断两个块是否包含相同的数据。 你上传并提交的每个区块都被视为唯一,即使它有相同的数据和区块ID。 因为你为唯一块付费,记住当一个 blob 有快照或版本时,更新该 blob 会导致额外的唯一块和额外费用。
当 blob 具有快照时,请对块 blob 调用更新操作,以使它们更新尽可能少的块。 允许对块进行精细控制的写入操作是Put Block和Put Block List。 另一方面,Put Blob 操作会替换 blob 的全部内容,因此可能会导致额外费用。
以下场景展示了当你没有明确设置该 Blob 层级时,块 Blob 及其快照的费用如何累积。
场景 1
在方案 1 中,基础 Blob 自创建快照后未进行更新,因此只有不重复的块 1、2 和 3 会产生费用。
场景 2
在方案 2 中,已更新基本 Blob,但未更新快照。 已更新块 3,即使它包含相同的数据和 ID,它也与快照中的块 3 不同。 因此,该帐户需要为四个数据块支付费用。
场景 3
在方案 3 中,已更新基本 Blob,但未更新快照。 块 3 已替换为基础 Blob 中的块 4,但快照仍反映块 3。 因此,该账户将按四个区块收费。
场景 4
在方案 4 中,已完全更新基本 Blob,并且其中不包含任何原始块。 因此,帐户需要为所有八个唯一块支付费用。
提示
为了降低成本,避免调用覆盖整个 blob 的方法。 相反,更新单个块。
当你明确设置了blob层级时的计费
如果你为某个 blob、快照或版本明确设置了 blob 层级,你就要为新层对象的全部内容长度付费,无论它是否与原层对象共享块。 你还要为原始等级中最旧版本的全部内容付费。 你需要为任何仍位于原始层级的版本或快照中的唯一块付费,正如 当 blob 层未明确设置时的计费 中所述。
将 blob 移到新访问层
下表描述了当你将blob或快照迁移到新层时的计费行为。
| 当你显式设置 blob 层时...... | 然后,针对以下内容进行计费... |
|---|---|
| 带有快照的基本 blob | 新层级中的基本 blob 和原始层级中最旧的快照,以及其他快照中的任何唯一块。1 |
| 具有先前版本和快照的基本 blob | 新层中的基础 blob、原始层中的最旧版本、原始层中的最旧快照,加上其他版本或快照中的任何唯一块。1 |
| 快照 | 新层级中的快照和原始层级中的基本 blob,以及其他快照中的任何独有块。1 |
1如果还有其他之前的版本或快照你没有从其原始层级移动出来,你会根据它们包含的唯一块数付费,正如 未明确设置 Blob 层时的计费中所述。
下图展示了当你将带有快照的 blob 移动到不同层时,对象的计费方式。
你无法撤销将 Blob、版本或快照显式设置为某个层级。 如果你把一个blob移到新层级,然后再移回原层,即使它和原层级的其他对象共享块块,你也要为该对象的全部内容长度付费。
显式设置 blob、版本或快照的层级的操作包括:
- 设置 Blob 访问层
- 在指定了访问层的情况下Put Blob
- 指定层级的Put Block List
- 在指定了层级的情况下复制 Blob
在启用了软删除的情况下删除 blob
当 blob 软删除启用后,如果你删除或覆盖了你明确设置了层级的基础 blob,你就要为该已软删除 blob 的任何以前版本或快照的完整内容长度付费。 关于 blob 版本管理和软删除如何协同工作的更多信息,请参见 功能交互。
下表描述了软删除的 blob 的计费行为,具体取决于是启用还是禁用了版本控制。 启用版本控制后,软删除 blob 时将创建一个新版本。 当未启用版本控制时,软删除 blob 时将创建一个软删除快照。
| 当你覆盖已显式设置了其层级的基本 blob 时... | 然后,针对以下内容进行计费... |
|---|---|
| 如果同时启用了 blob 软删除和版本控制 | 所有现有版本(按完整内容长度),无论属于哪个层级。 |
| 如果启用了 blob 软删除但禁用了版本控制 | 所有现有软删除快照均按完整内容长度计算,不考虑层级。 |
已知的限制
你不能在归档访问层为blob创建快照。
对 Data Lake Gen2 帐户快照的支持不再接受新客户。 而是使用 blob 软删除或 AzCopy。
除非你在删除调用中包含
x-ms-delete-snapshots,否则无法删除具有活动快照的 blob。对象复制不会复制快照。
创建快照后你不能修改快照。
无法对快照获取租约。
监视和故障排除
我无法删除我的基 Blob:Blob 有活动快照。 使用Delete Blob配合
x-ms-delete-snapshots: include可同时删除两者。删除基础blob后,我的快照消失了:删除基础blob会永久删除快照,除非启用blob软删除。 启用软删除以防止意外删除。
我的快照成本比预期高:如果你明确更改了blob的访问层级,你支付的是完整内容长度,而不仅仅是唯一块。 尽量避免在带有活跃快照的blob上进行显式层级更改。
查看和清点快照:在门户中,当启用 “显示 blob 快照” 时,快照会出现在存储浏览器的 blob 下。 要在整个账户范围内盘点快照计数和存储使用情况,可以使用 Azure 存储 Blob Inventory 和 Azure Monitor 中的 BlobCapacity 指标。