存档层是用于存储很少访问的 Blob 数据的脱机层。 存档层提供最低的存储成本,但与联机层相比,数据检索成本和延迟更高(热层和冷层)。 存档层中的数据必须至少保留 180 天,否则需要支付提前删除费。 有关存档层的详细信息,请参阅 存档访问层。
当 Blob 位于存档层时,它无法读取或修改。 若要读取或下载存档层中的 Blob 对象,必须先将其重新水化到联机访问层(热访问层或冷访问层)。 存档层中的数据可能最多需要 15 小时才能解除冻结,具体取决于为解除冻结操作指定的优先级。 有关 Blob 解除冻结的详细信息,请参阅存档层中的 Blob 解除冻结概述。
注意
存档层中的 Blob 处于脱机状态。 也就是说,在重新水化之前,无法读取或修改。 解除冻结过程可能需要几个小时,并产生相关的成本。 在将数据移到存档层之前,请考虑将 Blob 数据转为脱机状态是否会影响您的工作流程。
可以使用Azure门户、PowerShell、Azure CLI或其中一个Azure 存储客户端库来管理数据存档。
在上传时将 Blob 设为存档层
若要在上传时将一个或多个 Blob 存档,请直接在存档层级中创建 Blob。
若要通过 Azure 门户在上传时将 Blob 或一组 Blob 归档,请按照以下步骤操作:
导航到目标容器。
选择上载按钮。
选择要上传的文件。
展开 “高级 ”部分,并将 “访问”层 设置为 “存档”。
选择上载按钮。
若要使用 PowerShell 在上传时存档 blob 或 blob 集,请调用 Set-AzStorageBlobContent 命令,如以下示例所示。 请记得将括号中的占位符值替换为你自己的值:
$rgName = <resource-group>
$storageAccount = <storage-account>
$containerName = <container>
# Get context object
$ctx = New-AzStorageContext -StorageAccountName $storageAccount -UseConnectedAccount
# Create new container.
New-AzStorageContainer -Name $containerName -Context $ctx
# Upload a single file named blob1.txt to the archive tier.
Set-AzStorageBlobContent -Container $containerName `
-File "blob1.txt" `
-Blob "blob1.txt" `
-Context $ctx `
-StandardBlobTier Archive
# Upload the contents of a sample-blobs directory to the archive tier, recursively.
Get-ChildItem -Path "C:\sample-blobs" -File -Recurse |
Set-AzStorageBlobContent -Container $containerName `
-Context $ctx `
-StandardBlobTier Archive
若要使用 Azure CLI 在上传时存档单个 blob,请调用 az storage blob upload 命令,如以下示例所示。 请记得将括号中的占位符值替换为你自己的值:
az storage blob upload \
--account-name <storage-account> \
--container-name <container> \
--name <blob> \
--file <file> \
--tier Archive \
--auth-mode login
若要使用 Azure CLI 在上传时存档一组 blob,请调用 az storage blob upload-batch 命令,如以下示例所示。 请记得将括号中的占位符值替换为你自己的值:
az storage blob upload-batch \
--destination <container> \
--source <source-directory> \
--account-name <storage-account> \
--tier Archive \
--auth-mode login
若要使用AzCopy在上传时存档单个 blob,请调用azcopy复制命令。 提供本地文件作为源和目标 Blob URI 作为目标,并将存档层指定为目标层,如以下示例所示。 请记得将括号中的占位符值替换为你自己的值:
注释
此示例将路径参数括在单引号 ('') 内。 除 Windows Command Shell(cmd.exe)外,在所有命令行界面中使用单引号。 如果使用 Windows Command Shell (cmd.exe),请用双引号(“”)而不是单引号('')将路径参数括起来。
此示例不包含 SAS 令牌,因为它假定你已通过使用 Microsoft Entra ID 提供授权凭据。 请参阅 AzCopy 入门一文,了解如何向存储服务提供授权凭据。
azcopy copy 'C:\temp\myTextFile.txt' 'https://<storage-account>.blob.core.chinacloudapi.cn/<container>/myTextFile-archived.txt' --blob-type BlockBlob --block-blob-tier Archive
有关其他示例,请参阅使用 AzCopy将文件上传到 Azure Blob 存储。
将现有的 Blob 存档
可以通过以下两种方式之一将现有 Blob 移到存档层:
可以使用 “设置 Blob 层”操作更改 Blob 的层 。
设置 Blob 层 可将单个 Blob 从一个层移到另一个层。
请记住,当你使用 Set Blob Tier 将 Blob 移动到存档层级时,在将 Blob 重新水化之前,无法读取或修改 Blob 的数据。 如果需要在提前删除间隔过之前读取或修改 Blob 的数据,请考虑使用 复制 Blob 操作在存档层中创建 Blob 的副本。
可以使用 复制 Blob 操作将联机层中的 Blob 复制到存档层。 可以调用 复制 Blob 操作,将 Blob 从联机层(热层或冷层)复制到存档层。 源 Blob 保留在联机层中,你可以继续读取或修改联机层中的数据。
通过更改现有 Blob 层来存档现有 Blob
使用 “设置 Blob 层” 操作将 Blob 从热层或冷层移动到存档层。
“设置 Blob 层”操作最适合在提前删除间隔过前无需访问存档数据的情况。
设置 Blob 层操作更改单个 Blob 的层。 若要将一组 Blob 移到具有最佳性能的存档层,Azure建议执行批量存档操作。 批量存档操作在单个事务中向服务发送一批 “设置 Blob 层 ”调用。 有关详细信息,请参阅 批量存档。
若要将现有 Blob 移到 Azure 门户中的存档层,请执行以下步骤:
转到 Blob 所在的容器。
选择要存档的Blob。
选择 “更改层 ”按钮。
从“访问层”下拉列表中选择“存档”。
选择“保存”。
若要使用 PowerShell 将 Blob 的访问层从热层或冷层更改为存档层,请使用 Blob 的 BlobClient 属性返回 Blob 的 .NET 引用,然后对该引用调用 SetAccessTier 方法。 请记得将尖括号中的占位符替换为你自己的值:
# Initialize these variables with your values.
$rgName = "<resource-group>"
$accountName = "<storage-account>"
$containerName = "<container>"
$blobName = "<blob>"
# Get the storage account context
$ctx = (Get-AzStorageAccount `
-ResourceGroupName $rgName `
-Name $accountName).Context
# Change the blob's access tier to Archive.
$blob = Get-AzStorageBlob -Container $containerName -Blob $blobName -Context $ctx
$blob.BlobClient.SetAccessTier("Archive", $null)
若要使用 Azure CLI 将 blob 的层从热层或冷层更改为存档,请调用 az storage blob set-tier 命令。 请记得将尖括号中的占位符替换为你自己的值:
az storage blob set-tier \
--account-name <storage-account> \
--container-name <container> \
--name <blob> \
--tier Archive \
--auth-mode login
若要将 Blob 的层级从热层或冷层更改为存档层,请使用 azcopy set-properties 命令,并将 -block-blob-tier 参数设置为 archive。
重要
使用 AzCopy 更改 blob 层的功能目前为预览版。
有关适用于 beta 版、预览版或尚未正式发布的 Azure 功能的法律条款,请参阅 Azure 预览补充使用条款。
注释
此示例将路径参数括在单引号 ('') 内。 除 Windows Command Shell(cmd.exe)外,在所有命令行界面中使用单引号。 如果使用 Windows Command Shell (cmd.exe),请用双引号(“”)而不是单引号('')将路径参数括起来。
此示例不包含 SAS 令牌,因为它假定你已通过使用 Microsoft Entra ID 提供授权凭据。 请参阅 AzCopy 入门一文,了解如何向存储服务提供授权凭据。
azcopy set-properties 'https://<storage-account-name>.blob.core.chinacloudapi.cn/<container-name>/<blob-name>' --block-blob-tier=archive
若要更改虚拟目录中所有 Blob 的访问层,请参阅虚拟目录名称(而不是 Blob 名称),然后将 --recursive=true 追加到命令。
azcopy set-properties 'https://<storage-account-name>.blob.core.chinacloudapi.cn/<container-name>/myvirtualdirectory' --block-blob-tier=archive --recursive=true
通过复制操作将现有 Blob 存档
使用 复制 Blob 操作将 Blob 从热层或冷层复制到存档层。 源 Blob 保留在热层或冷层中,而目标 Blob 是在存档层中创建的。
对于可能需要在提前删除期限届满前读取或修改已存档数据的场景,复制 Blob 操作是最佳选择。 无需对已存档的 blob 重新水合,即可访问源 blob 的数据。
若要使用 PowerShell 将 Blob 从联机层复制到存档层,请调用 Start-AzStorageBlobCopy 命令并指定存档层。 请记得将尖括号中的占位符替换为你自己的值:
# Initialize these variables with your values.
$rgName = "<resource-group>"
$accountName = "<storage-account>"
$srcContainerName = "<source-container>"
$destContainerName = "<dest-container>"
$srcBlobName = "<source-blob>"
$destBlobName = "<dest-blob>"
# Get the storage account context
$ctx = (Get-AzStorageAccount `
-ResourceGroupName $rgName `
-Name $accountName).Context
# Copy the source blob to a new destination blob in archive tier.
Start-AzStorageBlobCopy -SrcContainer $srcContainerName `
-SrcBlob $srcBlobName `
-DestContainer $destContainerName `
-DestBlob $destBlobName `
-StandardBlobTier Archive `
-Context $ctx
若要使用 Azure CLI 将 Blob 从联机层复制到存档层,请调用 az storage blob copy start 命令并指定存档层。 请记得将尖括号中的占位符替换为你自己的值:
az storage blob copy start \
--source-container <source-container> \
--source-blob <source-blob> \
--destination-container <dest-container> \
--destination-blob <dest-blob> \
--account-name <storage-account> \
--tier Archive \
--auth-mode login
若要使用 AzCopy 将 Blob 从联机层复制到存档层,请指定源 blob 的 URI 和目标 blob 的 URI。 目标 Blob 应具有与源 Blob 不同的名称,并且不应存在。
注释
此示例将路径参数括在单引号 ('') 内。 除 Windows Command Shell(cmd.exe)外,在所有命令行界面中使用单引号。 如果使用 Windows Command Shell (cmd.exe),请用双引号(“”)而不是单引号('')将路径参数括起来。
此示例不包含 SAS 令牌,因为它假定你已通过使用 Microsoft Entra ID 提供授权凭据。 请参阅 AzCopy 入门一文,了解如何向存储服务提供授权凭据。
请记得将尖括号中的占位符替换为你自己的值:
azcopy copy 'https://<source-account>.blob.core.chinacloudapi.cn/sample-container/blob1.txt' 'https://<dest-account>.blob.core.chinacloudapi.cn/sample-container/blob1-archived.txt' --blob-type BlockBlob --block-blob-tier Archive
批量存档
若要将 Blob 移动到容器或文件夹中的存档层,请枚举 Blob 并在每个 Blob 上调用“设置 Blob 层”操作。 下面的示例展示了如何执行此操作:
# Initialize these variables with your values.
$rgName = "<resource-group>"
$accountName = "<storage-account>"
$containerName = "<container>"
$folderName = "<folder>/"
$ctx = (Get-AzStorageAccount -ResourceGroupName $rgName -Name $accountName).Context
$blobCount = 0
$Token = $Null
$MaxReturn = 5000
do {
$Blobs = Get-AzStorageBlob -Context $ctx -Container $containerName -Prefix $folderName -MaxCount $MaxReturn -ContinuationToken $Token
if($Blobs -eq $Null) { break }
#Set-StrictMode will cause Get-AzureStorageBlob returns result in different data types when there is only one blob
if($Blobs.GetType().Name -eq "AzureStorageBlob")
{
$Token = $Null
}
else
{
$Token = $Blobs[$Blobs.Count - 1].ContinuationToken;
}
$Blobs | ForEach-Object {
if($_.BlobType -eq "BlockBlob") {
$_.BlobClient.SetAccessTier("Archive", $null)
}
}
}
While ($Token -ne $Null)
az storage blob list --account-name $accountName --account-key $key \
--container-name $containerName --prefix $folderName \
--query "[?properties.blobTier == 'Cool'].name" --output tsv \
| xargs -I {} -P 10 \
az storage blob set-tier --account-name $accountName --account-key $key \
--container-name $containerName --tier Archive --name "{}"
将大量 Blob 移到存档层时,请使用批处理操作以获得最佳性能。 批处理操作通过单个请求向服务发送多个 API 调用。
Blob 批处理操作支持的子操作包括删除 Blob 和设置 Blob 层。
若要通过批量操作存档 Blob 对象,请使用 Azure 存储客户端库之一。 以下代码示例演示如何使用 .NET 客户端库执行基本批处理操作:
static async Task BulkArchiveContainerContents(string accountName, string containerName)
{
string containerUri = string.Format("https://{0}.blob.core.chinacloudapi.cn/{1}",
accountName,
containerName);
// Get container client, using Azure AD credentials.
BlobUriBuilder containerUriBuilder = new BlobUriBuilder(new Uri(containerUri));
BlobContainerClient blobContainerClient = new BlobContainerClient(containerUriBuilder.ToUri(),
new DefaultAzureCredential());
// Get URIs for blobs in this container and add to stack.
var uris = new Stack<Uri>();
await foreach (var item in blobContainerClient.GetBlobsAsync())
{
uris.Push(blobContainerClient.GetBlobClient(item.Name).Uri);
}
// Get the blob batch client.
BlobBatchClient blobBatchClient = blobContainerClient.GetBlobBatchClient();
try
{
// Perform the bulk operation to archive blobs.
await blobBatchClient.SetBlobsAccessTierAsync(blobUris: uris, accessTier: AccessTier.Archive);
}
catch (RequestFailedException e)
{
Console.WriteLine(e.Message);
}
}
有关演示如何使用批处理操作更改层的深入示例应用程序,请参阅 AzBulkSetBlobTier。
使用生命周期管理策略将 Blob 存档
可以通过创建生命周期管理策略来优化很少访问的 Blob 数据的成本,这些策略可在未访问或修改 Blob 在指定时间段内自动移动到存档层。 配置生命周期管理策略后,Azure 存储每天运行一次。 有关生命周期管理策略的详细信息,请参阅 通过自动管理数据生命周期来优化成本。
可以使用Azure门户、PowerShell、Azure CLI或Azure 资源管理器模板来创建生命周期管理策略。 为简单起见,本部分介绍如何仅在Azure门户中创建生命周期管理策略。 有关如何创建生命周期管理策略的更多示例,请参阅 “配置生命周期管理策略”。
注意
在使用生命周期管理策略将数据移动到存档层之前,请确认该数据在至少 180 天内不需要删除或移动到另一层。 在 180 天时间段过前删除或移动到其他层的数据将受到提前删除费用。
另请记住,存档层中的数据必须先解除冻结,然后才能读取或修改数据。 将存档层中的 Blob 重新水化可能需要数小时,并会产生相关费用。
若要在 Azure 门户中创建用于存档 blob 的生命周期管理策略,请执行以下步骤:
步骤 1:创建规则并指定 Blob 类型
在门户中导航到存储帐户。
在 “数据管理”下,找到 生命周期管理 设置。
选择 “添加规则 ”按钮。
在“ 详细信息 ”选项卡上,指定规则的名称。
指定规则范围: 将规则应用于存储帐户中的所有 Blob,或者 使用筛选器限制 Blob。
选择要应用规则的 blob 类型,并指定是包含 Blob 快照还是版本。
步骤 2:添加规则条件
根据你的选择,你可以为基础 Blob(当前版本)、先前版本或 Blob 快照配置规则。 指定要检查的两个条件之一:
- 这些对象上次修改是在几天前。
- 对象是在几天前创建的。
- 这些对象上次被访问是在几天前。
只能应用其中一个条件将特定类型的对象移动到每个规则的存档层。 例如,如果你定义了一项操作,将 90 天内未被修改的基本 Blob 存档,那么你就不能再定义另一项操作,将 90 天内未被访问的基本 Blob 存档。 同样,可以为每个规则定义一个操作,其中任一条件用于存档以前的版本,一个用于存档快照。
接下来,指定修改或访问对象后要经过的天数。
指定在间隔过后将对象移动到存档层。
如果您选择通过筛选器限制受该规则影响的 Blob 对象,则可以使用 Blob 前缀或 Blob 索引匹配来指定筛选器。
步骤 3:确保规则排除解除冻结的 Blob
如果通过更改 Blob 层来解除冻结 Blob,则如果上次修改时间、创建时间或上次访问时间超出策略设置的阈值,此规则会将 Blob 移回存档层。
如果选择 了“上次修改 的规则条件”,则可以通过选择 “跳过上次解除冻结的 blob”,然后输入希望从此规则中排除解除冻结 blob 的天数来防止这种情况发生。
注释
仅当选择了 上次修改 的规则条件时,才会显示此选项。
选择 “添加 ”按钮,将规则添加到策略。
查看策略 JSON
创建生命周期管理策略后,可以通过从列表视图切换到代码视图,在生命周期管理页上查看策略的 JSON。
下面是在上面所示的映像中创建的简单生命周期管理策略的 JSON:
{
"rules": [
{
"enabled": true,
"name": "sample-archive-rule",
"type": "Lifecycle",
"definition": {
"actions": {
"baseBlob": {
"tierToArchive": {
"daysAfterLastAccessTimeGreaterThan": 90,
"daysAfterLastTierChangeGreaterThan": 7
}
}
},
"filters": {
"blobTypes": [
"blockBlob"
]
}
}
}
]
}
另见