块 blob 的对象复制

对象复制在源存储帐户和目标帐户之间异步复制块 blob。 对象复制支持的部分方案包括:

  • 最大程度地降低延迟。 通过使客户端可以从物理位置更接近的区域使用数据,对象复制可以降低读取请求的延迟。
  • 提高计算工作负载的效率。 通过对象复制,计算工作负载可以在不同区域中处理相同的块 blob 集。
  • 优化数据分发。 您可以在单个位置处理或分析数据,然后仅将结果复制到其他区域。
  • 优化成本。 复制数据后,可以使用生命周期管理策略将数据转移到存档层,从而降低成本。

下图显示了对象复制如何将块 blob 从一个区域中的源存储帐户复制到两个不同区域中的目标帐户。

显示对象复制工作方式的图

若要了解如何配置对象复制,请参阅配置对象复制

对象复制的先决条件和注意事项

对象复制还需要启用以下 Azure 存储功能:

启用更改源和 blob 版本控制可能会产生额外的成本。 有关详细信息,请参阅 Azure 存储定价页

通用 v2 存储帐户和高级块 blob 帐户支持对象复制。 源帐户和目标帐户都必须是通用 v2 或高级块 blob 帐户。 对象复制仅支持块 blob;不支持追加 blob 和页 blob。

使用 Microsoft 托管密钥或客户管理的密钥进行加密的帐户支持对象复制。 若要详细了解客户管理的密钥,请参阅用于 Azure 存储加密的客户管理的密钥

使用客户提供的密钥进行加密的源帐户中的 Blob 不支持对象复制。 有关客户提供的密钥的详细信息,请参阅在对 Blob 存储的请求中提供加密密钥

对象复制策略中的源帐户或目标帐户均不支持客户管理的故障转移。

通过使用 Data Lake Storage Gen2 API 上传的 blob 不支持对象复制。

对象复制的工作原理

对象复制根据你配置的规则异步复制容器中的块 blob。 blob 的内容、与 blob 关联的任何版本以及 blob 的元数据和属性都从源容器复制到目标容器。

重要

因为块 blob 数据是以异步方式复制的,所以源帐户和目标帐户不会立即同步。目前没有关于将数据复制到目标帐户所需时间的 SLA。 你可以在源 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

Azure Blob 存储的不可变性策略包括基于时间的保留策略和法定保留。 当不可变性策略对目标帐户生效时,对象复制可能会受到影响。 有关不可变性策略的详细信息,请参阅使用不可变存储来存储业务关键型 blob 数据

如果容器级不可变性策略对目标帐户中的容器有效,并且源容器中的对象被更新或删除,则对源容器执行的操作可能会成功,但对目标容器执行该操作将会失败。 若要详细了解范围设为容器的不可变性策略禁止哪些操作,请参阅使用容器级范围的方案

如果版本级不可变性策略对目标帐户中的 blob 版本有效,并且源容器中的 blob 版本被删除或更新,则对源对象执行的操作可能会成功,但对目标对象执行该操作将会失败。 若要详细了解范围设为容器的不可变性策略禁止哪些操作,请参阅使用版本级范围的方案

对象复制策略和规则

配置对象复制时,需要创建复制策略,以指定源存储帐户和目标帐户。 复制策略包括一个或多个规则,用于指定源容器和目标容器,并指明复制源容器中的哪些块 blob。

配置对象复制以后,Azure 存储会定期检查源帐户的更改源,并将所有写入或删除操作以异步方式复制到目标帐户。 复制延迟取决于要复制的块 blob 的大小。

复制策略

配置对象复制时,需要通过 Azure 存储资源提供程序在目标帐户上创建复制策略。 创建复制策略后,Azure 存储将为其分配策略 ID。 然后,必须使用该策略 ID 将该复制策略与源帐户进行关联。 源帐户和目标帐户上的策略 ID 必须相同,才能进行复制。

一个源帐户最多可以复制到两个目标帐户,每个目标帐户使用一个策略。 类似地,一个帐户可以作为不超过两个复制策略的目标帐户。

源帐户和目标帐户可以位于相同区域,也可以位于不同区域。 此外,它们可以位于同一订阅,也可以位于不同订阅。 (可选)源帐户和目标帐户可以驻留在不同的 Microsoft Entra 租户中。 只能为每个源帐户/目标帐户对创建一个复制策略。

复制规则

复制规则指定 Azure 存储如何将 blob 从源容器复制到目标容器。 可以为每个复制策略最多指定 1000 个复制规则。 每个复制规则定义一个源和目标容器,每个源和目标容器只能在一个规则中使用,这意味着最多可以有 1000 个源容器和 1000 个目标容器参与一个复制策略。

创建复制规则时,默认情况下仅复制随后添加到源容器的新块 blob。 你可以指定复制新的和现有的块 blob,也可以定义自定义复制范围,以复制从指定的时间开始创建的块 blob。

