gpt4 book ai didi

powershell - 按修改日期的 Azure 存储增量复制

转载 作者:行者123 更新时间:2023-12-01 00:42:37 27 4
gpt4 key购买 nike

我需要将一个存储帐户复制到另一个存储帐户中。我创建了一个 Runbook 并安排它每天运行。这是增量副本。

我正在做的是

  1. 列出源存储容器中的 blob
  2. 检查目标存储容器中的 blob
  3. 如果目标容器中不存在,则复制 blob Start-AzureStorageBlobCopy

虽然这适用于小尺寸的容器,但这需要很长时间,并且对于具有 1000 万个 block blob 的容器来说肯定没有成本效益,因为每次运行该任务时,我都必须遍历所有这 1000 万个 blob。

我在 documentation 中没有看到它但有什么方法可以在 powershell 中使用诸如 DateModifedSince 之类的条件 header ,例如 Get-AzureStorageBlob -DateModifiedSince date

我没有尝试过,但我可以看到可以在 nodejs library 中使用 DateModifiedSince

我是否可以使用 powershell 来完成此操作,以便能够使用 Runbooks

编辑:

使用 AzCopy 制作了包含 700 万个 blob 的存储帐户的副本,我上传了一些新的 blob,然后再次启动 azcopy。复制一些新上传的文件仍然需要大量时间。

AzCopy/Source:$sourceUri/Dest:$destUri/SourceKey:$sourceStorageKey/DestKey:$destStorageAccountKey/S/XO/XN/Y

可以立即过滤具有 blob 名称的 blob

例如,Get-AzureStorageBlob -Blob 将立即从 700 万条记录中返回 blob

也应该可以过滤具有其他属性的 Blob ..

最佳答案

我不确定这是否是真正的正确答案,但我现在已经采用了这个解决方案。

AzCopy 速度稍快一些,但由于它是可执行的,我无法选择在自动化中使用它。

我编写了自己的运行手册(可以修改为工作流程),它实现了以下功能AzCopy 命令

AzCopy/Source:$sourceUri/Dest:$destUri/SourceKey:$sourceStorageKey/DestKey:$destStorageAccountKey/S/XO/Y

  1. 正在查看List blobs我们只能通过 blob 前缀来调整 blob。所以我无法提取按修改日期过滤的 blob。这让我可以提取整个 blob 列表。
  2. 我每次使用 ContinuationToken 从源和目标 Get-AzureStorageBlob 提取 20,000 个 Blob
  3. 循环拉取的 20,000 个源 blob,查看它们是否在目标中不存在或已在源中修改
  4. 如果 2 为真,那么我将这些 blob 写入目的地
  5. 处理 700 万个 Blob 大约需要 3-4 小时。任务会延长,具体取决于要写入目的地的 blob 数量。

代码片段

    #loop throught the source container blobs, 
# and copy the blob to destination that are not already there
$MaxReturn = 20000
$Total = 0
$Token = $null
$FilesTransferred = 0;
$FilesTransferSuccess = 0;
$FilesTransferFail = 0;
$sw = [Diagnostics.Stopwatch]::StartNew();
DO
{
$SrcBlobs = Get-AzureStorageBlob -Context $sourceContext -Container $container -MaxCount $MaxReturn -ContinuationToken $Token |
Select-Object -Property Name, LastModified, ContinuationToken

$DestBlobsHash = @{}
Get-AzureStorageBlob -Context $destContext -Container $container -MaxCount $MaxReturn -ContinuationToken $Token |
Select-Object -Property Name, LastModified, ContinuationToken |
ForEach { $DestBlobsHash[$_.Name] = $_.LastModified.UtcDateTime }


$Total += $SrcBlobs.Count

if($SrcBlobs.Length -le 0) {
Break;
}
$Token = $SrcBlobs[$SrcBlobs.Count -1].ContinuationToken;

ForEach ($SrcBlob in $SrcBlobs){
# search in destination blobs for the source blob and unmodified, if found copy it
$CopyThisBlob = $false

if(!$DestBlobsHash.count -ne 0){
$CopyThisBlob = $true
} elseif(!$DestBlobsHash.ContainsKey($SrcBlob.Name)){
$CopyThisBlob = $true
} elseif($SrcBlob.LastModified.UtcDateTime -gt $DestBlobsHash.Item($SrcBlob.Name)){
$CopyThisBlob = $true
}

if($CopyThisBlob){
#Start copying the blobs to container
$blobToCopy = $SrcBlob.Name
"Copying blob: $blobToCopy to destination"
$FilesTransferred++
try {
$c = Start-AzureStorageBlobCopy -SrcContainer $container -SrcBlob $blobToCopy -DestContainer $container -DestBlob $blobToCopy -SrcContext $sourceContext -DestContext $destContext -Force
$FilesTransferSuccess++
} catch {
Write-Error "$blobToCopy transfer failed"
$FilesTransferFail++
}
}
}
}
While ($Token -ne $Null)
$sw.Stop()
"Total blobs in container $container : $Total"
"Total files transferred: $FilesTransferred"
"Transfer successfully: $FilesTransferSuccess"
"Transfer failed: $FilesTransferFail"
"Elapsed time: $($sw.Elapsed) `n"

关于powershell - 按修改日期的 Azure 存储增量复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36496195/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com