4

あるストレージ アカウントを別のストレージ アカウントにコピーする必要があります。を作成し、Runbook毎日実行するようにスケジュールしました。これは増分コピーです。

私がしていることは

  1. ソース ストレージ コンテナー内の BLOB を一覧表示する
  2. 宛先ストレージ コンテナー内の BLOB を確認する
  3. 宛先コンテナーに存在しない場合は、ブロブをコピーしますStart-AzureStorageBlobCopy

これは小さなサイズのコンテナーでは機能しますが、タスクを実行するたびに 1,000 万個のブロブすべてを処理する必要があるため、非常に長い時間がかかり、たとえば 1,000 万個のブロック ブロブを含むコンテナーではコスト効率が悪いことは確かです。

ドキュメントには表示されませんが、powershellDateModifedSinceのような条件付きヘッダーを使用できる方法はありますか。Get-AzureStorageBlob -DateModifiedSince date

DateModifiedSince私は試していませんが、nodejsライブラリで使用できることがわかります

とにかく、使用できるようにpowershellでできることはありますRunbooksか?

編集:

AzCopy を使用して、700 万の BLOB を含むストレージ アカウントのコピーを作成し、いくつかの新しい BLOB をアップロードして、azcopy を再度開始しました。いくつかの新しくアップロードされたファイルをコピーするには、まだかなりの時間がかかります。

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

すぐにブロブ名でブロブをフィルタリングできます

たとえばGet-AzureStorageBlob -Blob、700 万レコードからすぐに BLOB を返します

ブロブを他のプロパティでフィルタリングすることも可能だったはずです..

4

2 に答える 2

4

これが実際の正解かどうかはわかりませんが、今のところこの解決策に頼っています。

AzCopy は少し高速ですが、実行可能であるため、Automation で使用するオプションはありません。

次の AzCopy コマンドを実装する独自の Runbook (ワークフローとして変更可能) を作成しました。

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

  1. リスト blobを見ると、blob プレフィックスによってのみ blob をフィッティングできます。そのため、変更日でフィルター処理された BLOB をプルすることはできません。これにより、ブロブ リスト全体をプルする必要があります。
  2. ContinuationToken を使用して、送信元と送信先の Get-AzureStorageBlob から毎回 20,000 個の BLOB をプルします
  3. プルされた 20,000 のソース BLOB をループし、それらが宛先に存在しないか、ソースで変更されているかを確認します
  4. 2 が true の場合、それらのブロブを宛先に書き込みます
  5. 700 万個のブロブを処理するには、約 3 ~ 4 時間かかります。宛先に書き込まれる BLOB の数に応じて、タスクは長くなります。

コード スニペット

    #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"
于 2016-04-25T09:21:06.707 に答える
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
Date: 31/03/2016 00:00:00
Day: 31
DayOfWeek : 木曜日
DayOfYear : 91
Hour : 17
ミリ秒 : 0
分 : 3
月 : 3
Offset : 00:00:00
Second : 7
Ticks : 635950405870000000
UtcTicks : 635950405870000000
TimeOfDay : 17:03:07
Year :

APIを読んでも、名前以外のパラメータを使用してコンテナを検索することはできないと思います。nodejs ライブラリがまだすべてのブロブを取得してからフィルタリングしているとしか思えません。

もう少し掘り下げますが、

于 2016-04-08T12:17:39.550 に答える