2016-04-08 3 views
1

Мне нужно скопировать одну учетную запись в другую. Я создал Runbook и планирую, чтобы он работал ежедневно. Это инкрементная копия.Инкрементная копия лазурного хранилища по дате изменения

Что я делаю

  1. перечисляет сгустки в контейнере для хранения исходного
  2. Проверьте сгустки в целевом контейнере для хранения
  3. Если он не существует в контейнере назначения скопировать блоб Start-AzureStorageBlobCopy

В то время как это работает для контейнеров небольшого размера, это занимает очень много времени и, безусловно, является неэффективным для контейнеров с 10 миллионами бло ck blobs, потому что каждый раз, когда я запускаю задачу, мне приходится проходить через все эти 10 миллионов капли.

Я не вижу его в documentation, но есть ли способ использовать условные заголовки, такие как DateModifedSince что-то вроде Get-AzureStorageBlob -DateModifiedSince date в powershell.

Я не пробовал, но я могу видеть, что это можно использовать DateModifiedSince в nodejs library

Есть в любом случае я могу это сделать с помощью PowerShell, так что я могу быть в состоянии использовать Runbooks?

EDIT:

Использование AzCopy сделал копию учетной записи хранилища, который содержит 7 миллионов сгустков, я загрузил несколько новых сгустки и снова начал azcopy. Для копирования нескольких новых загруженных файлов по-прежнему требуется значительное количество времени.

AzCopy /Source:$sourceUri /Dest:$destUri /SourceKey:$sourceStorageKey /DestKey:$destStorageAccountKey /S /XO /XN /Y

можно фильтровать для сгустка с именем двоичного объекта в кратчайшие сроки

Например Get-AzureStorageBlob -Blob немедленно возвращает блоб из 7 миллионов записей

Это должно было возможно фильтровать blob (s) с другими свойствами тоже ..

+0

Вы можете использовать AzCopy. См. [Этот документ] (https://azure.microsoft.com/en-us/documentation/articles/storage-use-azcopy /) –

+0

@JackZeng thanks Я тестирую AzCopy. Я использую опцию '\ XO \ XN'. Поскольку это мое первое копирование, это требует времени. Мой контейнер составляет> 100 гб. Как только это будет сделано, я проверю, будет ли AzCopy не брать ту же сумму, чтобы скопировать один новый blob. Тем не менее, если AzCopy работает (скрестив пальцы), мне придется выйти из автоматизации (вместо этого, вероятно, используйте VM) – Sami

+0

Пожалуйста, попробуйте AzCopy, я думаю, что он может достичь лучшей производительности, чем то, что вы делаете. :) –

ответ

0

Последнее изменение сохраняется в объекте iCloudBlob, вы можете получить доступ к нему с Powershell, как этот

$blob = Get-AzureStorageBlob -Context $Context -Container $container 
$blob[1].ICloudBlob.Properties.LastModified 

который даст вам

DateTime: 31/03/2016 17:03: 07
UtcDateTime: 31/03/2016 17:03:07
LocalDateTime: 31/03/2016 18:03:07
Дата: 31/03/2016 00:00:00
День: 31
DayOfWeek: четверг
DayOfYear: 91
час: 17
миллисекунды: 0
минуту: 3
месяц: 3
Смещение: 00:00:00
Второе: 7
клещей: 635950405870000000
UtcTicks: 635950405870000000
TimeOfDay: 17:03:07
Год выпуска: 2016

Прочитав API, я не думаю, что можно выполнить поиск в контейнере с любыми параметрами, отличными от имени. Я могу только представить, что библиотека nodejs все еще извлекает все капли, а затем фильтрует их.

я копаться в ней немного больше, хотя

+0

