web-dev-qa-db-ja.com

あるAzureアカウントから別のAzureアカウントにストレージデータをコピーする

非常に大きなストレージコンテナーを、あるAzureストレージアカウントから別のAzureアカウント(別のサブスクリプションにもある)にコピーしたいと思います。

次のオプションについて意見をお願いします。

  1. CloudBlobのDownloadToStream()とUploadFromStream()を使用して、両方のストレージアカウントに接続し、ブロブを一度に1つずつコピーするツールを作成します。これは最悪のオプションのようです。データを転送するときにコストが発生し、ツールを実行しているマシンにデータを送信してからAzureに再度アップロードする必要があるため、非常に遅くなるためです。

  2. 同じことを行うワーカーロールを記述します。これは理論的には高速で、コストは発生しません。ただし、これはより多くの作業です。

  3. 実行中のインスタンスにツールをアップロードして、workerロールのデプロイをバイパスし、インスタンスがリサイクル/リセットされる前にツールが終了するように祈ります。

  4. 既存のツールを使用します-何も興味深いものを見つけていません。

アプローチについて何か提案はありますか?

更新:2012年7月7日以降に作成されたすべてのストレージアカウントに対して、この機能がようやく導入されました(現時点ではREST APIのみ)。 :

http://msdn.Microsoft.com/en-us/library/windowsazure/dd894037.aspx

22

あるストレージアカウントから別のストレージアカウントにデータを移行する直接的な方法はないため、考えていたようなことを行う必要があります。これが同じデータセンター内にある場合は、オプション#2が最善の方法であり、最も高速です(特に、XLインスタンスを使用してより多くのネットワーク帯域幅を提供する場合)。

複雑さに関しては、このコードをワーカーアプリケーションで作成することは、ローカルアプリケーションの場合と同じくらい難しくありません。ワーカーロールのRun()メソッドからこのコードを実行するだけです。

より堅牢にするために、コンテナー内のblobを一覧表示し、特定のファイル移動要求メッセージをAzureキューに配置できます(メッセージごとに複数のオブジェクト名を配置することで最適化できます)。次に、ワーカーロールスレッドを使用してキューから読み取り、オブジェクトを処理します。役割がリサイクルされたとしても、最悪の場合、1つのメッセージを再処理します。パフォーマンスを向上させるために、複数のワーカーロールインスタンスに拡張できます。転送が完了したら、デプロイメントを破棄するだけです。

