it-swarm.com.ru

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

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

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

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

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

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

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

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

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

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

21
David Airapetyan

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

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

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

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

9
David Makogon

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

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

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

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

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

Обновление:

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

11
Dreamwalker

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

Это очень просто с 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

Скопировать 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
3
Hafiz Arslan

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

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

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

Характеристики:

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

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

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

2
Vitor Ciaramella

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

1
Amy Palamountain

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

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

Авторизуйтесь на машине через RDP

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

Запустите инструмент на удаленной машине

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

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

1
Chris J.T. Auld

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

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

0
Rob Bramhall

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

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

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

 enter image description here

0
Chris Voon