Azure 页 Blob 概述

Azure 存储提供了三种类型的 Blob 存储:块 Blob、追加 Blob 和页 Blob。 块 Blob 由块组成,非常适合用于存储文本或二进制文件,以及高效上传大型文件。 追加 Blob 也由块组成,但它们已针对追加操作进行优化,因此非常适合用于日志记录方案。 页 Blob 由总大小可达 8 TB 的 512 字节页面组成,专为频繁的随机读/写操作而设计。 页 Blob 是 Azure IaaS 磁盘的基础。 本文重点介绍页 Blob 的功能和优势。

页 Blob 是 512 字节页面的集合,提供读/写任意字节范围的功能。 因此,页 Blob 非常适用于存储基于索引的稀疏数据结构,如虚拟机和数据库的 OS 磁盘与数据磁盘。 例如,Azure SQL 数据库使用页 Blob 作为数据库的基础持久性存储。 此外,页 Blob 往往还用于支持基于范围的更新的文件。

Azure 页 Blob 的重要功能包括 REST 接口、基础存储持久性,以及无缝迁移到 Azure 的功能。 下一部分将更详细地介绍这些功能。 此外,有两种类型的存储目前支持 Azure 页 Blob:高级存储和标准存储。 高级存储专门针对需要持续高性能和低延迟的工作负荷而设计,因此,高级页 Blob 非常适合用于高性能存储方案。 标准存储帐户更具成本效益,可用于运行对延迟不太敏感的工作负荷。

限制

页 blob 只能使用“热”访问层,不能使用“冷”或“存档”层。 有关访问层的详细信息,请参阅 Blob 数据的热访问层、冷访问层和存档访问层

示例用例

让我们从 Azure IaaS 磁盘着手,讨论页 Blob 的几种用例。 Azure 页 Blob 是 Azure IaaS 虚拟磁盘平台的主干。 Azure OS 磁盘和数据磁盘都实现为虚拟磁盘,其中的数据持久保存在 Azure 存储平台中,然后传送到虚拟机以获得最大性能。 Azure 磁盘以 Hyper-V VHD 格式保存,并在 Azure 存储中存储为页 Blob。 除了对 Azure IaaS VM 使用虚拟磁盘以外,页 Blob 还可实现 PaaS 和 DBaaS 方案,例如 Azure SQL 数据库服务,该服务目前使用页 Blob 存储 SQL 数据,以便针对数据库快速执行随机读写操作。 另一个示例是,如果使用 PaaS 服务作为共享媒体来访问协作式视频编辑应用程序,则页 Blob 可以实现对媒体中随机位置的快速访问。 此外,多个用户可以使用页 Blob 快速高效地编辑和合并同一媒体。

第一方 Azure 服务(例如 Azure Site Recovery 和 Azure 备份)以及许多第三方开发商已使用页 Blob 的 REST 接口实现了行业领先的创新。 下面是在 Azure 上实现的一些独特方案:

  • 应用程序主导的增量快照管理:应用程序可以利用页 Blob 快照和 REST API 来保存应用程序检查点,而不会产生高昂的数据复制成本。 Azure 存储支持页 Blob 的本地快照,这类快照不要求复制整个 Blob。 使用这些公共快照 API 还可以访问和复制快照之间的增量数据。
  • 将应用程序和数据从本地实时迁移到云中:复制本地数据并使用 REST API 将数据直接写入 Azure 页 Blob,同时,本地 VM 可继续保持运行。 与目标同步后,可以使用该数据快速故障转移到 Azure VM。 这样,便可以在几乎不造成停机的情况下,将 VM 和虚拟磁盘从本地迁移到云中,因为数据迁移在后台发生,同时我们可以继续使用 VM,并且故障转移所需的停机时间很短(以分钟计)。
  • 基于 SAS 的共享访问,可以实现支持并发控制的方案,例如多个读取者和单个写入者。

非托管磁盘即将停用,有关详细信息,请参阅在 2025 年 9 月 30 日前迁移 Azure 非托管磁盘

定价

页 Blob 提供的两种类型的存储都有其自己的定价模型。 高级页 blob 遵循托管磁盘定价模型,而标准页 blob 按使用的大小和单个事务计费。 有关详细信息,请参阅 Azure 页 Blob 定价页

页 Blob 功能

REST API

请参阅以下文档,开始使用页 Blob 进行开发。 例如,请查看如何使用用于 .NET 的存储客户端库来访问页 Blob。

下图描绘了帐户、容器和页 Blob 之间的整体关系。

Screenshot showing relationships between account, containers, and page blobs

创建指定大小的空页 Blob

首先,获取对容器的引用。 若要创建页 blob,请调用 GetPageBlobClient 方法,然后调用 PageBlobClient.Create 方法。 传入要创建的 blob 的最大大小。 该大小必须是 512 字节的倍数。

long OneGigabyteAsBytes = 1024 * 1024 * 1024;

BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);

var blobContainerClient =
    blobServiceClient.GetBlobContainerClient(Constants.containerName);

var pageBlobClient = blobContainerClient.GetPageBlobClient("0s4.vhd");

pageBlobClient.Create(16 * OneGigabyteAsBytes);

重设页 Blob 的大小

若要在创建后重设页 Blob 的大小,请使用 Resize 方法。 请求的大小应为 512 字节的倍数。