也可以将一个或多个筛选器指定为复制规则的一部分,以按前缀筛选块 blob。 指定前缀时,只会将源容器中与该前缀匹配的 blob 复制到目标容器。

源和目标容器必须都存在,然后才能在规则中指定它们。 创建复制策略后,不允许将操作写入目标容器。 任何尝试写入目标容器的操作都会失败,错误代码为 409(冲突)。 若要写入为其配置了复制规则的目标容器,则必须删除为该容器配置的规则,或者删除复制策略。 当复制策略处于活动状态时,允许对目标容器执行读取和删除操作。

你可以针对目标容器中的 blob 调用设置 Blob 层操作,将其移动到存档层。 有关存档层的详细信息,请参阅 Blob 数据的访问层

注意

更改源帐户中 Blob 的访问层不会更改目标帐户中该 Blob 的访问层。

策略定义文件

对象复制策略由 JSON 文件定义。 可以从现有对象复制策略中获取策略定义文件。 还可以通过上传策略定义文件来创建对象复制策略。

策略定义文件示例

下面的示例在目标帐户上定义了复制策略,该策略包含一个与前缀 b 匹配的规则,并为要复制的 blob 设置了最小创建时间。 请注意将尖括号中的值替换为你自己的值:

{
  "properties": {
    "policyId": "default",
    "sourceAccount": "/subscriptions/<subscriptionId>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "destinationAccount": "/subscriptions/<subscriptionId>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>",
    "rules": [
      {
        "ruleId": "",
        "sourceContainer": "<source-container>",
        "destinationContainer": "<destination-container>",
        "filters": {
          "prefixMatch": [
            "b"
          ],
          "minCreationTime": "2021-08-028T00:00:00Z"
        }
      }
    ]
  }
}

指定源帐户和目标帐户的完整资源 ID

创建策略定义文件时,请为 sourceAccount 和 destinationAccount 条目指定完整的 Azure 资源管理器资源 ID,如上一节中的示例所示。 若要了解如何查找存储帐户的资源 ID,请参阅获取存储帐户的资源 ID

完整资源 ID 采用以下格式:

/subscriptions/<subscriptionId>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>

策略定义文件以前只需要帐户名称,而不是存储帐户的完整资源 ID。 由于 Azure 存储资源提供程序 REST API 版本 2021-02-01 中引入了 AllowCrossTenantReplication 安全属性,现在,如果对参与复制策略的存储帐户禁止跨租户复制,必须为创建的任何对象复制策略提供完整的资源 ID。 Azure 存储使用完整的资源 ID 来验证源帐户和目标帐户是否位于同一租户中。 若要详细了解如何禁止跨租户复制策略,请参阅防止跨 Microsoft Entra 租户复制

虽然在对存储帐户允许跨租户复制时仍支持仅提供帐户名称,但作为最佳实践,Azure 建议始终提供完整资源 ID。 Azure 存储资源提供程序 REST API 的所有先前版本都支持在对象复制策略中使用完整的资源 ID 路径。

下表描述了在对存储帐户允许或禁止跨租户复制的情况下,如果在创建复制策略时指定完整资源 ID 而非帐户名称,会发生什么情况。

策略定义中的存储帐户标识符 允许跨租户复制 不允许跨租户复制
完整资源 ID 可以创建同租户策略。

可以创建跨租户策略。
可以创建同租户策略。

无法创建跨租户策略。
仅帐户名称 可以创建同租户策略。

可以创建跨租户策略。
同租户策略和跨租户策略都无法创建。 发生错误,因为 Azure 存储无法验证源帐户和目标帐户是否在同一租户中。 此错误指示必须在策略定义文件中指定 sourceAccount 和 destinationAccount 条目的完整资源 ID。

指定策略和规则 ID

下表汇总了每种情况下,要对策略定义文件中 policyId 和 ruleId 条目使用的值。

为此帐户创建策略定义文件时... 将策略 ID 设置为此值 将规则 ID 设置为此值
目标帐户 字符串值“默认”。 Azure 存储会为你创建策略 ID 值。 空字符串。 Azure 存储会为你创建规则 ID 值。
源帐户 下载目标帐户的策略定义文件时返回的策略 ID 的值。 下载目标帐户的策略定义文件时返回的规则 ID 的值。

防止跨 Microsoft Entra 租户复制

Microsoft Entra 租户是一个专用的 Microsoft Entra ID 实例,表示用于身份验证和访问控制管理的组织。 每个 Azure 订阅与一个 Microsoft Entra 租户存在信任关系。 订阅中的所有资源(包括存储帐户)都与同一个 Microsoft Entra 租户相关联。 有关详细信息,请参阅什么是 Microsoft Entra ID?

