如何在两个不同数据中心上托管的两个Azure存储(blob)之间进行同步

时间:2014-02-06 08:35:48

标签: azure azure-storage

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

是否有一项服务可以在不同的数据中心之间提供blob同步?如果没有,我该如何实施呢?我在Web上看到很多样本在Azure blob存储和本地文件系统之间同步,反之亦然,但在数据中心之间没有。

6 个答案:

答案 0 :(得分:3)

  

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

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

  

如果没有,我该如何实施呢?

虽然您可以使用所有必要的基础结构来实现这一点,但实际的实现将非常棘手。

首先,您需要确定是否需要实时同步,还是批量同步会这样做?

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

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

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

我建议使用辅助角色来实现同步逻辑。另一个替代方案是最近宣布的Web Jobs,但我对此并不了解。

答案 1 :(得分:3)

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

答案 2 :(得分:0)

您可以使用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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

我知道这是一个古老的查询,并且在最近的一段时间里已经有很多变化。我在搜索类似任务时结束了此链接。因此,我们将考虑从AzCopy v10更新最新版本。它具有一个同步选项;

将文件系统同步到Azure Blob存储,反之亦然。 使用azcopy sync。增量复制方案的理想选择。

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

答案 5 :(得分:0)

将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