【问题标题】:Copying from Azure file to BLOB从 Azure 文件复制到 BLOB
【发布时间】:2019-03-19 08:25:02
【问题描述】:

Azure 是否有一种方法可以在存储容器之间移动文件,而无需将文件下载回您的笔记本电脑?我尝试了 AzCopy,但似乎正在下载然后重新上传文件。

【问题讨论】:

  • 我的理解是,您需要在 Azure 中预配一些计算才能做到这一点。例如,您可以预配一个小型 VM 并在其中运行 AzCopy。或者,您可以将某些内容部署到 Azure 批处理。或者,您甚至可以使用 Azure 数据工厂来执行此操作。 docs.microsoft.com/en-us/azure/data-factory/…
  • Azure 数据工厂是另一种可行的选择。请注意,A.D.F.比虚拟机选项的成本要高得多。
  • 在存储容器之间复制 blob 是异步服务器端操作,不需要您下载和重新上传。 AzCopy 支持这一点。当您说 AzCopy 正在下载并重新上传文件时,我感到很惊讶。您能分享一下您是如何使用 AzCopy 的吗?
  • @Nick.McDermaid Azcopy 不一定需要计算部件,请参阅我的回答。
  • 所以基本上提问者的假设是不正确的。 (和我一样)

标签: azure azure-blob-storage azcopy


【解决方案1】:

Azcopy 确实为server-side copy 提供了该功能。这实际上是默认行为。 您可以找到 here 的示例: AzCopy /Source:https://myaccount.blob.core.windows.net/mycontainer1 /Dest:https://myaccount.blob.core.windows.net/mycontainer2 /SourceKey:key /DestKey:key /Pattern:abc.txt

但是,请注意:由于您基本上是从 Azure 免费获得所需的计算作为备用容量,因此您不会获得任何性能 SLA。因此,在大多数情况下,这比在同一 Azure 区域中使用快速 VM 并使用所谓的同步复制(使用 azcopy 中的 /SyncCopy 参数下载并上传到复制)要慢得多。

所以:如果您有时间和什么可以省钱,请使用服务器端副本。如果您希望快速完成复制,请使用 /SyncCopy

【讨论】:

  • 很高兴知道。您的回答实际上比原来的问题更详细、更具体!
  • 好的,知道了。是的,我发现它非常慢,因此我认为它必须首先复制到我的笔记本电脑。使用虚拟机是有意义的。我个人认为 Azure 存储之间的移动应该被视为 Azure 门户网站本身更好支持的基本功能。
  • 请注意,Azcopy 是计算密集型的。为了优化性能,它将使用它可以获得的所有 CPU 能力。因此,如果您想获得真正快速的副本,请使用具有良好 CPU 能力和加速网络的 VM SKU(例如 F32s_v2 之类的东西)
【解决方案2】:

您可以使用Runbook 来完成此操作。这是 Microsoft 网站上实现此目的的文章的链接;

https://blogs.msdn.microsoft.com/cloud_solution_architect/2016/05/09/azure-storage-account-backup-azure-automation-runbook-azure-functions/

这里是相关代码,稍作修改以使 ResourceGroup 成为变量。

$primary = Get-AutomationVariable -Name 'Log-Storage-Primary'
$secondary = Get-AutomationVariable -Name 'Log-Storage-Secondary'
$ResourceGroupName = Get-AutomatioNVariable -Name 'LogStorageResourceGroup'

$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Add-AzureRMAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint

$primarykey = Get-AzureRmStorageAccountKey -ResourceGroupName $ResourceGroupName -Name $primary
$secondarykey = Get-AzureRmStorageAccountKey -ResourceGroupName $ResourceGroupName -Name $secondary

$primaryctx = New-AzureStorageContext -StorageAccountName $primary -StorageAccountKey $primarykey.Key1
$secondaryctx = New-AzureStorageContext -StorageAccountName $secondary -StorageAccountKey $secondarykey.Key1

$primarycontainers = Get-AzureStorageContainer -Context $primaryctx

# Loop through each of the containers
foreach($container in $primarycontainers) {
    # Do a quick check to see if the secondary container exists, if not, create it.
    $secContainer = Get-AzureStorageContainer -Name $container.Name -Context $secondaryctx -ErrorAction SilentlyContinue

    if (!$secContainer) {
        $secContainer = New-AzureStorageContainer -Context $secondaryctx -Name $container.Name
        Write-Host "Successfully created Container" $secContainer.Name "in Account" $secondary
    }

    # Loop through all of the objects within the container and copy them to the same container on the secondary account
    $primaryblobs = Get-AzureStorageBlob -Container $container.Name -Context $primaryctx
    foreach($blob in $primaryblobs) {
        $copyblob = Get-AzureStorageBlob -Context $secondaryctx -Blob $blob.Name -Container $container.Name -ErrorAction SilentlyContinue

        # Check to see if the blob exists in the secondary account or if it has been updated since the last runtime.
        if (!$copyblob -or $blob.LastModified -gt $copyblob.LastModified) {
            $copyblob = Start-AzureStorageBlobCopy -SrcBlob $blob.Name -SrcContainer $container.Name -Context $primaryctx -DestContainer $secContainer.Name -DestContext $secondaryctx -DestBlob $blob.Name
            $status = $copyblob | Get-AzureStorageBlobCopyState

            while ($status.Status -eq "Pending") {
                $status = $copyblob | Get-AzureStorageBlobCopyState
                Start-Sleep 10
            }
            Write-Host "Successfully copied blob" $copyblob.Name "to Account" $secondary "in container" $container.Name
        }
    }
}

【讨论】:

  • 您不必做所有这些复杂的事情。使用 Azure Storage SDK for .Net(或任何其他语言)应该可以解决问题。
猜你喜欢
  • 2013-12-23
  • 2020-08-18
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 2017-08-03
  • 2019-04-01
  • 2017-05-06
  • 2019-04-03
相关资源
最近更新 更多