Копирование данных хранилища из одной учетной записи Azure в другую
Я хотел бы скопировать очень большой контейнер хранения из одной учетной записи хранения Azure в другую (которая также находится в другой подписке).
Я хотел бы получить мнение о следующих вариантах:
напишите инструмент, который будет подключаться к обеим учетным записям хранения и копировать blobs по одному, используя Cloudblob'S DownloadToStream() и UploadFromStream(). Это кажется худшим вариантом, потому что он будет нести расходы при передаче данных а также довольно медленно, потому что данные должны будут спуститься на машину, на которой работает инструмент, а затем повторно загружаться обратно в Azure.
напишите рабочую роль, чтобы сделать то же самое-теоретически это должно быть быстрее и не нести никаких затрат. Однако это больше работа.
загрузите инструмент в запущенный экземпляр в обход развертывания рабочей роли и молитесь, чтобы инструмент закончился до того, как экземпляр будет переработан/сброшен.
использовать существующий инструмент-не нашли ничего интересного.
любые предложения по подходу?
обновление: я только что узнал, что эта функция, наконец, была введена (REST API только сейчас) для всех учетных записей хранения, созданных 7 июля 2012 года или позже:
http://msdn.microsoft.com/en-us/library/windowsazure/dd894037.aspx
9 ответов
поскольку нет прямого способа переноса данных из одной учетной записи хранения в другую, вам нужно будет сделать что-то вроде того, о чем вы думали. Если это находится в том же центре обработки данных, вариант № 2 является лучшим выбором и будет самым быстрым (особенно если вы используете экземпляр XL, что дает вам больше пропускной способности сети).
Что касается сложности, создать этот код в рабочей роли не сложнее, чем в локальном приложении. Просто запустите этот код из рабочей роли метод Run.
чтобы сделать вещи более надежными, вы можете перечислить капли в своих контейнерах, а затем поместить определенные сообщения запроса на перемещение файлов в очередь Azure (и оптимизировать, поместив более одного имени объекта на сообщение). Затем используйте поток рабочей роли для чтения из очереди и объектов обработки. Даже если ваша роль переработана, в худшем случае вы повторно обработаете одно сообщение. Для повышения производительности можно масштабировать до нескольких экземпляров рабочих ролей. Как только передача будет завершена, вы просто снесите развертывание.
обновление - 12 июня 2012 года был обновлен API хранилища Windows Azure, и теперь позволяет копировать blob-объекты между учетными записями. См.этот блог для всех деталей.
вы также можете использовать AzCopy, который является частью пакета SDK Azure.
просто нажмите кнопку Загрузить для Windows Azure SDK и выбрать WindowsAzureStorageTools.msi
из списка для загрузки AzCopy.
после установки, вы найдете AzCopy.exe
здесь: %PROGRAMFILES(X86)%\Microsoft SDKs\Windows Azure\AzCopy
вы можете получить более подробную информацию об использовании AzCopy в этом блоге:AzCopy-Использование Перекрестной Копии Счета Blob
кроме того, вы можете использовать удаленный рабочий стол в экземпляре и использовать это утилита для передачи.
обновление:
вы также можете копировать данные blob между учетными записями хранения с помощью Microsoft Azure Storage Explorer как хорошо. Ссылка ссылке
вот код, который использует .NET SDK для Azure, доступный по адресуhttp://www.windowsazure.com/en-us/develop/net
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. Скачать последнюю версию fromhttps://azure.microsoft.com/en-us/documentation/articles/storage-use-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
Я технический евангелист Microsoft, и я разработал образец и бесплатный инструмент (без поддержки/без гарантии), чтобы помочь в этих сценариях.
двоичные файлы и исходный код доступны здесь:https://blobtransferutility.codeplex.com/
утилита Blob Transfer-это инструмент GUI для загрузки и загрузки тысяч небольших / больших файлов в / из хранилища Blob Windows Azure.
характеристики:
- создать пакеты для загрузки / загрузки
- установить тип контента
- передача файлов параллельно
- разделить большие файлы на более мелкие части, которые передаются параллельно
1-я и 3-я функция-это ответ на вашу проблему.
вы можете узнать из примера кода, как я это сделал, или вы можете просто запустить программу и делать то, что вам нужно сделать.
напишите свой инструмент в виде простой командной строки .NET или приложения Win Forms.
создайте и разверните фиктивную роль we / worker с включенным RDP
войдите в систему через RDP
скопируйте инструмент через соединение RDP
запустите инструмент на удаленной машине
удалить развернутую роль.
Как и вы, я не знаю ни одного из готовых инструментов, поддерживающих копию между функциями. Вы можете рассмотреть только установка Cloud Storage Studio в роль и сброс на диск, а затем повторная загрузка. http://cerebrata.com/Products/CloudStorageStudiov2/Details.aspx?t1=0&t2=7
использовать может "Azure Storage Explorer" (бесплатно) или какой-либо другой такой инструмент. Эти инструменты позволяют загружать и загружать контент. Вам нужно будет вручную создавать контейнеры и таблицы - и, конечно, это потребует затрат на передачу, - но если вам не хватает времени, и ваше содержимое имеет разумный размер, то это жизнеспособный вариант.
Мне пришлось сделать что-то похожее на перемещение 600 ГБ содержимого из локальной файловой системы в хранилище Azure. После нескольких итераций кода я, наконец, закончил с "Azure Storage Explorer" и расширил его с возможностью выбора папок вместо просто файлов, а затем рекурсивно просверлить несколько выбранных папок, загрузил список операторов источника / назначения копирования элементов в очередь Azure. Затем в разделе "Загрузка" в "Azure Storage Explorer" в очереди Раздел для извлечения из очереди и выполнения операции копирования.
затем я запустил как 10 экземпляров инструмента "Azure Storage Explorer" и каждый вытащил из очереди и выполнил операцию копирования. Я смог переместить 600 ГБ элементов всего за 2 дня. Добавлено в smarts, чтобы использовать измененные отметки времени на файлах и пропустить файлы, которые уже были скопированы из очереди и не добавляются в очередь, если она синхронизирована. Теперь я могу запускать "обновления" или синхронизацию в течение часа или двух по всей библиотеке контента.
попробовать CloudBerry Explorer. Он копирует blob внутри и между подписками.
для копирования между подписками измените доступ контейнера учетной записи хранения из Private
до Public Blob
.
процесс копирования занял несколько часов. Если вы решите перезагрузить компьютер, процесс будет продолжаться. Проверьте состояние, обновив целевой контейнер учетной записи хранения в пользовательском интерфейсе управления Azure, проверив метку времени, значение обновляется до процесс копирования.