Powershell Azure存储增量拷贝(按修改日期)
我需要将一个存储帐户复制到另一个存储帐户。我已经创建了一个Powershell Azure存储增量拷贝(按修改日期),powershell,azure,azure-storage,azure-automation,Powershell,Azure,Azure Storage,Azure Automation,我需要将一个存储帐户复制到另一个存储帐户。我已经创建了一个Runbook,并计划每天运行。这是一个增量副本 我正在做的是 列出源存储容器中的blob 检查目标存储容器中的Blob 如果目标容器中不存在该blob,请复制blobStart AzureStorageBlobCopy 虽然这适用于小尺寸的容器,但这需要很长的时间,而且对于具有1000万块Blob的容器来说肯定是没有成本效益的,因为每次运行任务时,我都必须处理所有1000万块Blob 我在中没有看到它,但是否有任何方法可以在powers
Runbook
,并计划每天运行。这是一个增量副本
我正在做的是
Start AzureStorageBlobCopy
DateModifiedSince
或类似Get-AzureStorageBlob-DateModifiedSince-date
我没有尝试过,但我发现可以在中使用DateModifiedSince
我是否可以使用powershell执行此操作,以便能够使用Runbook
编辑:
使用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。上次修改存储在iCloudBlob对象中,您可以使用Powershell访问它,如下所示
$blob = Get-AzureStorageBlob -Context $Context -Container $container
$blob[1].ICloudBlob.Properties.LastModified
这会给你
日期时间:31/03/2016 17:03:07联合技术开发署发布时间:31/03/2016 17:03:07
LocalDateTime:31/03/2016 18:03:07
日期:2016年3月31日00:00:00
日期:31
星期四:星期四
年月日:91
小时:17
毫秒:0
分钟:3
月份:3
偏移量:00:00:00
第二:7
滴答声:635950405870000000
UtcTicks:635950405870000000
时间:17:03:07
年份:2016年 通读了之后,我认为不可能使用名称以外的任何参数对容器执行搜索。我只能想象nodejs库仍然检索所有blob,然后过滤它们
虽然我不确定这是否是真正正确的答案,但我现在已经求助于这个解决方案,我将对此进行更深入的研究 AzCopy速度稍快,但由于它是可执行的,所以我没有选择在自动化中使用它 我编写了自己的runbook(可以修改为工作流),它实现了以下功能 AzCopy命令
AzCopy/Source:$sourceUri/Dest:$destUri/SourceKey:$sourceStorageKey/DestKey:$destStorageAccountKey/S/XO/Y
#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"
你可以使用AzCopy。见@JackZeng谢谢我正在测试AzCopy。我正在使用
\XO\XN
选项。因为这是我第一次复印,所以需要时间。我的容器大于100 gb。完成后,我将测试AzCopy是否只需要复制一个新的blob就可以获得相同的数量。但是,如果AzCopy工作正常(祈求好运),我将不得不退出自动化(可能改用VM)请尝试AzCopy,我认为它可以实现比您现在所做的更好的性能。:)是的,但问题是如何使整个复制过程更快。对于大约1000万(甚至十万)块Blob,即使使用延续令牌
和ConcurrentTaskCount
,也需要数小时才能获取AzureStorageBlob。如果Get-AzureStorageBlob
能够在指定的时间后列出blob,那就更好了。顺便说一句,即使是azure portal在试图查看如此大的容器的大小时也会显示“loading…”:(@Sami我已经修改了答案,我将检查nodejs源代码以了解其工作原理(但我认为这是不可能的)我很好奇为什么你一次要处理20000个斑点。你是否遇到内存或超时问题?我遇到了“公平份额”Azure Runbook上的超时限制,正在查看您的脚本,想知道限制maxcount是否有帮助。我发现运行Runbook将一个存储容器复制到另一个存储容器比AzCopy要长一个数量级。小时比分钟长。