我们计划将纯天然网络应用程序部署到两个独立的数据中心(一个位于西欧,另一个位于东南亚),纯粹是出于性能原因。我们允许用户上传文件,这意味着我们需要保持两个数据中心的blob存储同步。我知道Azure提供了对同步结构化数据的支持,但似乎没有对blob同步的支持。我的问题是:
是否有一项服务可以在不同的数据中心之间提供blob同步?如果没有,我该如何实施呢?我在Web上看到很多样本在Azure blob存储和本地文件系统之间同步,反之亦然,但在数据中心之间没有。
答案 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