Да, но вопрос в том, как сделать все это копирование быстрее. С примерно 10 миллионами (даже сто тысяч) блочных блоков требуется несколько часов, чтобы сделать «Get-AzureStorageBlob» даже с «токеном продолжения» и «ConcurrentTaskCount». Было бы лучше, если бы «Get-AzureStorageBlob» мог отображать капли по истечении заданного времени. Btw даже лазурный портал продолжает показывать «loading ..» при попытке увидеть размер таких больших контейнеров :( – Sami

+0

@Sami Я изменил ответ, и я проверю источник nodejs, чтобы увидеть, как это работает (но я не думаю, что это возможно) –

1

Я не уверен, если это будет фактический правильный ответ, но я прибегнул к этому раствору сейчас.

AzCopy немного быстрее, но поскольку он является исполняемым, у меня нет возможности использовать его в Automation.

я написал свой собственный runbook (может быть изменен, как рабочий процесс), который реализует следующую команду AzCopy

AzCopy /Source:$sourceUri /Dest:$destUri /SourceKey:$sourceStorageKey /DestKey:$destStorageAccountKey /S /XO /Y

  1. Глядя на List blobs мы можем только fiter сгустки префиксом BLOB. Поэтому я не могу потянуть blobs, отфильтрованные по Модифицированной дате. Это оставляет меня тянуть весь список блобов.
  2. тянет 20000 сгустков каждый раз, когда от источника и назначения Get-AzureStorageBlob с ContinuationToken
  3. Петли через тянуло 20000 источников сгустков и посмотреть, если они не существуют в пункте назначения или были изменены в источнике
  4. Если 2 верно, то Я пишу эти капли в пункт назначения
  5. Это занимает около 3-4 часов, чтобы пройти через 7 миллионов капель. Задача продлевается в зависимости от того, сколько капель должно быть записано в пункт назначения.

Фрагмент кода

#loop throught the source container blobs, 
    # and copy the blob to destination that are not already there 
    $MaxReturn = 20000 
    $Total = 0 
    $Token = $null 
    $FilesTransferred = 0; 
    $FilesTransferSuccess = 0; 
    $FilesTransferFail = 0; 
    $sw = [Diagnostics.Stopwatch]::StartNew(); 
    DO 
    { 
     $SrcBlobs = Get-AzureStorageBlob -Context $sourceContext -Container $container -MaxCount $MaxReturn -ContinuationToken $Token | 
      Select-Object -Property Name, LastModified, ContinuationToken 

     $DestBlobsHash = @{} 
     Get-AzureStorageBlob -Context $destContext -Container $container -MaxCount $MaxReturn -ContinuationToken $Token | 
      Select-Object -Property Name, LastModified, ContinuationToken | 
       ForEach { $DestBlobsHash[$_.Name] = $_.LastModified.UtcDateTime } 


     $Total += $SrcBlobs.Count 

     if($SrcBlobs.Length -le 0) { 
      Break; 
     } 
     $Token = $SrcBlobs[$SrcBlobs.Count -1].ContinuationToken; 

     ForEach ($SrcBlob in $SrcBlobs){ 
      # search in destination blobs for the source blob and unmodified, if found copy it 
      $CopyThisBlob = $false 

      if(!$DestBlobsHash.count -ne 0){ 
       $CopyThisBlob = $true 
      } elseif(!$DestBlobsHash.ContainsKey($SrcBlob.Name)){ 
       $CopyThisBlob = $true 
      } elseif($SrcBlob.LastModified.UtcDateTime -gt $DestBlobsHash.Item($SrcBlob.Name)){ 
       $CopyThisBlob = $true 
      } 

      if($CopyThisBlob){ 
       #Start copying the blobs to container 
       $blobToCopy = $SrcBlob.Name 
       "Copying blob: $blobToCopy to destination" 
       $FilesTransferred++ 
       try { 
        $c = Start-AzureStorageBlobCopy -SrcContainer $container -SrcBlob $blobToCopy -DestContainer $container -DestBlob $blobToCopy -SrcContext $sourceContext -DestContext $destContext -Force 
        $FilesTransferSuccess++ 
       } catch { 
        Write-Error "$blobToCopy transfer failed" 
        $FilesTransferFail++ 
       } 
      }   
     } 
    } 
    While ($Token -ne $Null) 
    $sw.Stop() 
    "Total blobs in container $container : $Total" 
    "Total files transferred: $FilesTransferred" 
    "Transfer successfully: $FilesTransferSuccess" 
    "Transfer failed: $FilesTransferFail" 
    "Elapsed time: $($sw.Elapsed) `n" 
+0

Мне любопытно, почему вы принимаете 20000 капель за раз. Были ли у вас проблемы с памятью или таймаутом? Я сталкиваюсь с лимитом тайм-аута «справедливая доля» на Azure Runbooks и просто смотрел на ваш сценарий, задаваясь вопросом, ограничение на использование maxcount может помочь. Я считаю, что запуск Runbook для копирования одного контейнера для хранения в другой занимает на порядок больше, чем AzCopy. Часы по сравнению с минутами. –

Смежные вопросы