Le Stockage Windows Azure (ou “Windows Azure Storage”) est l’un des composants les plus intriguants de Windows Azure: souvent mal compris, il est parfois oublié ou classé dans la catégorie des tchnologies “intéressantes, à regarder plus tard”. Et pourtant, il s’agit du composant le plus simple à mettre en oeuvre: vous pouvez commencer à utiliser le Cloud dès aujourd’hui, en ouvrant un compte Windows Azure et en exploitant ce composant de stockage, sans avoir à écrire ni à déployer la moindre ligne de code.

Pour rappel, le Stockage Windows Azure est composé de trois éléments, fondés sur un même socle technique, et qui partagent donc des attributs de haute disponibilité, de haute performances et de capacité de stockage quasiment illimitée:

  • Les Blobs, permettant de stocker et de diffuser des fichiers, éventuellement adossé à notre Content Delivery Network pour en optimiser la diffusion,
  • Les Tables, permettant de stocker des données structurées, dans un conteneur de type NoSQL
  • Les Queues, permettant d’établir une communication inter-processus par l’intermédiaire de files d’attente

Si l’on excepte les Queues, ces composants sont tout-à-fait utilisables indépendamment de tous les autres éléments composant la plateforme Windows Azure (comme par exemple les machines virtuelles); l’on peut citer quelques scénarios d’utilisation possibles:

  • Utiliser les Blobs pour -
    • Archiver des documents ou fichiers
    • Diffuser des images ou vidéos publiques, en utilisant éventuellement le CDN
    • Diffuser ou partager des fichiers de tout type de façon sécurisée, en utilisant les Shared Access Signatures
    • Diminuer vos coûts d’hébergement Web en reportant tout ou partie de votre stockage sur des Blobs
  • Utiliser les Tables pour -
    • Archiver ou stocker des données structurées en quantité quasiment illimitée, sans utiliser un stockage coûteux de type SGBD
      • on peut par exemple penser à des logs de serveurs Web, …

Le premier frein à l’utilisation du Stockage Windows Azure est souvent la question des performances: quel débit vais-je avoir pour télécharger des données, en montant comme en descendant? Combien d’opérations par seconde puis-je envisager d’obtenir? Comment la taille de mes unités de stockage (un fichier, une entrée de données…) impacte-t-elle ces performanes? Etc.

Il faut donc des outils et des éléments de référence pour pouvoir évaluer, puis tester et mesurer, ces performances, depuis votre environnement de référence: typiquement votre réseau local, mais cela pourrait également être depuis votre hébergeur.

Voici donc une petite collection d’éléments de ce type, pas forcément très connus, qui vous permettront j’espère de faire vos premières expérimentations.

Azurescope

Azurescope est un site qui a été développé dans le cadre du projet “Azure Research Engagement” mené par le groupe eXtremene Computing Group de Microsoft Research. Ce projet a pour objectif de faciliter l’adoption de Windows Azure par les communautés scientifiques et académiques, afin qu’elles puissent mettre la puissance de l’infrastructure Windows Azure au service de la recherche scientifique. Le programme AzureBrain mené en partenariat avec l’INRIA s’inscrit par exemple dans ce cadre.

Spécifiquement, Azurescope a pour objectif de fournir des résultats de tests de performances (Benchmarks), remis à jour régulièrement, afin de faciliter la conception d’architectures s’appuyant sur Windows Azure.

Les benchmarks actuellement disponibles se concentrent justement sur la partie stockage, en présentant de façon interactive les résultats détaillés pour l’ensemble des opérations de base (lecture/écriture) pour les trois types de stockage, ainsi qu’une analyse présentant les points clés mis en avant par les tests.

Imaginons par exemple que vous avez un grand nombre d’éléments à écrire dans des Tables; vous pourrez explorer les différents cas de test pour déterminer les critères permettant d’obtenir le meilleur débit (par exemple, le nombre de clients simultanés et le nombre de partitions):

image

Azure Throughput Analyzer

Un autre produit des efforts de l’eXtreme Computing Group, le Azure Throughput Analyzer va vous permettre de réaliser vos propres tests, depuis votre réseau, et de façon interactive, sans avoir à développer une application de test.

Le Throughput Analyzer vous permet de tester les Blobs, les Tables et les Queues, en utilisant des profils pré-configurés, ou en créant les votres. Vous pourrez ainsi tester différentes configurations, ou essayer de vous approcher des caractéristiques de vos propres données, comme leur quantité, leur taille, etc. Cette application est très pratique pour tester rapidement depuis votre machine (et/ou différents points de votre réseau) des cas simples comme des téléchargement de Blobs ou des injections de données dans des Tables.

Voici des captures des descriptions des tests disponibles, ainsi que leurs paramètres.

image

image

image

Le logiciel est bien entendu téléchargeable gratuitement, mais son code source n’est malheureusement pas disponible pour le moment.

Azurescope: code samples

Si vous souhaitez réaliser des tests plus poussés, il n’y a pas de secret: vous devrez écrire une application de test qui simulera plus précisément votre environnement. Pour vous aider à démarrer, le site Azurescope propose également une série d’exemples de code réalisant des opérations de base, comme télécharger des Blobs, accéder à des Tables, etc. Ces exemples de code code sont une bonne base pour démarrer le développement de votre propre benchmark.

Je me suis par exemple basé sur l’exemple “CRUD Operations on Windows Azure Table” pour réaliser des tests complémentaires. Par exemple, l’exemple de code teste l’écriture d’éléments en batch (méthode CreateCustomers), mais ne permet pas de réaliser un test avec plusieurs clients travaillant en parallèle.

Il est trivial d’ajouter cette possibilité à l’aide de la Task Parallel Library de .NET 4.0 et notamment avec Parallel.ForEach:

public static void CreateCustomersParallelBatchByPartition(CloudStorageAccount account, string tableName, List<Customer> customers, int batchSize)
{
    Console.WriteLine("Creating {0} Customers using Parallel.Foreach.", customers.Count);

    IEnumerable<IGrouping<string, Customer>> customersInCity = customers.GroupBy(tuple => tuple.City);

    // Process one city at a time.
    Parallel.ForEach(customersInCity, customersInPartition =>
    {
        TableServiceContext context = new TableServiceContext(account.TableEndpoint.ToString(), account.Credentials);
        int i = 1;

        // Write a batch of x customers at a time.
        foreach (Customer c in customersInPartition)
        {
            c.PartitionKey = customersInPartition.Key;
            c.RowKey = c.Id;
            context.AddObject(tableName, c);

            if (i++ % batchSize == 0)
            {
                context.SaveChanges(SaveChangesOptions.Batch);
            }
        }

        // Write leftover customers.
        context.SaveChanges(SaveChangesOptions.Batch);
    });
    Console.WriteLine("Created {0} Customers.", customers.Count);
}

Dans cet exemple, j’utilise une thread par partition dans ma Table afn de paralléliser les opérations (ce qui améliore bien sûr les performances).

Optimisation des performances des Tables

Si vous commencez spécfiquement à écrire vos propres benchmarks concernant les Tables, vous allez rapidement vous poser des questions; et une bonne partie des réponses se trouvera probablement dans ce long billet sur le Blog de l’équipe Windows Azure Storage. Il s’agit à ce jour de la référence la plus complète en matière d’optimisation de votre code pour obtenir les meilleures performances sur les Tables Windows Azure. Le billet est long et dense, mais si vous êtes pressés, allez directement à la check-liste de la section “Performance Case Study Methodology” qui résume de façon synthétique toutes les optimisations utilisées dans le cadre de leurs propres benchmarks.

Sur ce, bon tests!