Подтвердить что ты не робот

Копирование данных хранилища из одной учетной записи Azure в другую

Я хотел бы скопировать очень большой контейнер хранения из одной учетной записи хранилища Azure в другую (что также происходит в другой подписке).

Мне хотелось бы узнать мнение о следующих вариантах:

  • Напишите инструмент, который будет подключаться к обоим учетным записям и копировать по блокам по одному, используя CloudBlob DownloadToStream() и UploadFromStream(). Это, пожалуй, самый худший вариант, поскольку он будет нести расходы при передаче данных, а также быть довольно медленным, потому что данные должны будут спуститься к машине, на которой запущен инструмент, а затем снова загрузиться обратно в Azure.

  • Напишите роль рабочего, чтобы сделать то же самое - теоретически это должно быть быстрее и нести никакой стоимости. Однако это больше работает.

  • Загрузите инструмент в исполняемый экземпляр, минуя развертывание роли рабочего, и помолитесь, чтобы инструмент завершился до того, как экземпляр переработал / reset.

  • Использовать существующий инструмент - не нашли ничего интересного.

Любые предложения по подходу?

Обновление: Я только узнал, что эта функциональность наконец-то появилась (API-интерфейсы REST только сейчас) для всех учетных записей, созданных 7 июля 2012 года или позже:

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

4b9b3361

Ответ 1

Поскольку нет прямого способа переноса данных из одной учетной записи хранилища в другую, вам нужно сделать что-то вроде того, о чем вы думали. Если это находится в одном и том же центре обработки данных, опция № 2 является лучшей ставкой и будет самой быстрой (особенно если вы используете экземпляр XL, что дает вам больше пропускной способности сети).

Что касается сложности, создавать этот код в роли рабочего не сложнее, чем в локальном приложении. Просто запустите этот код из вашего метода Run() рабочей роли.

Чтобы сделать вещи более надежными, вы можете перечислить капли в своих контейнерах, а затем поместить определенные запросы на перенос файлов в очередь Azure (и оптимизировать, помещая более одного имени объекта для каждого сообщения). Затем используйте поток рабочей роли для чтения из очереди и объектов процесса. Даже если ваша роль будет переработана, в худшем случае вы переработаете одно сообщение. Для повышения производительности вы можете масштабировать до нескольких экземпляров роли сотрудников. Как только передача будет завершена, вы просто прекратите развертывание.

ОБНОВЛЕНИЕ. 12 июня 2012 года обновлен API хранения Windows Azure и теперь позволяет копировать blob-копию. См. это сообщение в блоге для всех деталей.

Ответ 2

Вы также можете использовать AzCopy, который является частью Azure SDK.

Просто нажмите кнопку загрузки Windows Azure SDK и выберите WindowsAzureStorageTools.msi из списка, чтобы загрузить AzCopy.

После установки вы найдете AzCopy.exe здесь: %PROGRAMFILES(X86)%\Microsoft SDKs\Windows Azure\AzCopy

Вы можете получить более подробную информацию об использовании AzCopy в этом сообщении блога: AzCopy - использование кросс-аккаунта Copy Blob

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

Ответ 3

вот какой-то код, который использует .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);
                }
            }
        }
    }
}

Ответ 4

Это очень просто с AzCopy. Загрузите последнюю версию https://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

Ответ 5

Я технический технический консультант Microsoft, и я разработал образец и бесплатный инструмент (без поддержки/без гарантии), чтобы помочь в этих сценариях.

Бинарные файлы и исходный код доступны здесь: https://blobtransferutility.codeplex.com/

Утилита Blob Transfer Utility является графическим инструментом для загрузки и загрузки тысяч небольших/больших файлов в/из хранилища Windows Azure Blob.

Особенности:

  • Создание пакетов для загрузки/загрузки
  • Установите Content-Type
  • Передача файлов параллельно
  • Разделить большие файлы на более мелкие части, которые передаются параллельно

Первая и третья функции - это ответ на вашу проблему.

Вы можете узнать из примера кода, как я это сделал, или просто запустить инструмент и сделать то, что вам нужно сделать.

Ответ 6

Напишите свой инструмент как простое приложение командной строки .NET или Win Forms.

Создайте и разверните роль фиктивного пользователя/роли с включенным RDP

Войдите в систему через RDP

Скопируйте свой инструмент через соединение RDP

Запустите инструмент на удаленном компьютере

Удалить развернутую роль.

Как и вы, я не знаю ни одного из инструментов с полки, поддерживающих копию между функциями. Возможно, вам захочется просто установить Cloud Storage Studio в роль, а затем сбросить на диск, а затем повторно загрузить. http://cerebrata.com/Products/CloudStorageStudiov2/Details.aspx?t1=0&t2=7

Ответ 7

Используйте "Azure Storage Explorer" (бесплатно) или какой-либо другой инструмент. Эти инструменты обеспечивают способ загрузки и загрузки контента. Вам нужно будет вручную создавать контейнеры и таблицы - и, конечно же, это повлечет за собой стоимость перевода, но если у вас короткий срок, а ваше содержимое имеет разумный размер, это жизнеспособный вариант.

Ответ 8

Мне пришлось сделать что-то похожее, чтобы переместить 600 ГБ контента из локальной файловой системы в Azure Storage. После пары итераций кода я, наконец, закончил работу с "Azure Storage Explorer" и расширил его с возможностью выбора папок, а не только файлов, а затем рекурсивно перевернул его в несколько выбранных папок, загрузил список копий Source/Destination вывода в очередь Azure. Затем в разделе загрузки в "Azure Storage Explorer" в разделе "Queue" вытащите из очереди и выполните операцию копирования.

Затем я запустил как 10 экземпляров инструмента Azure Storage Explorer и каждый из них вытащил из очереди и выполнил операцию копирования. Я смог переместить 600 ГБ предметов всего за 2 дня. Добавлен в ум, чтобы использовать измененные метки времени для файлов и пропускать файлы, которые уже были скопированы из очереди и не добавлены в очередь, если они синхронизированы. Теперь я могу запускать "обновления" или синхронизировать в течение часа или двух через всю библиотеку контента.

Ответ 9

Попробуйте CloudBerry Explorer. Он копирует blob внутри и между подписками.

Для копирования между подписками отредактируйте доступ к контейнеру учетной записи хранилища от Private до Public Blob.

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

введите описание изображения здесь