对象复制在源存储帐户和目标帐户之间异步复制块 blob。 对象复制支持的部分方案包括:
- 最大程度地降低延迟。 通过使客户端可以从物理位置更接近的区域使用数据,对象复制可以降低读取请求的延迟。
- 提高计算工作负载的效率。 通过对象复制,计算工作负载可以在不同区域中处理相同的块 blob 集。
- 优化数据分发。 可以在单个位置处理或分析数据,然后仅将结果复制到其他区域。
- 优化成本。 复制数据后,可以通过使用生命周期管理策略将其移动到存档层来降低成本。
下图显示了对象复制如何将块 blob 从一个区域中的源存储帐户复制到两个不同区域中的目标帐户。
若要了解如何配置对象复制,请参阅配置对象复制。
对象复制的先决条件和注意事项
对象复制还需要启用以下 Azure 存储功能:
- 更改源:必须在源帐户上启用。 若要了解如何启用更改源,请参阅启用和禁用更改源。
- Blob 版本控制:必须同时在源帐户和目标帐户上启用。 若要了解如何启用版本控制,请参阅启用和管理 blob 版本控制。
启用更改反馈和Blob版本控制可能会产生额外的成本。 有关详细信息,请参阅 Azure 存储定价页。
通用 v2 存储帐户和高级块 blob 帐户支持对象复制。 源帐户和目标帐户都必须是通用 v2 或高级块 blob 帐户。 对象复制仅支持块 blob;不支持追加 blob 和页 blob。
使用 Microsoft 托管密钥或客户管理的密钥进行加密的帐户支持对象复制。 若要详细了解客户管理的密钥,请参阅用于 Azure 存储加密的客户管理的密钥。
使用客户提供的密钥进行加密的源帐户中的 Blob 不支持对象复制。 有关客户提供的密钥的详细信息,请参阅在对 Blob 存储的请求中提供加密密钥。
对象复制策略中的源帐户或目标帐户均不支持客户管理的故障转移。
在启用了分层命名空间的帐户中尚不支持对象复制。
使用 Data Lake Storage API 上传的 Blob 不支持对象复制。
对象复制的工作原理
对象复制根据你配置的规则异步复制容器中的块 blob。 blob 的内容、与 blob 关联的任何版本以及 blob 的元数据和属性都从源容器复制到目标容器。
Blob 版本控制
对象复制要求同时在源帐户和目标帐户上启用 blob 版本控制。 当源帐户中复制的 blob 被修改时,源帐户中将创建一个新的 blob 版本来反映修改前 blob 以前的状态。 源帐户中的当前版本反映了最近的更新。 当前版本和任何之前的版本都将复制到目标帐户。 要详细了解写入操作如何影响 blob 版本,请参阅对写入操作进行版本控制。
如果存储帐户具有有效的对象复制策略,则无法禁用该帐户的 Blob 版本控制。 必须先删除帐户上的任何对象复制策略,然后才能禁用 blob 版本控制。
注意
仅将 blob 复制到目标。 不会复制数据块的版本 ID。 将 Blob 放置在目标位置后,会分配新版本 ID。
删除源帐户中的 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 从源容器复制到目标容器。 每个复制策略最多可以指定 1,000 个复制规则。 每个复制规则定义一个源和目标容器,每个源和目标容器只能在一个规则中使用。 因此,最多可以有 1,000 个源容器和 1,000 个目标容器参与单个复制策略。
创建复制规则后,预先存在的块 Blob 将被忽略,默认情况下,仅复制在创建规则后添加的新块 Blob。 但是,可以指定同时复制新的和现有的块 Blob。 还可以定义一个自定义复制范围,用于复制在指定时间后创建的任何 block 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。 必须先删除现有的跨租户策略,然后才能禁止跨租户复制。
默认情况下, AllowCrossTenantReplication 属性对于从 2023 年 12 月 15 日开始创建的存储帐户设置为 false。 对于在 2023 年 12 月 15 日之前创建的存储帐户,当存储帐户的 AllowCrossTenantReplication 属性的值 为 null 或 true 时,授权用户可以将此帐户配置为源或目标跨租户对象复制策略。 有关如何配置跨租户策略的详细信息,请参阅为块 blob 配置对象复制。
可以使用 Azure Policy 审核一组存储帐户,以确保将 AllowCrossTenantReplication 属性设置为防止跨租户对象复制。 还可以使用 Azure Policy 对一组存储帐户实施治理。 例如,可以创建具有 deny 效果的策略,以防止用户创建 允许CrossTenantReplication 属性设置为 true 的存储帐户,或者修改现有存储帐户,将属性值更改为 true。
复制指标
对象复制支持两个指标,让你深入了解复制进度:
- 待复制的操作数:按时间桶统计,从源存储帐户到目标存储帐户待复制的操作总数
- 待复制的字节数:按时间分段统计,从源到目标存储账户等待复制的字节总和。
可以使用时间桶维度查看前面列出的每个指标。 这样就可以深入了解以下每个时间桶内待复制的字节数或操作数:
- 0-5 分钟
- 5-10 分钟
- 10-15 分钟
- 15-30 分钟
- 30 分钟-2 小时
- 2-8 小时
- 8-24 小时
-
>24 小时
以下示例图像显示了前七天的挂起操作和字节指标:
可以在源帐户上启用复制指标,以监视挂起字节数和挂起操作数。 有关详细信息,请参阅 配置复制指标。
复制状态
你可以在源帐户中查看 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 对象复制会将整个版本(而不仅仅是版本的唯一块)复制到目标。 此传输会产生网络出口成本。 请参阅带宽定价。
提示
若要降低意外计费的风险,在仅包含少数对象的帐户中启用对象复制。 然后,在生产设置中启用该功能之前,衡量对成本的影响。