porta microsoft management azure azure-storage azure-storage-blobs

microsoft - Copiar datos de almacenamiento de una cuenta de Azure a otra



porta azure (9)

Como no hay una manera directa de migrar datos de una cuenta de almacenamiento a otra, tendría que hacer algo como lo que estaba pensando. Si esto está dentro del mismo centro de datos, la opción n. ° 2 es la mejor opción, y será la más rápida (especialmente si usa una instancia XL, que le da más ancho de banda de red).

En cuanto a la complejidad, no es más difícil crear este código en una función de trabajo de lo que sería con una aplicación local. Simplemente ejecute este código desde el método Run () de su función de trabajador.

Para hacer que las cosas sean más robustas, podría enumerar los blobs en sus contenedores, luego colocar mensajes de solicitud de movimiento de archivos específicos en una cola de Azure (y optimizar colocando más de un nombre de objeto por mensaje). Luego use una cadena de roles de trabajador para leer de la cola y procesar objetos. Incluso si su función se recicla, en el peor de los casos reprocesará un mensaje. Para aumentar el rendimiento, puede escalar a varias instancias de rol de trabajador. Una vez que se completa la transferencia, simplemente se destruye la implementación.

ACTUALIZACIÓN : el 12 de junio de 2012, se actualizó la API de almacenamiento de Windows Azure y ahora permite la copia de blob de cuentas cruzadas. Vea esta publicación en el blog para todos los detalles.

Me gustaría copiar un contenedor de almacenamiento muy grande de una cuenta de almacenamiento de Azure a otra (que también está en otra suscripción).

Me gustaría obtener una opinión sobre las siguientes opciones:

  1. Escriba una herramienta que se conecte a ambas cuentas de almacenamiento y copie los blobs de a uno por vez usando DownloadToStream () de CloudBlob y UploadFromStream (). Esta parece ser la peor opción porque incurrirá en costes al transferir los datos y también será bastante lenta, ya que los datos tendrán que reducirse a la máquina que ejecuta la herramienta y luego volver a cargarse en Azure.

  2. Escribir un rol de trabajador para hacer lo mismo; en teoría, esto debería ser más rápido y no incurrir en ningún costo. Sin embargo, esto es más trabajo.

  3. Cargue la herramienta en una instancia en ejecución, omitiendo la implementación de la función de trabajador y ore para que la herramienta finalice antes de que la instancia se vuelva a reciclar / restablecer.

  4. Use una herramienta existente; no ha encontrado nada interesante.

Alguna sugerencia sobre el enfoque?

Actualización: descubrí que esta funcionalidad finalmente se introdujo (API REST solo por ahora) para todas las cuentas de almacenamiento creadas el 7 de julio de 2012 o posterior:

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


El uso podría ''Azure Storage Explorer'' (gratis) o alguna otra herramienta similar. Estas herramientas proporcionan una forma de descargar y cargar contenido. Tendrá que crear manualmente contenedores y tablas, y por supuesto, esto tendrá un costo de transferencia, pero si tiene poco tiempo y sus contenidos son de un tamaño razonable, esta es una opción viable.


Es muy simple con AzCopy. Descargue la última versión de https://azure.microsoft.com/en-us/documentation/articles/storage-use-azcopy/ y en tipo azcopy: copie un blob dentro de una cuenta de almacenamiento:

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

Copie un blob en las cuentas de almacenamiento:

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

Copie un blob de la región secundaria

Si su cuenta de almacenamiento tiene habilitado el almacenamiento redundante de acceso de lectura, puede copiar los datos de la región secundaria.

Copie un blob en la cuenta principal desde el secundario:

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


Escriba su herramienta como una simple línea de comando .NET o una aplicación Win Forms.

Crear e implementar un rol ficticio we / worker con RDP habilitado

Inicie sesión en la máquina a través de RDP

Copie su herramienta sobre la conexión RDP

Ejecute la herramienta en la máquina remota

Eliminar el rol desplegado.

Al igual que usted, no conozco ninguna de las herramientas listas para usar que admiten una copia entre funciones. Puede que desee considerar la instalación de Cloud Storage Studio en la función, volcar en el disco y volver a cargarla. http://cerebrata.com/Products/CloudStorageStudiov2/Details.aspx?t1=0&t2=7


Prueba CloudBerry Explorer . Copia blob dentro y entre suscripciones.

Para copiar entre suscripciones, edite el acceso del contenedor de la cuenta de almacenamiento de Private a Public Blob .

El proceso de copiado tardó algunas horas en completarse. Si elige reiniciar su máquina, el proceso continuará. Compruebe el estado actualizando el contenedor de la cuenta de almacenamiento de destino en la interfaz de usuario de administración de Azure marcando la marca de tiempo, el valor se actualiza hasta que finalice el proceso de copia.


Soy un Técnico Evangelista de Microsoft y he desarrollado una herramienta gratuita y de muestra (sin soporte / sin garantía) para ayudar en estos escenarios.

Los binarios y el código fuente están disponibles aquí: https://blobtransferutility.codeplex.com/

La herramienta de transferencia de blobs es una herramienta de GUI para cargar y descargar miles de archivos pequeños / grandes en / desde Windows Azure Blob Storage.

caracteristicas:

  • Crear lotes para cargar / descargar
  • Establecer el tipo de contenido
  • Transfiere archivos en paralelo
  • Dividir archivos grandes en partes más pequeñas que se transfieren en paralelo

La primera y la tercera característica es la respuesta a su problema.

Puede aprender del código de ejemplo cómo lo hice, o simplemente puede ejecutar la herramienta y hacer lo que necesita hacer.


También puede usar AzCopy que es parte del SDK de Azure.

Simplemente haga clic en el botón de descarga para Windows Azure SDK y seleccione WindowsAzureStorageTools.msi en la lista para descargar AzCopy.

Después de la instalación, encontrará AzCopy.exe aquí: %PROGRAMFILES(X86)%/Microsoft SDKs/Windows Azure/AzCopy

Puede obtener más información sobre el uso de AzCopy en esta publicación de blog: AzCopy - Uso de Blob de cuenta cruzada

Además, puede usar el escritorio remoto en una instancia y usar esta utilidad para la transferencia.


Tuve que hacer algo similar para mover 600 GB de contenido de un sistema de archivos local a Azure Storage. Después de un par de iteraciones de código finalmente terminé tomando el ''Azure Storage Explorer'' y lo extendí con la capacidad de seleccionar carpetas en lugar de solo archivos y luego hacer que explorara de forma recursiva las múltiples carpetas seleccionadas, cargué una lista de copia de origen / destino declaraciones de elementos en una cola de Azure. Luego, en la sección de carga en ''Azure Storage Explorer'', en la sección Queue para extraer de la cola y ejecutar la operación de copia.

Luego, lancé como 10 instancias de la herramienta ''Azure Storage Explorer'' y cada una de ellas sacó de la cola y ejecutó la operación de copia. Pude mover los 600 GB de artículos en poco más de 2 días. Se agregó inteligencia para utilizar las marcas de tiempo modificadas en los archivos y hacer que omita los archivos que ya se hayan copiado de la cola y no se agreguen a la cola si está sincronizada. Ahora puedo ejecutar "actualizaciones" o sincronizaciones dentro de una o dos horas en toda la biblioteca de contenido.


aquí hay un código que aprovecha el .NET SDK para Azure disponible en 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); } } } } }