存档 blob
Artículo 12/22/2023
2 colaboradores
Comentarios
En este artículo
存档层是用于存储极少访问的 Blob 数据的脱机层。 与联机层(热层和冷层)相比,存档层的存储成本最低,但数据检索成本和延迟更高。 存档层中的数据必须至少保留 180 天,否则需要支付提前删除费。 有关存档层的详细信息,请参阅存档访问层 。
当 Blob 位于存档层时,它无法读取或修改。 若要读取或下载存档层中的 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 copy 命令。 提供本地文件作为源、目标 Blob URI 作为目标,并将存档层指定为目标层,如以下示例所示。 请记得将括号中的占位符值替换为你自己的值:
注意
此示例将路径参数括在单引号 ('') 内。 在除 Windows 命令 Shell (cmd.exe) 以外的所有命令 shell 中,都请使用单引号。 如果使用 Windows 命令 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 从一层移动到另一层。
请记住,使用“设置 Blob 层”将 Blob 移动到存档层时,在解除冻结 Blob 之前,无法读取或修改 Blob 的数据 。 如果需要在提前删除间隔过去之前读取或修改 Blob 的数据,请考虑使用“复制 Blob”操作在存档层中创建 Blob 的副本 。
可以使用“复制 Blob ”操作将联机层中的 blob 复制到存档层。 可以调用“复制 Blob”操作将 blob 从联机层(热或冷)复制到存档层 。 源 blob 保留在联机层中,你可以继续在联机层中读取或修改其数据。
通过更改现有 blob 的层将其存档
使用“设置 Blob 层”操作可以将 Blob 从热层或冷层移动到存档层 。 “设置 Blob 层”操作最适用于在提前删除间隔结束之前不需要访问存档数据的情况。
“设置 Blob 层”操作更改单个 blob 的层。 若要将一组 Blob 移到具有最佳性能的存档层,Azure 建议执行批量存档操作。 批量存档操作在单个事务中向服务发送一批“设置 Blob 层”调用。 有关详细信息,请参阅批量存档 。
若要在 Azure 门户中将现有 Blob 移动到存档层,请执行以下步骤:
导航到 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 命令 Shell (cmd.exe) 以外的所有命令 shell 中,都请使用单引号。 如果使用 Windows 命令 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 命令 Shell (cmd.exe) 以外的所有命令 shell 中,都请使用单引号。 如果使用 Windows 命令 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,这些策略可以自动将这些 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 索引匹配来指定筛选器。
选择“添加”按钮,以将规则添加到策略。
查看策略 JSON
创建生命周期管理策略后,可以在“生命周期管理”页上,将“列表视图”切换到“代码视图”,从而查看策略的 JSON。
下面是上图中创建的简单生命周期管理策略的 JSON:
{
"rules": [
{
"enabled": true,
"name": "sample-archive-rule",
"type": "Lifecycle",
"definition": {
"actions": {
"baseBlob": {
"tierToArchive": {
"daysAfterLastAccessTimeGreaterThan": 90
}
}
},
"filters": {
"blobTypes": [
"blockBlob"
]
}
}
}
]
}
另请参阅