Azure 页 Blob 概述

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

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

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

限制

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

示例用例

下面介绍几个页 Blob 的用例,先从 Azure IaaS 磁盘说起。 Azure 页 Blob 是 Azure IaaS 虚拟磁盘平台的主干。 Azure OS 磁盘和数据磁盘都实现为虚拟磁盘,其中的数据持久保存在 Azure 存储平台中,然后传送到虚拟机以获得最大性能。 Azure 磁盘以 Hyper-V VHD 格式持久化保存,并以 页 blob 的形式存储在 Azure 存储中。 除了对 Azure IaaS VM 使用虚拟磁盘以外,页 Blob 还可实现 PaaS 和 DBaaS 方案,例如 Azure SQL 数据库服务,该服务目前使用页 Blob 存储 SQL 数据,以便针对数据库快速执行随机读写操作。 另一个示例是,如果使用 PaaS 服务作为共享媒体来访问协作式视频编辑应用程序,则页 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 进行开发,请参阅 使用页 Blob 进行开发。 例如,请查看如何使用用于 .NET 的存储客户端库来访问页 Blob。

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

显示账户、容器和页 Blob 之间关系的屏幕截图

创建一个指定大小的空页 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 服务中成功完成,并且已复制以确保持久性和弹性,该写入即被视为已提交,并向客户端返回成功响应。

下图显示了两个单独的写入操作:

一个图,显示了两个不同的写入选项。

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

从页 Blob 中读取页面

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

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

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

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

一个图,显示了偏移量为 256 且范围大小为 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,可灵活地从多个客户端直接访问,无需附加/分离磁盘,从而简化了经典部署模型,并消除了 VM 出现问题的风险。 此外,在随机读/写操作方面,此方法提供的性能级别与使用磁盘时相同

持续性和高可用性

标准存储和高级存储都属于高持久性存储,其中页 Blob 数据始终会被复制,以确保持久性和高可用性。 一致地为 IaaS 磁盘和页 Blob 提供企业级持续性,并具有行业领先的 零%年化故障率

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

无缝迁移到 Azure

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

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

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