非常に大きなストレージコンテナーを、あるAzureストレージアカウントから別のAzureアカウント(別のサブスクリプションにもある)にコピーしたいと思います。
次のオプションについて意見をお願いします。
CloudBlobのDownloadToStream()とUploadFromStream()を使用して、両方のストレージアカウントに接続し、ブロブを一度に1つずつコピーするツールを作成します。これは最悪のオプションのようです。データを転送するときにコストが発生し、ツールを実行しているマシンにデータを送信してからAzureに再度アップロードする必要があるため、非常に遅くなるためです。
同じことを行うワーカーロールを記述します。これは理論的には高速で、コストは発生しません。ただし、これはより多くの作業です。
実行中のインスタンスにツールをアップロードして、workerロールのデプロイをバイパスし、インスタンスがリサイクル/リセットされる前にツールが終了するように祈ります。
既存のツールを使用します-何も興味深いものを見つけていません。
アプローチについて何か提案はありますか?
更新:2012年7月7日以降に作成されたすべてのストレージアカウントに対して、この機能がようやく導入されました(現時点ではREST APIのみ)。 :
http://msdn.Microsoft.com/en-us/library/windowsazure/dd894037.aspx
あるストレージアカウントから別のストレージアカウントにデータを移行する直接的な方法はないため、考えていたようなことを行う必要があります。これが同じデータセンター内にある場合は、オプション#2が最善の方法であり、最も高速です(特に、XLインスタンスを使用してより多くのネットワーク帯域幅を提供する場合)。
複雑さに関しては、このコードをワーカーアプリケーションで作成することは、ローカルアプリケーションの場合と同じくらい難しくありません。ワーカーロールのRun()メソッドからこのコードを実行するだけです。
より堅牢にするために、コンテナー内のblobを一覧表示し、特定のファイル移動要求メッセージをAzureキューに配置できます(メッセージごとに複数のオブジェクト名を配置することで最適化できます)。次に、ワーカーロールスレッドを使用してキューから読み取り、オブジェクトを処理します。役割がリサイクルされたとしても、最悪の場合、1つのメッセージを再処理します。パフォーマンスを向上させるために、複数のワーカーロールインスタンスに拡張できます。転送が完了したら、デプロイメントを破棄するだけです。
[〜#〜] update [〜#〜]-2012年6月12日、Windows AzureストレージAPIが更新され、クロスアカウントが許可されるようになりましたblobコピー。詳細は このブログ投稿 を参照してください。
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
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);
}
}
}
}
}
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
私はマイクロソフトテクニカルエバンジェリストであり、これらのシナリオに役立つサンプルと無料のツール(サポートなし/保証なし)を開発しました。
バイナリとソースコードはこちらから入手できます: https://blobtransferutility.codeplex.com/
Blob Transfer Utilityは、Windows Azure Blob Storageとの間で数千もの小さなファイルや大きなファイルをアップロードおよびダウンロードするためのGUIツールです。
特徴:
1番目と3番目の機能は、問題に対する答えです。
サンプルコードから私がどのようにしたかを学ぶことができます。または、ツールを実行して必要なことを実行することもできます。
「Azure Storage Explorer」(無料)または他のそのようなツールを使用できます。これらのツールは、コンテンツをダウンロードおよびアップロードする方法を提供します。コンテナーとテーブルを手動で作成する必要があります-もちろん転送コストが発生します-時間が足りず、コンテンツが適切なサイズである場合、これは実行可能なオプションです。
ツールを単純な.NETコマンドラインまたはWinフォームアプリケーションとして記述します。
RDPを有効にしてダミーのwe/workerロールを作成してデプロイする
RDP経由でマシンにログインします
RDP接続を介してツールをコピーする
リモートマシンでツールを実行する
デプロイされたロールを削除します。
あなたと同じように、関数間のコピーをサポートする市販のツールについては知りません。ただし、Cloud Storage Studioを役割にインストールし、ディスクにダンプしてから再アップロードすることを検討してください。 http://cerebrata.com/Products/CloudStorageStudiov2/Details.aspx?t1=0&t2=7
600 GBのコンテンツをローカルファイルシステムからAzure Storageに移動するのと同じように、何かしらの工夫が必要です。コードを数回繰り返した後、最終的に 'Azure Storage Explorer'を取得し、ファイルだけでなくフォルダーを選択できるように拡張して、選択した複数のフォルダーに再帰的にドリルし、ソース/宛先のコピーのリストをロードしましたステートメントをAzureキューに追加します。次に、[Azure Storage Explorer]のアップロードセクションの[キュー]セクションで、キューからプルしてコピー操作を実行します。
次に、「Azure Storage Explorer」ツールの10個のインスタンスを起動し、それぞれキューからプルしてコピー操作を実行しました。 600 GBのアイテムをわずか2日で移動できました。スマートに追加され、ファイルの変更されたタイムスタンプを利用し、すでにキューからコピーされているファイルをスキップし、同期している場合はキューに追加しません。これで、コンテンツのライブラリ全体で1〜2時間以内に「更新」または同期を実行できます。
CloudBerry Explorer を試してください。サブスクリプション内およびサブスクリプション間でBLOBをコピーします。
サブスクリプション間でコピーするには、ストレージアカウントコンテナーのアクセスをPrivate
からPublic Blob
に編集します。
コピープロセスが完了するまでに数時間かかりました。マシンの再起動を選択した場合、プロセスは続行されます。タイムスタンプを確認してAzure管理UIのターゲットストレージアカウントコンテナーを更新することでステータスを確認します。値は、コピープロセスが完了するまで更新されます。