【问题标题】:How to sync between two Azure storage (blobs) hosted on two different data centers如何在托管在两个不同数据中心的两个 Azure 存储 (blob) 之间进行同步
【发布时间】:2014-03-03 02:12:39
【问题描述】:

出于性能原因,我们计划将我们的 Azure Web 应用程序部署到两个独立的数据中心(一个位于西欧,另一个位于东南亚)。我们允许用户上传文件,这意味着我们需要保持两个数据中心的 blob 存储同步。我知道 Azure 提供了对同步结构化数据的支持,但似乎没有对 blob 同步的支持。我的问题是:

是否有在不同数据中心之间提供 blob 同步的服务?如果没有,我该如何实施?我在 Web 上看到了许多示例,用于在 Azure blob 存储和本地文件系统之间进行同步,反之亦然,但在数据中心之间却没有。

【问题讨论】:

  • @danludwig:我看过异地复制,但我的理解是它纯粹是为了持久性,即为存储提供自动故障转移。此外,通过异地复制,辅助数据中心会根据您的主数据中心自动选择,因此不符合我的要求。
  • 你已经看过这个了。 cloudberrylab.com/cloud-migrator.aspx 。看起来很适合您的要求。
  • @Aravind,看起来很有趣!我已经注册了 Beta。我在使用 Amazon S3 时遇到了同样的问题,并且惊讶地发现可用于完成这项工作的工具很少。虽然这将是一个常见的备份方案,但我会认为。
  • @QF_Developer OK.some 对故障转移策略感到满意,但并非所有人都想要这样的选择。如果更多客户和 ISV 要求此类功能,我确信云提供商会提出此选项。

标签: azure azure-storage


【解决方案1】:

是否有提供 blob 同步的服务 不同的数据中心?

没有。目前还没有这种开箱即用的服务可以在两个数据中心之间同步内容。

如果没有,我该如何实现?

尽管您可以使用所有必要的基础设施来实现这一点,但实际实现会很棘手。

首先,您需要决定是需要实时同步还是批量同步?

对于实时同步,您可以依赖 Async Copy Blob。使用异步复制 blob,您实际上可以指示存储服务将 blob 从一个存储帐户复制到另一个帐户,而不是手动从源下载 blob 并上传到目标。假设所有上传都是从您的应用程序进行的,一旦上传了 blob,您就会知道它是在哪个数据中心上传的。您可以做的是创建此 blob 的 SAS URL 并启动到另一个数据中心的异步复制。

对于批量同步,您需要查询存储帐户并列出每个 blob 容器中的 blob。如果 blob 仅在一个存储帐户中可用,而在其他存储帐户中不可用,则您可以通过启动异步复制 blob 在目标存储帐户中简单地创建 blob。如果 blob(同名)存在于两个存储帐户中,事情会变得更加棘手。在这种情况下,您需要定义一些规则(例如比较修改日期等)来决定是否应将 blob 从源存储帐户复制到目标存储帐户。

要安排批量同步,您可以使用Windows Azure Scheduler Service。即使使用此服务,您也需要为同步逻辑编写代码。调度程序服务只负责调度部分。它不会进行实际的同步。

我建议使用工作者角色来实现同步逻辑。另一种选择是Web Jobs,它是最近宣布的,虽然我不太了解。

