2016-11-15 2 views
0

Я ищу лучший способ синхронизации файлов по двум файлам в Azure Storage Account. К настоящему времени это выглядит так: AZCopy - это лучшие варианты, но в случае конкретных случаев или фильтров это не сработает.Azure File Share synchronization

Например:

  • Я хочу, чтобы скопировать файлы, которые были добавлены после некоторой даты (на прошлой неделе, месяц и т.д.).
  • Пропустить некоторые папки/подпапки

Использование Powershell также вариант, но это может быть, чтобы замедлить синхронизировать огромное количество файлов.

У вас есть несколько сценариев или оберток поверх AZCopy, которые могут помочь покрыть фильтрацию по папке и типу файла?

Благодаря Игорь

+0

Не могли бы вы обновить свой вопрос, указав детали для ', но в случае конкретных случаев или фильтров это не сработает'? –

+0

Синхронизация файлов не совпадает с копированием файлов. AzCopy не будет предоставлять такую ​​возможность синхронизации. В конечном счете, инструмент, который вы выбираете для синхронизации файлов, зависит от вас - рекомендации по рекомендациям по инструментам не относятся к теме (и это не так просто, чтобы взломать скрипт синхронизации файлов, учитывая все рассмотренные варианты использования). –

+0

Что побуждает сценарий к синхронизации? Похоже, что есть возможности платформы, которые могут решить проблему ... –

ответ

0

Вот скрипт, который синхронизирует некоторые папки:

function Copy-AzureFileStorageWithPS{ 
<# 
.SYNOPSIS 
Copy a file share from a from one storage account to another using PowerShell 

.DESCRIPTION 
This function will copy a file share or specific folder inside of file share from one storage account to another 

.PARAMETER SourceStorageAccountName 

.PARAMETER DestStorageAccountName 

.PARAMETER SourceResourceGroupName 

.PARAMETER DestResourceGroupName 

.PARAMETER FoldersToSkip 

.PARAMETER FoldersToCopy 

.EXAMPLE 
. .\Copy-AzureFileStorageWithPS -SourceStorageAccountName "some" -DestStorageAccountName "other" -SourceResourceGroupName "RG" -DestResourceGroupName "OtherRg" 
#> 

[CmdletBinding()] 
param(
    [Parameter (Mandatory = $true)] 
    [string] $SourceStorageAccountName, 

    [Parameter (Mandatory = $true)] 
    [string] $DestStorageAccountName, 

    [Parameter (Mandatory = $true)] 
    [string] $SourceResourceGroupName, 

    [Parameter (Mandatory = $true)] 
    [string] $DestResourceGroupName, 

    [Parameter (Mandatory = $true)] 
    [string] $FoldersToSkip = "", 

    [Parameter (Mandatory = $true)] 
    [string] $FoldersToCopy = "" 
) 

$exclusions = $FoldersToSkip.ToLower().Split(',').Trim() 
$copyList = $FoldersToCopy.ToLower().Split(',').Trim() 

$SourceStorageAccountKey = (Get-AzureRmStorageAccountKey -Name $SourceStorageAccountName -ResourceGroupName $SourceResourceGroupName)[0].Value 
$DestStorageAccountKey = (Get-AzureRmStorageAccountKey -Name $DestStorageAccountName -ResourceGroupName $DestResourceGroupName)[0].Value 

$SourceContext = New-AzureStorageContext -StorageAccountName $SourceStorageAccountName -StorageAccountKey $SourceStorageAccountKey 
$DestContext = New-AzureStorageContext -StorageAccountName $DestStorageAccountName -StorageAccountKey $DestStorageAccountKey 

#Get all shares from Source SA 
$shares = Get-AzureStorageshare -Context $SourceContext 

foreach($share in $shares){ 
    $destShare = Get-AzureStorageshare -Context $DestContext -Name $share.Name -ErrorAction SilentlyContinue 

    if(-Not $destShare) 
    { 
     $destShare = New-AzureStorageShare $share.Name -Context $DestContext    
     Write-Host "Successfully created share $($share.Name) in Account $($DestContext.StorageAccountName)" 
    } 

    $shareContent = Get-AzureStorageFile -Share $share  

    foreach($content in $shareContent) 
    { 
     if(-Not $exclusions.Contains($content.Name.ToLower())){ 
      if($copyList.Length -ne 0){ 
       if($copyList.Contains($content.Name.ToLower())){ 
        Write-Output "Starting copy of $($content.Name) from $($content.Uri.AbsoluteUri) to $($destShare.Uri.AbsoluteUri+"/"+$content.Name)" 
        Copy-AonAzureFolders -SourceShare $share -SourceFolder $content -DestShare $destShare -SourceContext $SourceContext -DestContext $DestContext 
       } 
      } 
      else 
      { 
       Write-Output "Starting copy of $($content.Name) from $($content.Uri.AbsoluteUri) to $($destShare.Uri.AbsoluteUri+"/"+$content.Name)" 
       Copy-AonAzureFolders -SourceShare $share -SourceFolder $content -DestShare $destShare -SourceContext $SourceContext -DestContext $DestContext 
      } 
     } 
     else{ 
       Write-Output "Excluding folder $($content.Name) from copying to $($destShare.Name)" 
     } 
    } 
} 
} 


