J'aimerais copier un conteneur de stockage très volumineux d'un compte de stockage Azure vers un autre (qui se trouve également dans un autre abonnement).
Je voudrais un avis sur les options suivantes:
Ecrivez un outil permettant de se connecter aux deux comptes de stockage et de copier les blobs un à un à l'aide de DownloadToStream () et UploadFromStream () de CloudBlob. Cela semble être la pire option, car elle entraînera des coûts lors du transfert des données et sera également assez lente, car les données devront parvenir à la machine sur laquelle l'outil est exécuté, puis renvoyées à nouveau dans Azure.
Écrivez un rôle d’ouvrier pour qu’il fasse la même chose - cela devrait théoriquement être plus rapide et ne pas entraîner de coût. Cependant, c'est plus de travail.
Téléchargez l'outil sur une instance en cours d'exécution en contournant le déploiement du rôle de travail et priez que l'outil se termine avant que l'instance ne soit recyclée/réinitialisée.
Utilisez un outil existant - n'avez rien trouvé d'intéressant.
Des suggestions sur l'approche?
Mise à jour: Je viens de découvrir que cette fonctionnalité a finalement été introduite (API REST uniquement pour l'instant) pour tous les comptes de stockage créés le 7 juillet 2012 ou plus tard:
http://msdn.Microsoft.com/en-us/library/windowsazure/dd894037.aspx
Comme il n’existe aucun moyen direct de migrer les données d’un compte de stockage à un autre, vous devez faire quelque chose comme ce que vous pensiez. Si cela se trouve dans le même centre de données, l'option n ° 2 constitue le meilleur choix et sera la plus rapide (surtout si vous utilisez une instance XL, ce qui vous donne davantage de bande passante réseau).
En termes de complexité, il n'est pas plus difficile de créer ce code dans un rôle de travail qu'avec une application locale. Il suffit d’exécuter ce code à partir de la méthode Run () de votre rôle de travail.
Pour rendre les choses plus robustes, vous pouvez répertorier les blobs dans vos conteneurs, puis placer des messages de demande de déplacement de fichier spécifiques dans une file d'attente Azure (et optimiser en mettant plus d'un nom d'objet par message). Utilisez ensuite un thread de rôle de travail pour lire à partir de la file d'attente et des objets de processus. Même si votre rôle est recyclé, au pire, vous retraiterez un message. Pour une augmentation des performances, vous pouvez ensuite évoluer vers plusieurs instances de rôle de travail. Une fois le transfert terminé, vous supprimez simplement le déploiement.
UPDATE- Le 12 juin 2012, l'API Windows Azure Storage a été mise à jour et permet désormais la copie blob entre comptes. Voir cet article de blog pour tous les détails.
Vous pouvez également utiliser AzCopy faisant partie du SDK Azure.
Cliquez simplement sur le bouton de téléchargement pour Windows Azure SDK et choisissez WindowsAzureStorageTools.msi
dans la liste pour télécharger AzCopy.
Après l'installation, vous trouverez AzCopy.exe
ici: %PROGRAMFILES(X86)%\Microsoft SDKs\Windows Azure\AzCopy
Vous pouvez obtenir plus d'informations sur l'utilisation d'AzCopy dans cet article de blog: AzCopy - Utilisation du blob de copie de compte croisé
Vous pouvez également utiliser le bureau à distance dans une instance et utiliser cet utilitaire pour le transfert.
Mise à jour:
Vous pouvez également copier des données d'objet blob entre des comptes de stockage à l'aide de Microsoft Azure Storage Explorer . Référence link
voici un code qui exploite le SDK .NET pour Azure disponible à l’adresse 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);
}
}
}
}
}
C'est très simple avec AzCopy. Téléchargez la dernière version à partir de https://Azure.Microsoft.com/en-us/documentation/articles/storage-use-azcopy/ Et en type azcopy: Copier un blob dans un compte de stockage:
AzCopy /Source:https://myaccount.blob.core.windows.net/mycontainer1 /Dest:https://myaccount.blob.core.windows.net/mycontainer2 /SourceKey:key /DestKey:key /Pattern:abc.txt
Copier un blob sur plusieurs comptes de stockage:
AzCopy /Source:https://sourceaccount.blob.core.windows.net/mycontainer1 /Dest:https://destaccount.blob.core.windows.net/mycontainer2 /SourceKey:key1 /DestKey:key2 /Pattern:abc.txt
Copier un blob de la région secondaire
Si le stockage géo-redondant en accès en lecture est activé sur votre compte de stockage, vous pouvez copier les données de la région secondaire.
Copier un blob sur le compte principal à partir du secondaire:
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
Je suis un évangéliste technique de Microsoft et j'ai développé un exemple et un outil gratuit (pas de support/aucune garantie) pour vous aider dans ces scénarios.
Les fichiers binaires et le code source sont disponibles ici: https://blobtransferutility.codeplex.com/
Blob Transfer Utility est un outil graphique permettant de télécharger et de télécharger des milliers de fichiers volumineux/petits vers/depuis le stockage de blob Windows Azure.
Caractéristiques:
La 1ère et 3ème fonctionnalité est la réponse à votre problème.
Vous pouvez apprendre de l'exemple de code comment je l'ai fait ou simplement exécuter l'outil et faire ce que vous devez faire.
Utilisation possible 'Azure Storage Explorer' (gratuit) ou un autre outil du même genre. Ces outils permettent de télécharger et de télécharger du contenu. Vous aurez besoin de créer manuellement des conteneurs et des tables - et bien sûr, cela entraînera un coût de transfert - mais si vous manquez de temps et que votre contenu est de taille raisonnable, il s'agit d'une option viable.
Ecrivez votre outil sous la forme d'une simple application .NET en ligne de commande ou Win Forms.
Créer et déployer un rôle factice we/worker avec RDP activé
Connexion à la machine via RDP
Copiez votre outil via la connexion RDP
Exécuter l'outil sur la machine distante
Supprimer le rôle déployé.
Comme vous, je ne connais aucun des outils standard prenant en charge la copie entre fonctions. Vous voudrez peut-être envisager simplement d'installer Cloud Storage Studio dans le rôle, puis de basculer sur le disque puis de le télécharger à nouveau. http://cerebrata.com/Products/CloudStorageStudiov2/Details.aspx?t1=0&t2=7
J'ai dû faire quelque chose de similaire pour déplacer 600 Go de contenu d'un système de fichiers local vers Azure Storage. Après quelques itérations de code, j'ai finalement pris 'Azure Storage Explorer' et je l'ai étendu avec la possibilité de sélectionner des dossiers au lieu de simplement des fichiers, puis de l'explorer de manière récursive dans plusieurs dossiers sélectionnés et de charger une liste de copie source/destination. instructions d'élément dans une file d'attente Azure. Ensuite, dans la section de téléchargement dans 'Azure Storage Explorer', dans la section File d'attente pour extraire de la file d'attente et exécuter l'opération de copie.
Ensuite, j'ai lancé comme 10 instances de l'outil 'Azure Storage Explorer' et chacune d'elles était extraite de la file d'attente et exécutait l'opération de copie. J'ai pu déplacer les 600 Go d'objets en un peu plus de 2 jours. Ajout dans smarts pour utiliser les horodatages modifiés sur les fichiers et ignorer les fichiers déjà copiés à partir de la file d'attente et ne pas s'ajouter à la file d'attente si elle est synchronisée. Maintenant, je peux exécuter des "mises à jour" ou des synchronisations en une heure ou deux dans toute la bibliothèque de contenu.
Essayez CloudBerry Explorer . Il copie blob dans et entre les abonnements.
Pour copier des abonnements, modifiez l'accès du conteneur de compte de stockage de Private
à Public Blob
.
Le processus de copie a pris quelques heures. Si vous choisissez de redémarrer votre ordinateur, le processus se poursuivra. Vérifiez l'état en actualisant le conteneur du compte de stockage cible dans l'interface utilisateur de gestion Azure en vérifiant l'horodatage. La valeur est mise à jour jusqu'à la fin du processus de copie.