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

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

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

  1. напишите инструмент, который будет подключаться к обеим учетным записям хранения и копировать blobs по одному, используя Cloudblob'S DownloadToStream() и UploadFromStream(). Это кажется худшим вариантом, потому что он будет нести расходы при передаче данных а также довольно медленно, потому что данные должны будут спуститься на машину, на которой работает инструмент, а затем повторно загружаться обратно в Azure.

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

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

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

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

обновление: я только что узнал, что эта функция, наконец, была введена (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, проверив метку времени, значение обновляется до процесс копирования.

enter image description here