function Copy-AonAzureFolders 
{ 
[CmdletBinding()] 
param(
    [Parameter (Mandatory = $true)] 
    [Microsoft.WindowsAzure.Storage.File.CloudFileShare] $SourceShare, 

    [Parameter (Mandatory = $true)] 
    [Microsoft.WindowsAzure.Storage.File.CloudFileDirectory] $SourceFolder, 

    [Parameter (Mandatory = $true)] 
    [Microsoft.WindowsAzure.Storage.File.CloudFileShare] $DestShare, 

    [Parameter (Mandatory = $true)] 
    [Microsoft.WindowsAzure.Commands.Common.Storage.AzureStorageContext] $SourceContext, 

    [Parameter (Mandatory = $true)] 
    [Microsoft.WindowsAzure.Commands.Common.Storage.AzureStorageContext] $DestContext 
) 
$pathWithoutShare = $($SourceFolder.Uri.LocalPath).Replace("/$($SourceShare.Name)","") 

$shareFolders = Get-AzureStorageFile -Share $SourceShare -Path $pathWithoutShare | Get-AzureStorageFile | Where-Object {$_.GetType().Name -eq "CloudFileDirectory"} 

$folderExist = Get-AzureStorageFile -Share $DestShare -Path $pathWithoutShare -ErrorAction SilentlyContinue 
if(-Not $folderExist){ 
    $newFolder = New-AzureStorageDirectory -Share $DestShare -Path $pathWithoutShare 
} 

foreach($folder in $shareFolders) 
{ 
    #Recursive call  
    Copy-AonAzureFolders -SourceShare $SourceShare -SourceFolder $folder -DestShare $DestShare -SourceContext $SourceContext -DestContext $DestContext  
} 

$shareFiles = Get-AzureStorageFile -Share $SourceShare -Path $($pathWithoutShare+"/") | Get-AzureStorageFile | Where-Object {$_.GetType().Name -eq "CloudFile"} 
foreach($file in $shareFiles) 
{ 
    $fullFilePath = $pathWithoutShare + "/" + $($file.Name) 

    Write-Host "-SrcShareName $($SourceShare.Name) -SrcFilePath $fullFilePath -DestShareName $($DestShare.Name) -DestFilePath $fullFilePath" 
    # copy a file to the new directory 
    $copyfile = Start-AzureStorageFileCopy -SrcShareName $($SourceShare.Name) -SrcFilePath $fullFilePath ` 
              -DestShareName $($DestShare.Name) -DestFilePath $fullFilePath -Context $SourceContext -DestContext $DestContext -Force 

    $status = $copyfile | Get-AzureStorageFileCopyState 
    while ($status.Status -eq "Pending") 
    { 
     $status = $copyfile | Get-AzureStorageFileCopyState 
     Start-Sleep -Milliseconds 150 
    } 
    $copyfile 
}  
} 

Надежда, которые помогут вам но это довольно медленно

0

Насколько я знаю, нет никакого способа, чтобы сохранить два Azure файла Share синхронизирована самой Azure.

В качестве обходного пути вам необходимо построить виртуальную машину на Azure и установить на нее эти две акции. Тогда вам просто нужно найти решение, которое может синхронизировать две папки. Существует несколько решений как для Windows, так и для Linux.