[〜#〜] update [〜#〜]-2012年6月12日、Windows AzureストレージAPIが更新され、クロスアカウントが許可されるようになりましたblobコピー。詳細は このブログ投稿 を参照してください。

9
David Makogon

Azure SDKの一部であるAzCopyを使用することもできます。

Windows Azure SDK のダウンロードボタンをクリックし、リストから_WindowsAzureStorageTools.msi_を選択してAzCopyをダウンロードします。

インストール後、ここに_AzCopy.exe_があります:%PROGRAMFILES(X86)%\Microsoft SDKs\Windows Azure\AzCopy

AzCopyの使用に関する詳細については、次のブログ投稿をご覧ください。 AzCopy – Cross Account Copy Blobの使用

同様に、リモートデスクトップをインスタンスにして、このユーティリティを使用して転送することもできます。

更新:

Microsoft Azure Storage Explorerを使用して、ストレージアカウント間でblobデータをコピーすることもできます。リファレンス link

11
Dreamwalker

http://www.windowsazure.com/en-us/develop/net で利用可能なAzureの.NET SDKを活用するコードを次に示します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.WindowsAzure.StorageClient;
using System.IO;
using System.Net;

namespace benjguinAzureStorageTool
{
    class Program
    {
        private static Context context = new Context();

        static void Main(string[] args)
        {
            try
            {
                string usage = string.Format("Possible Usages:\n"
                + "benjguinAzureStorageTool CopyContainer account1SourceContainer account2SourceContainer account1Name account1Key account2Name account2Key\n"
                );


                if (args.Length < 1)
                    throw new ApplicationException(usage);

                int p = 1;

                switch (args[0])
                {
                    case "CopyContainer":
                        if (args.Length != 7) throw new ApplicationException(usage);
                        context.Storage1Container = args[p++];
                        context.Storage2Container = args[p++];
                        context.Storage1Name = args[p++];
                        context.Storage1Key = args[p++];
                        context.Storage2Name = args[p++];
                        context.Storage2Key = args[p++];

                        CopyContainer();
                        break;


                    default:
                        throw new ApplicationException(usage);
                }

                Console.BackgroundColor = ConsoleColor.Black;
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("OK");
                Console.ResetColor();
            }
            catch (Exception ex)
            {
                Console.WriteLine();
                Console.BackgroundColor = ConsoleColor.Black;
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.WriteLine("Exception: {0}", ex.Message);
                Console.ResetColor();
                Console.WriteLine("Details: {0}", ex);
            }
        }


        private static void CopyContainer()
        {
            CloudBlobContainer container1Reference = context.CloudBlobClient1.GetContainerReference(context.Storage1Container);
            CloudBlobContainer container2Reference = context.CloudBlobClient2.GetContainerReference(context.Storage2Container);
            if (container2Reference.CreateIfNotExist())
            {
                Console.WriteLine("Created destination container {0}. Permissions will also be copied.", context.Storage2Container);
                container2Reference.SetPermissions(container1Reference.GetPermissions());
            }
            else
            {
                Console.WriteLine("destination container {0} already exists. Permissions won't be changed.", context.Storage2Container);
            }


            foreach (var b in container1Reference.ListBlobs(
                new BlobRequestOptions(context.DefaultBlobRequestOptions)
                { UseFlatBlobListing = true, BlobListingDetails = BlobListingDetails.All }))
            {
                var sourceBlobReference = context.CloudBlobClient1.GetBlobReference(b.Uri.AbsoluteUri);
                var targetBlobReference = container2Reference.GetBlobReference(sourceBlobReference.Name);

                Console.WriteLine("Copying {0}\n to\n{1}",
                    sourceBlobReference.Uri.AbsoluteUri,
                    targetBlobReference.Uri.AbsoluteUri);

                using (Stream targetStream = targetBlobReference.OpenWrite(context.DefaultBlobRequestOptions))
                {
                    sourceBlobReference.DownloadToStream(targetStream, context.DefaultBlobRequestOptions);
                }
            }
        }
    }
}
6
benjguin

AzCopyを使用すると、非常に簡単です。 https://Azure.Microsoft.com/en-us/documentation/articles/storage-use-azcopy/ から最新バージョンをダウンロードし、azcopyタイプ:ストレージアカウント内のblobをコピーします。

AzCopy /Source:https://myaccount.blob.core.windows.net/mycontainer1 /Dest:https://myaccount.blob.core.windows.net/mycontainer2 /SourceKey:key /DestKey:key /Pattern:abc.txt

ストレージアカウント間でBLOBをコピーします。

AzCopy /Source:https://sourceaccount.blob.core.windows.net/mycontainer1 /Dest:https://destaccount.blob.core.windows.net/mycontainer2 /SourceKey:key1 /DestKey:key2 /Pattern:abc.txt

セカンダリリージョンからBLOBをコピーする

ストレージアカウントで読み取りアクセス地理冗長ストレージが有効になっている場合は、セカンダリリージョンからデータをコピーできます。

Blobをセカンダリからプライマリアカウントにコピーします。

AzCopy /Source:https://myaccount1-secondary.blob.core.windows.net/mynewcontainer1 /Dest:https://myaccount2.blob.core.windows.net/mynewcontainer2 /SourceKey:key1 /DestKey:key2 /Pattern:abc.txt
4
Hafiz Arslan

私はマイクロソフトテクニカルエバンジェリストであり、これらのシナリオに役立つサンプルと無料のツール(サポートなし/保証なし)を開発しました。

バイナリとソースコードはこちらから入手できます: https://blobtransferutility.codeplex.com/

Blob Transfer Utilityは、Windows Azure Blob Storageとの間で数千もの小さなファイルや大きなファイルをアップロードおよびダウンロードするためのGUIツールです。

特徴:

  • アップロード/ダウンロードするバッチを作成する
  • Content-Typeを設定する
  • ファイルを並行して転送する
  • 並列に転送される小さなファイルに大きなファイルを分割する

1番目と3番目の機能は、問題に対する答えです。

サンプルコードから私がどのようにしたかを学ぶことができます。または、ツールを実行して必要なことを実行することもできます。

2

「Azure Storage Explorer」(無料)または他のそのようなツールを使用できます。これらのツールは、コンテンツをダウンロードおよびアップロードする方法を提供します。コンテナーとテーブルを手動で作成する必要があります-もちろん転送コストが発生します-時間が足りず、コンテンツが適切なサイズである場合、これは実行可能なオプションです。

1

ツールを単純な.NETコマンドラインまたはWinフォームアプリケーションとして記述します。

RDPを有効にしてダミーのwe/workerロールを作成してデプロイする

RDP経由でマシンにログインします

RDP接続を介してツールをコピーする

リモートマシンでツールを実行する

デプロイされたロールを削除します。

あなたと同じように、関数間のコピーをサポートする市販のツールについては知りません。ただし、Cloud Storage Studioを役割にインストールし、ディスクにダンプしてから再アップロードすることを検討してください。 http://cerebrata.com/Products/CloudStorageStudiov2/Details.aspx?t1=0&t2=7

1
Chris J.T. Auld

600 GBのコンテンツをローカルファイルシステムからAzure Storageに移動するのと同じように、何かしらの工夫が必要です。コードを数回繰り返した後、最終的に 'Azure Storage Explorer'を取得し、ファイルだけでなくフォルダーを選択できるように拡張して、選択した複数のフォルダーに再帰的にドリルし、ソース/宛先のコピーのリストをロードしましたステートメントをAzureキューに追加します。次に、[Azure Storage Explorer]のアップロードセクションの[キュー]セクションで、キューからプルしてコピー操作を実行します。

次に、「Azure Storage Explorer」ツールの10個のインスタンスを起動し、それぞれキューからプルしてコピー操作を実行しました。 600 GBのアイテムをわずか2日で移動できました。スマートに追加され、ファイルの変更されたタイムスタンプを利用し、すでにキューからコピーされているファイルをスキップし、同期している場合はキューに追加しません。これで、コンテンツのライブラリ全体で1〜2時間以内に「更​​新」または同期を実行できます。

0
Rob Bramhall

CloudBerry Explorer を試してください。サブスクリプション内およびサブスクリプション間でBLOBをコピーします。

サブスクリプション間でコピーするには、ストレージアカウントコンテナーのアクセスをPrivateからPublic Blobに編集します。

コピープロセスが完了するまでに数時間かかりました。マシンの再起動を選択した場合、プロセスは続行されます。タイムスタンプを確認してAzure管理UIのターゲットストレージアカウントコンテナーを更新することでステータスを確認します。値は、コピープロセスが完了するまで更新されます。

enter image description here

0
Chris Voon