我们可以从同一台计算机并行地将Azure Blob从一个存储帐户复制到其他存储帐户吗?

ttcibm8c  于 9个月前  发布在  其他
关注(0)|答案(3)|浏览(75)

Microsoft Azure中,我在一个区域中有一个源存储帐户,在3个不同区域中有3个目标存储帐户。我想将blob数据从源存储帐户复制到所有3个目标存储帐户。目前,我在bash脚本中使用azcopy(版本6)命令来执行此操作。它首先在一个区域完成,然后在另一个区域开始。由于地理距离的原因,每天都需要一个小时。我想知道azcopy是否有任何选项可以并行地将blob从源复制到多个目的地。任何其他建议,以减少时间也被邀请:)
在我的bash script 中使用的azcopy命令的泛化:

/usr/bin/azcopy --source https://[srcaccount].blob.core.windows.net/[container]/[path/to/blob] --source-key $SOURCE_KEY --destination https://[destaccount].blob.core.windows.net/[container]/[path/to/blob] --dest-key $DEST_KEY --recursive --quiet --exclude-older
qoefvg9y

qoefvg9y1#

Azcopy始终只能将数据从一个源复制到一个目标。但是既然你提到你需要每天都这样做,我可能会选择Azure数据工厂中的计划管道。您还可以将三个不同的复制作业设置为并行活动。

erhoui1w

erhoui1w2#

只需为每个目的地生成一个单独的脚本示例。这样,你的复制将并行发生。
下面是在BASH中执行此操作的简单指南:https://www.slashroot.in/how-run-multiple-commands-parallel-linux

ssm49v7z

ssm49v7z3#

如果你正在寻找Powershell脚本,这里是:
Select-AzSubscription -Subscription“您的订阅名称”#设置订阅ID

变量

$SourceResource Account =“SourceResource Account”#替换为所需的源存储帐户$DestResource Account =“DestResource Account”#替换为所需的目标存储帐户$SourceResourceGroupName =“SourceResourceGroupName”#替换为所需的源资源组名称$DestResourceGroupName =“DestResourceGroupName”#替换为所需的目标资源组名称

获取源存储账户和目标存储账户的存储密钥

$SourceRankKey = Get-Aztek AccountKey-Name $SourceRankAccount-ResourceGroupName $SourceResourceGroupName $DestRankKey = Get-Aztek AccountKey-Name $DestRankAccount-ResourceGroupName $DestResourceGroupName
$SourceStory Context = New-Aztory Context-AccountName $SourceStory Account-AccountKey $SourceStory Key.Value[0] $DestStory Context = New-Aztory Context-AccountName $DestStory Account-AccountKey $DestStory Key.Value[0]

每个容器循环

$Containers = Get-AztagueContainer-Context $SourceContext foreach($Container in $Containers){

$ContainerName = $Container.Name
if ($ContainerName -eq "snow-cmdb"){
    $ContainerName = $Container.Name+"copy3"
if (!((Get-AzureStorageContainer -Context $DestStorageContext) | Where-Object { $_.Name -eq $ContainerName }))
{   
    Write-Output "Creating new container $ContainerName"
    New-AzureStorageContainer -Name $ContainerName -Permission Off -Context $DestStorageContext -ErrorAction Stop
}

$Blobs = Get-AzureStorageBlob -Context $SourceStorageContext -Container $ContainerName
$BlobCpyAry = @() #Create array of objects

#Copy every thing
foreach ($Blob in $Blobs)
{
   $BlobName = $Blob.Name
   Write-Output "Copying $BlobName from $ContainerName"
   $BlobCopy = Start-CopyAzureStorageBlob -Context $SourceStorageContext -SrcContainer $ContainerName -SrcBlob $BlobName -DestContext $DestStorageContext -DestContainer $ContainerName -DestBlob $BlobName
   $BlobCpyAry += $BlobCopy
}

#Check Status
foreach ($BlobCopy in $BlobCpyAry)
{
   #Could ignore all rest and just run $BlobCopy | Get-AzureStorageBlobCopyState output with % copied
   $CopyState = $BlobCopy | Get-AzureStorageBlobCopyState
   $Message = $CopyState.Source.AbsolutePath + " " + $CopyState.Status + " {0:N2}%" -f (($CopyState.BytesCopied/$CopyState.TotalBytes)*100) 
   Write-Output $Message
}
}

}

相关问题