默认情况下,从 2023 年 12 月 15 日开始创建的新帐户将禁用跨租户复制。 如果安全策略要求将对象复制限制为仅位于同一租户中的存储帐户,则可以通过设置安全属性 AllowCrossTenantReplication(预览版)禁止跨租户复制。 对某个存储帐户禁止跨租户对象复制时,对于将该存储帐户配置为源或目标帐户的任何对象复制策略,Azure 存储要求源帐户和目标帐户位于同一个 Microsoft Entra 租户中。 有关禁止跨租户对象复制的详细信息,请参阅防止跨 Microsoft Entra 租户进行对象复制

若要对某个存储帐户禁止跨租户对象复制,则将 AllowCrossTenantReplication 属性设置为 false。 如果存储帐户当前未参与任何跨租户对象复制策略,则将 AllowCrossTenantReplication 属性设置为 false 可防止将来配置跨租户对象复制策略时将该存储帐户作为源或目标。

如果存储帐户当前已参与一个或多个跨租户对象复制策略,则不允许将 AllowCrossTenantReplication 属性设置为 false。 必须先删除现有的跨租户策略,然后才能禁止跨租户复制。

默认情况下,对于从 2023 年 12 月 15 日开始创建的存储帐户,“AllowCrossTenantReplication”属性设置为“false”。 对于 2023 年 12 月 15 日之前创建的存储帐户,当存储帐户的“AllowCrossTenantReplication”属性的值为“null”或“true”时,授权用户可以配置跨租户对象复制策略,并以该帐户作为源或目标。 有关如何配置跨租户策略的详细信息,请参阅为块 blob 配置对象复制

可以使用 Azure Policy 审核一组存储帐户,以确保将 AllowCrossTenantReplication 属性设置为防止跨租户对象复制。 还可以使用 Azure Policy 对一组存储帐户实施治理。 例如,可以创建具有拒绝效果的策略,以在 AllowCrossTenantReplication 属性设置为 true 的情况下防止用户创建存储帐户,或者防止用户通过修改现有存储帐户将属性值更改为 true。

复制状态

你可以在源帐户中查看 blob 的复制状态。 有关详细信息,请参阅查看 blob 的复制状态

注意

正在进行复制时,无法确定已复制的数据百分比。

如果源帐户中 blob 的复制状态指示失败,则请调查以下可能的原因:

  • 请确保已在目标帐户上配置对象复制策略。
  • 请验证目标帐户是否仍然存在。
  • 请验证目标容器是否仍然存在。
  • 请验证目标容器是否未处于删除过程中,或者未被删除。 删除容器可能需要最多 30 秒的时间。
  • 请验证目标容器是否仍参与对象复制策略。
  • 如果在写入操作中已使用客户提供的密钥对源 blob 进行了加密,则对象复制将失败。 有关客户提供的密钥的详细信息,请参阅在对 Blob 存储的请求中提供加密密钥
  • 检查源 Blob 或目标 Blob 是否已移动到存档层。 无法通过对象复制来复制存档的 Blob。 有关存档层的详细信息,请参阅 Blob 数据的访问层
  • 验证目标容器或 Blob 是否不受不可变性策略的保护。 请记住,容器或 Blob 可以从其父级继承不可变性策略。 有关不可变性策略的详细信息,请参阅 Blob 数据的不可变存储概述

功能支持

启用 Data Lake Storage Gen2、网络文件系统 (NFS) 3.0 协议或 SSH 文件传输协议 (SFTP) 可能会影响对此功能的支持。 如果已启用这些功能中的某一项,请参阅 Azure 存储帐户中的 Blob 存储功能支持,以评估对此功能的支持。

计费

配置对象复制无需任何费用。 这包括启用更改源、启用版本控制以及添加复制策略的任务。 但是,对于源帐户和目标帐户的读写事务,对象复制会产生成本,在将数据从源帐户复制到目标帐户时会产生出站费用,处理更改源时还会产生读取费用。

下面是成本明细。 若要查找每个成本组件的价格,请参阅 Azure Blob 存储定价

更新源帐户中的 Blob 的成本 在目标帐户中复制数据的成本
写入操作的事务成本 读取更改源记录的事务成本
Blob 和每个 Blob 版本的存储成本1 读取 Blob 和 Blob 版本的事务成本2
添加更改源记录的成本 写入 Blob 和 Blob 版本的事务成本2
Blob 和每个 Blob 版本的存储成本1
网络出口成本3

1 在源帐户上,如果尚未更改 blob 或版本的层级,则会针对该 blob 以及其版本中唯一的数据块进行计费。 请参阅 Blob 版本控制定价和计费。 在目标帐户中,对于某个版本,你需要为该版本的所有块付费,无论这些块是否独一无二。

2 这仅包括自上次复制完成后创建的 Blob 版本。

3 对象复制会将整个版本(而不仅仅是版本的唯一块)复制到目标。 此传输会产生网络出口成本。 请参阅带宽定价

提示

为了降低出现意外账单的风险,请在仅包含少量对象的帐户中启用对象复制。 然后,在生产设置中启用该功能之前,衡量对成本的影响。

后续步骤