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

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

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

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

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

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

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

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

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

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


person David Airapetyan    schedule 20.12.2011    source источник
comment
Попробуйте Azure Storage Synctool.   -  person DominiqueBal    schedule 05.02.2012
comment
Azure Storage Synctool немного сырой - поддерживает только локальное хранилище (это означает, что мне нужно будет сделать это в два этапа: сначала загрузить весь контейнер, а затем повторно загрузить его, что не имеет большого значения) и в основном , он не возобновляется - это может быть проблемой. Наше собственное решение, которое мы создали (это было действительно просто), поддерживает возобновление, выполняет передачу данных из хранилища в хранилище и использует CopyFromBlob, если делает это в той же учетной записи.   -  person David Airapetyan    schedule 07.02.2012


Ответы (10)


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

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

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

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

person David Makogon    schedule 20.12.2011
comment
Следует отметить одну интересную вещь: если контейнеры находятся в одной учетной записи хранения (что, к сожалению, не относится ко мне), то есть способ скопировать большие двоичные объекты без передачи клиентом - не уверен, какой API это делает, но работает Fiddler при копировании с помощью обозревателя хранилищ Azure показывает заголовок x-ms-copy-source. - person David Airapetyan; 21.12.2011
comment
Хорошо, это называется CopyFromBlob. Можно проверить, соответствует ли исходная учетная запись месту назначения, и использовать этот метод, в противном случае используйте комбинацию DownloadToStream / UploadToStream. - person David Airapetyan; 21.12.2011

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

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

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

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

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

Обновление:

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

person Dreamwalker    schedule 19.06.2013

вот код, использующий .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);
                }
            }
        }
    }
}
person benjguin    schedule 24.12.2011
comment
Спасибо! У меня уже есть код решения, но всегда приятно видеть, что какой-то код выложен в общий доступ. Кроме того, я создавал MemoryStream - это чище (и эффективнее) для выполнения OpenWrite () в целевом большом двоичном объекте. - person David Airapetyan; 26.12.2011

Это очень просто с 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
person Hafiz Arslan    schedule 16.11.2015

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

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

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

Возможности:

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

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

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

person Vitor Ciaramella    schedule 11.03.2013

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

Создайте и разверните фиктивную роль we / worker с включенным RDP.

Вход в машину через RDP

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

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

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

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

person Chris J.T. Auld    schedule 20.12.2011
comment
Не уверен, почему вы предложили RDP. Помимо необходимости ручного управления, вам нужно будет развернуть приложение WinForms вместе с развертыванием. Простая рабочая роль, выполняющая прямую задачу, проще и может масштабироваться до нескольких экземпляров для повышения производительности. - person David Makogon; 21.12.2011
comment
В оригинальном плакате особо отмечалось, что он скорее сочтет, что написать «инструмент», чем рабочую роль. Согласитесь, что я обычно пишу для этого воркера, но в данном случае я попытался дать ответ, учитывающий это ограничение. Вам не нужно развертывать приложение WInForms; буквально вы просто перетащите его через ссылку RDP, как если бы вы подключались к локальному серверу и работали с ним. - person Chris J.T. Auld; 21.12.2011
comment
Собственно, я в итоге и сделал это - скопировал мою WinForm в работающую веб-роль и запустил ее оттуда. Несмотря на то, что он работал там, он все еще не был молниеносным: потребовалось около 22 часов, чтобы скопировать около 400000 элементов (в основном jpeg среднего размера) - 46,5 ГБ данных - я ожидал, что это будет намного быстрее (не более чем 5 часов). - person David Airapetyan; 24.12.2011

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

person Amy Palamountain    schedule 09.01.2012
comment
Как было заявлено изначально, контейнер, который мне пришлось скопировать, был очень большим - Azure Storage Explorer не очень хорошо себя чувствовал в этом сценарии. В итоге я написал собственный инструмент - он был очень простым - и запустил его из веб-роли Azure, чтобы избежать затрат на передачу. - person David Airapetyan; 11.01.2012

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

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

person Rob Bramhall    schedule 13.07.2012

Попробуйте CloudBerry Explorer. Он копирует большой двоичный объект внутри подписок и между подписками.

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

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

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

person Chris Voon    schedule 27.06.2016

Я рекомендую использовать azcopy, вы можно скопировать всю учетную запись хранения, контейнер, каталог или отдельный большой двоичный объект. Вот пример клонирования всей учетной записи хранения:

azcopy copy 'https://{SOURCE_ACCOUNT}.blob.core.windows.net{SOURCE_SAS_TOKEN}' 'https://{DESTINATION_ACCOUNT}.blob.core.windows.net{DESTINATION_SAS_TOKEN}' --recursive

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

Дополнительные примеры здесь

person Daniel Delgado    schedule 05.05.2021