Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何按计划时间同步两个不同帐户上的两个Azure Blob?_Azure_Azure Storage Blobs_Azure Data Factory 2_High Availability_Azcopy - Fatal编程技术网

如何按计划时间同步两个不同帐户上的两个Azure Blob?

如何按计划时间同步两个不同帐户上的两个Azure Blob?,azure,azure-storage-blobs,azure-data-factory-2,high-availability,azcopy,Azure,Azure Storage Blobs,Azure Data Factory 2,High Availability,Azcopy,为了实现高可用性,我们在不同Azure区域的不同存储帐户下创建了两个blob容器 这样,如果应用程序在将写入主blob容器时发现问题,应用程序将执行断路器逻辑,如果问题在尝试次数达到阈值后仍然存在,应用程序将开始向位于不同Azure位置的备用blob存储帐户写入,此体系结构运行良好 用于从主设备切换到辅助设备的代码: AsyncLazy<CloudQueue> qClient = new AsyncLazy<CloudQueue>(async () => {

为了实现高可用性,我们在不同Azure区域的不同存储帐户下创建了两个blob容器

这样,如果应用程序在写入主blob容器时发现问题,应用程序将执行断路器逻辑,如果问题在尝试次数达到阈值后仍然存在,应用程序将开始向位于不同Azure位置的备用blob存储帐户写入,此体系结构运行良好

用于从主设备切换到辅助设备的代码:

AsyncLazy<CloudQueue> qClient = new AsyncLazy<CloudQueue>(async () =>
{
    var myStorageAccount = CloudStorageAccount.Parse("ConnectionString");
    var myQueue = myStorageAccount.CreateCloudQueueClient();
    myQueue.DefaultRequestOptions = new QueueRequestOptions
    {
        RetryPolicy = new ExponentialRetry(TimeSpan.FromSeconds(3), 4),
        
        LocationMode = LocationMode.PrimaryThenSecondary,
        
        MaximumExecutionTime = TimeSpan.FromSeconds(20)
    };
    var queue = myQueue.GetQueueReference("QueueName");
    await queue.CreateIfNotExistsAsync();
    return queue;
});
AsyncLazy qClient=new AsyncLazy(async()=>
{
var myStorageAccount=CloudStorageAccount.Parse(“ConnectionString”);
var myQueue=myStorageAccount.CreateCloudQueueClient();
myQueue.DefaultRequestOptions=新建QueueRequestOptions
{
RetryPolicy=新的指数重试(TimeSpan.FromSeconds(3),4),
LocationMode=LocationMode.Primary然后Secondary,
MaximumExecutionTime=TimeSpan.FromSeconds(20)
};
var queue=myQueue.GetQueueReference(“QueueName”);
wait queue.CreateIfNotExistsAsync();
返回队列;
});
现在的问题是,一旦主帐户恢复运行,如何将写入备用位置的数据与主位置中的实际blob同步

Azcopy是在两个不同帐户上同步两个blob的一个选项,但问题是根据Azcopy的官方docker映像尚不可用


Azcopy的正式docker映像可用吗?如果不可用,还有什么其他合适的选项可以按计划时间在两个不同帐户上同步两个blob?Azure数据工厂?Azure功能?

首先,您可能知道,Azcopy没有正式的docker映像可用。github问题提到了这一点

是的,你可以使用azure函数来做(关于ADF,不确定,但问了一些人,他们说这不容易),但可能有点困难

更简单的解决方案是同时使用和
azcopy
。在azure portal中创建webjob时,只需将其指定为计划。Azure webjob支持多种文件类型,如
.ps1(powershell)、.cmd、.py
等,因此使用您的收藏夹创建它非常容易

在这里,我将创建一个.ps1(powershell)文件,然后将其上载到azure webjob以在预定时间执行同步作业

步骤1:创建一个.ps1文件必须运行文件名。ps1。然后在run.ps1文件中使用以下代码(请在代码中使用您自己的源存储和目标存储):

步骤2:将
azcopy.exe
(如果没有,请先下载)放在
run.ps1
文件的同一位置。然后将这两个文件压缩成一个.zip文件(注意:在压缩它们之前,最好在本地测试代码,看看它是否可以工作):

步骤3:假设您已经拥有支持webjob的azure web app服务,并且该功能已启用。导航到azure门户->您的azure web应用->设置->web作业->单击“添加”按钮->在“添加web作业”面板中,填写所有必要字段/选择.zip文件/并设置正确的类型/触发器/CRON。以下是截图:

步骤4:创建webjob后(可能需要几分钟时间,单击“刷新”按钮进行检查),选择webjob,然后单击“运行”按钮:


有什么想法/建议吗?直接在本地使用azcopy并在您的机器上设置时间表,或者编写一个webjob在azure中调用azcopy如何?@IvanYang,这里提到的“本地/在您的机器上”是指应用程序产品服务器或开发机器。在我们讨论生产场景时,这两种方法中的任何一种都不可行。我认为如果在生产中不可能,您可以在任何地方使用azcopy。但在azure中也可以使用它。请参考下面的答案。谢谢。将尝试并让您知道任何挑战。
#define the source container and destination container, note that the sas token are required.
$source_container = "https://yy1.blob.core.windows.net/a11?sv=2020-02-10&ss=bfqt&srt=sco&sp=rwdlacup&se=2021-03-12T11:00:50Z&st=2021-03-12T03:00:50Z&spr=https&sig=xxxxxx"
$dest_container = "https://yyasia1.blob.core.windows.net/test123?sv=2020-02-10&ss=bfqt&srt=sco&sp=rwdlacup&se=2021-03-12T11:01:36Z&st=2021-03-12T03:01:36Z&spr=https&sig=xxxxxx"

#get the current working directory which contains the current .ps1 file and the azcopy.exe
$path = Split-Path -Parent $MyInvocation.MyCommand.Definition

#set the location to the path where contains the azcopy.exe
Set-Location -Path $path

#execute the sync command
.\azcopy.exe sync $source_container $dest_container --recursive

Write-Output "**completed**"