【讨论】:

    【解决方案2】:

    如果您的目标只是关于性能并且内容是公开的,请使用 Azure CDN。将其指向您的主 blob 存储容器,它将复制世界各地的文件以获得最佳性能。

    【讨论】:

      【解决方案3】:

      我知道这是一个旧查询,并且在最近会发生很多变化。我在搜索类似任务时结束了这个链接。所以想法会更新来自 AzCopy v10 的最新版本。它有一个同步选项;

      将文件系统同步到 Azure Blob 存储,反之亦然。 使用 azcopy 同步。非常适合增量复制方案。

      https://docs.microsoft.com/en-us/azure/storage/common/storage-use-azcopy-v10

      【讨论】:

      • op 专门询问了不支持同步的存储到存储
      • @Sam 同时有可能:➜ ~ ./azcopy_darwin_amd64_10.3.4/azcopy copy -h Copies source data to a destination location. The supported directions are: .... - Azure Blob (SAS or public) -> Azure Files (SAS) .....
      • 其实现在好像支持直接同步Az storage to Az storage
      【解决方案4】:

      您可以使用 powershell 自动执行此任务:

      从一个 Windows Azure 存储帐户下载所有 Blob(带快照) http://gallery.technet.microsoft.com/scriptcenter/all-Blobs-with-Snapshots-3b184a79

      使用 PowerShell 将文件移动到 Azure 存储 http://www.scarydba.com/2013/06/03/using-powershell-to-move-files-to-azure-storage/

      将 Blob 存储中的所有 VHD 从一个 Windows Azure 订阅复制到另一个 http://gallery.technet.microsoft.com/scriptcenter/Copy-all-VHDs-in-Blog-829f316e

      【讨论】:

      • 如果在不同的服务器上添加不同的blob,是否可以使用这种方法进行同步?
      【解决方案5】:

      我知道的老问题,但 Windows.Azure.Storage.DataMovement 库对此很有用。

      https://docs.microsoft.com/en-us/azure/storage/common/storage-use-data-movement-library

      【讨论】:

        【解决方案6】:

        将 Bash 与 Azure CLI 和 AZCopy 结合使用 - 代码在 Github 上,相关视频在 YouTube 上以使其正常工作。

        https://github.com/J0hnniemac/yt-blobsync

        #!/bin/bash
        cd /home
        app_id=""
        tenant=""
        sourceurl="https://<>.blob.core.windows.net"
        destinationurl="https://<>.blob.core.windows.net"
        
        pemfile="/home/service-principal.pem"
        
        sourceaccount=$(echo $sourceurl | awk -F/ '{print $3}' | awk -F. '{print $1}')
        destinationaccount=$(echo $destinationurl | awk -F/ '{print $3}' | awk -F. '{print $1}')
        
        echo $app_id
        echo $tenant
        echo $sourceurl
        echo $destinationurl
        
        echo $sourceaccount
        echo $destinationaccount
        
        az login --service-principal --password $pemfile --username $app_id --tenant $tenant
        
        # list storage containers
        az storage container list --auth-mode login --account-name $sourceaccount -o=table | awk 'NR>1 {print $1}' | grep networking-guru > src.txt
        az storage container list --auth-mode login --account-name $destinationaccount -o=table | awk 'NR>1 {print $1}' | grep networking-guru > dst.txt
        
        grep -vf dst.txt src.txt > diff.txt 
        
        for blob_container in $(cat diff.txt);
                do
                echo $blob_container;
                newcmd="az storage container create --auth-mode login --account-name $destinationaccount -n $blob_container --fail-on-exist" 
                echo "---------------------------------"
                echo $newcmd
                eval $newcmd
        done
        
        echo "performing AZCOPY login"
        azcopy login --service-principal --certificate-path $pemfile --application-id $app_id --tenant-id $tenant
        
        
        
        echo "performing AZCOPY sync for each container"
        for blob_container in $(cat src.txt);
           do
            #Create timestame + 30 Minutes for SAS token
            end=`date -u -d "30 minutes" '+%Y-%m-%dT%H:%MZ'`
            sourcesas=`az storage container generate-sas --account-name $sourceaccount --as-user --auth-mode login --name $blob_container --expiry $end --permissions acdlrw`
            echo $sourcesas
            # remove leading and trailing quotes from SAS Token
            sourcesas=$(eval echo $sourcesas)
            echo $sourcesas
            src="$sourceurl/$blob_container?$sourcesas"
            dst="$destinationurl/$blob_container"
            echo $src
            echo $dst
            synccmd="azcopy sync \"$src\" \"$dst\" --recursive --delete-destination=true"
            echo $synccmd
            eval $synccmd
        done
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多