pageBlobClient.Resize(32 * OneGigabyteAsBytes);

将页面写入页 Blob

若要写入页面,请使用 PageBlobClient.UploadPages 方法。

pageBlobClient.UploadPages(dataStream, startingOffset);

这样,便可以写入一组有序页面(最大 4MB)。 写入的偏移量必须在某个 512 字节边界处 (startingOffset % 512 == 0) 开始,在某个 512 边界 - 1 处结束。

针对一组有序页面发出的写入请求在 Blob 服务中成功、已复制以实现持久性和复原能力后,即会提交写入,将向客户端返回成功响应。

下图显示了 2 种不同的写入操作:

A diagram showing the two separate write options.

  1. 一个写入操作从长度 1024 字节的偏移 0 处开始
  2. 一个写入操作从长度 1024 字节的偏移 4096 处开始

从页 Blob 中读取页面

若要读取页面,请使用 PageBlobClient.Download 方法从页 Blob 中读取某个范围的字节。

var pageBlob = pageBlobClient.Download(new HttpRange(bufferOffset, rangeSize));

这样,便可以从 Blob 中的任意偏移位置开始下载整个 Blob 或字节范围。 读取时,偏移不需要在 512 的倍数位置开始。 从 NUL 页面读取字节时,服务将返回零字节。

下图显示了偏移量为 256、范围大小为 4352 的读取操作。 返回的数据以橙色突出显示。 为 NUL 页面返回了零。

A diagram showing a Read operation with an offset of 256 and a range size of 4352

如果使用稀疏填充的 Blob,可以只下载有效的页面区域,以避免支付零字节的传出费用,并降低下载延迟。

若要确定数据支持的页面,请使用 PageBlobClient.GetPageRanges。 然后,可以枚举返回的范围,并下载每个范围中的数据。

IEnumerable<HttpRange> pageRanges = pageBlobClient.GetPageRanges().Value.PageRanges;

foreach (var range in pageRanges)
{
    var pageBlob = pageBlobClient.Download(range);
}

租赁页 Blob

“租赁 Blob”操作在 Blob 上针对写入与删除操作建立和管理一把锁。 如果要从多个客户端访问页 Blob,则此操作非常有用,因为它可以确保每次只有一个客户端能够写入 Blob。 例如,Azure 磁盘利用此租赁机制来确保磁盘只能由一个 VM 管理。 锁的持续时间可以是 15 到 60 秒,也可以是无限期。 有关更多详细信息,请参阅此文档

除了丰富的 REST API 以外,页 Blob 还提供共享访问、持久性和增强的安全性。 后续的篇幅将更详细地介绍这些优势。

并发访问

页 Blob REST API 及其租赁机制可让应用程序从多个客户端访问页 Blob。 例如,假设需要构建一个要与多个用户共享存储对象的分布式云服务。 该服务可能是向多个用户提供大型图像集合的 Web 应用程序。 实现此目的的方法之一是使用包含附加磁盘的 VM。 此方法的弊端包括:(i) 存在只能将一个磁盘附加到一个 VM 的约束,因此限制了可伸缩性和灵活性,并增大了风险。 如果该 VM 或其上运行的服务出现问题,则由于租赁机制,只能在租约过期或中断之后,才能访问图像;(ii) 使用 IaaS VM 会产生额外的成本。

一种替代做法是直接通过 Azure 存储 REST API 使用页 Blob。 使用此方法不会产生高昂的 IaaS VM 使用成本;可直接从多个客户端访问页 Blob,因此获得完全的灵活性;不需要附加/分离磁盘,因此简化了经典部署模型;可消除 VM 出现问题的风险。 此外,在随机读/写操作方面,此方法提供的性能级别与使用磁盘时相同

持续性和高可用性

标准存储和高级存储都属于持久性存储,其中的页 blob 数据始终得到复制,以确保持久性和高可用性。Azure 为 IaaS 磁盘和页 blob 不断提供企业级持久性,年度故障率为 0%,达到行业领先水平。

有关标准和高级存储帐户的 Azure 存储冗余的详细信息,请参阅 Azure 存储冗余,具体请参阅以下两部分:

无缝迁移到 Azure

对于有意实施其自己的自定义备份解决方案的客户和开发人员,Azure 还提供只保存增量数据的增量快照。 此功能避免了初始完整复制的成本,可大幅降低备份成本。 除了有效读取和复制差异数据的功能以外,还有一个强大的功能可以进一步推动开发人员的创新,在 Azure 上带来极佳的备份和灾难恢复 (DR) 体验。 可以使用 Blob 快照为 Azure 上的 VM 设置自己的备份或灾难恢复解决方案,并可以使用获取页面范围 API 和增量复制 Blob API 轻松复制增量数据以实现灾难恢复。

此外,许多企业已在本地数据中心运行关键工作负荷。 若要将工作负荷迁移到云中,一个主要的考虑因素是复制数据时需要多长时间的停机,以及在交接之后出现不可预见问题的风险。 在许多情况下,停机时间可能是迁移到云的一个阻碍因素。 Azure 使用页 Blob REST API 解决了此问题,可以在几乎不会对关键工作负荷造成干扰的情况下实现云迁移。

有关如何创建快照以及如何从快照还原页 Blob 的示例,请参阅使用增量快照设置备份过程一文。