Копирование данных хранилища из одной учетной записи Azure в другую - PullRequest
21 голосов
/ 21 декабря 2011

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

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

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

  2. Напишите рабочую роль, чтобы сделать то же самое - теоретически это должно быть быстрее и не вызывать никаких затрат. Тем не менее, это больше работы.

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

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

Есть какие-нибудь предложения по подходу?

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

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

Ответы [ 9 ]

11 голосов
/ 19 июня 2013

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

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

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

Вы можете получить больше информации об использовании AzCopy в этом сообщении в блоге: AzCopy - Использование BLOB-объекта для кросс-счета

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

Обновление:

Вы также можете копировать данные BLOB-объектов между учетными записями хранения, используя Microsoft Azure Storage Explorer . Ссылка ссылка

9 голосов
/ 21 декабря 2011

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

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

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

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

6 голосов
/ 24 декабря 2011

Вот некоторый код, использующий .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);
                }
            }
        }
    }
}
3 голосов
/ 16 ноября 2015

С AzCopy все очень просто. Скачать последнюю версию с https://azure.microsoft.com/en-us/documentation/articles/storage-use-azcopy/ и в типе azcopy: Скопируйте большой двоичный объект в учетную запись хранения:

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

Копирование большого двоичного объекта в учетные записи хранения:

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

Копирование большого двоичного объекта из вторичного региона

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

Скопировать большой двоичный объект в основной аккаунт из дополнительного:

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
2 голосов
/ 11 марта 2013

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

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

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

Функции:

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

1-я и 3-я функция является ответом на вашу проблему.

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

1 голос
/ 10 января 2012

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

1 голос
/ 21 декабря 2011

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

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

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

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

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

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

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

0 голосов
/ 27 июня 2016

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

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

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

enter image description here

0 голосов
/ 13 июля 2012

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

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

...