Google Bigtable : Un Système de Stockage Distribué pour Données Structurées et son Écosystème Open Source

Introduction au stockage distribué à grande échelle

L'évolution des systèmes de gestion de bases de données a connu des avancées majeures au fil des décennies. Alors que les bases de données relationnelles (RDBMS) dominaient le marché jusqu'au début des années 2000, l'émergence du "Big Data" a mis en lumière de nouveaux défis en matière de stockage et d'analyse de volumes de données massifs. En réponse à ces enjeux, Google a publié une série d'articles fondamentaux entre 2003 et 2006, décrivant son approche pour la gestion de données à l'échelle de l'entreprise. Parmi ceux-ci, MapReduce: Simplified Data Processing on Large Clusters, The Google File System et Bigtable: A Distributed Storage System for Structured Data ont jeté les bases des systèmes distribués modernes.

Bigtable, en particulier, a été conçu pour stocker de vastes quantités de données structurées et semi-structurées, souvent de l'ordre du pétaoctet, réparties sur des milliers de serveurs de commodité. Utilisé par de nombreux services Google tels que l'indexation web, Google Earth ou Google Finance, Bigtable a su s'adapter à des exigences diverses, allant des traitements par lots en arrière-plan aux services de données en temps réel nécessitant une faible latence. Sa capacité à offrir une solution flexible, performante et hautement disponible, malgré la variété des charges de travail, en a fait un modèle influent, inspirant notamment des projets open source comme Apache HBase au sein de l'écosystème Hadoop.

Modèle de données de Bigtable

Le cœur de Bigtable repose sur un modèle de données unique : un map multidimensionnel, clairsemé, distribué et persistant. Ce map est indexé par une clé de ligne (row key), une clé de colonne (column key) et un horodatage (timestamp). Chaque valeur stockée est un tableau d'octets non interprété.

(clé_ligne:string, clé_colonne:string, horodatage:int64) -> string

Ce modèle a été défini après une analyse approfondie des besoins de stockage internes de Google. Prenons l'exemple d'une table appelée "Webtable" pour stocker des pages web. Ici, l'URL pourrait servir de clé de ligne. Les propriétés de la page seraient des noms de colonnes, et le contenu de la page serait stocké dans une famille de colonnes "contenu:", avec l'horodatage correspondant à l'heure de récupération de la page. La Figure 1 illustre une telle structure.

Clés de ligne

Les clés de ligne sont des chaînes de caractères arbitraires (jusqu'à 64 Ko, mais généralement 10 à 100 octets). Toutes les opérations de lecture ou d'écriture sur une même clé de ligne sont atomiques, simplifiant la logique d'application en cas de mises à jour concurrentes. Bigtable ordonne les données par clé de ligne lexicographiquement. Une table est dynamiquement partitionnée en "Tablettes" (Tablets), l'unité minimale de distribution et de rééquilibrage de charge. Ce partitionnement permet des lectures efficaces pour des plages de clés de ligne, souvent avec un minimum de communications inter-machines. Un choix judicieux de la clé de ligne peut exploiter la localité des données, par exemple en inversant les noms d'hôtes dans les URL (com.google.maps/index.html au lieu de maps.google.com/index.html) pour regrouper les pages du même domaine.

Familles de colonnes

Un ensemble de clés de colonne est regroupé en une "famille de colonnes" (column family), qui constitue l'unité de base pour le contrôle d'accès et la gestion du stockage (par exemple, la compression). Les familles de colonnes doivent être créées avant d'être utilisées et ne sont généralement pas nombreuses (quelques centaines au maximum), changeant rarement en cours d'exécution. Chaque famille de colonnes peut contenir un nombre illimité de qualificatifs de colonne. La syntaxe des clés de colonne est famille_colonnes:qualificatif. Par exemple, la Webtable pourrait avoir une famille "langage" pour la langue de la page, et la famille "ancre" où le qualificatif est le nom du site source du lien, et la valeur est le texte de l'ancre.

Le contrôle d'accès, l'utilisation du disque et de la mémoire sont gérés au niveau de la famille de colonnes. Cela permet de définir des politiques granulaires, par exemple, en autorisant certaines applications à écrire des données de base, d'autres à créer des familles de colonnes dérivées, et d'autres encore à n'avoir qu'un accès en lecture.

Horodatages

Chaque cellule de données dans Bigtable peut contenir plusieurs versions de la même donnée, indexées par un horodatage entier de 64 bits. Bigtable peut attribuer des horodatages "réels" (millisecondes) ou permettre aux applications de les spécifier. Les versions des données sont stockées par ordre décroissant d'horodatage, la plus récente étant en premier.

Pour gérer les versions, Bigtable offre deux paramètres par famille de colonnes pour le ramasse-miettes automatique : conserver les n dernières versions ou conserver les versions "suffisamment récentes" (ex: des 7 derniers jours). Dans l'exemple de la Webtable, les horodatages pour la colonne contenu: représenteraient le moment où la page a été explorée, et la politique pourrait être de ne conserver que les trois dernières versions.

API cliente

Bigtable propose une API permettant la création et la suppression de tables et de familles de colonnes, ainsi que la modification des métadonnées comme les droits d'accès. Les applications clientes peuvent écrire ou supprimer des valeurs, récupérer des valeurs d'une ligne ou parcourir des sous-ensembles d'une table.

Exemple de mutation de ligne (C++)

L'extrait de code C++ suivant illustre une série de mises à jour atomiques sur une ligne, ajoutant une ancre et en supprimant une autre.

#include <string>
#include <iostream> // Pour la sortie de simulation

// Espace de noms pour simuler l'API client Bigtable
namespace BigtableAPI {

// Représentation simplifiée d'une table
class TableRef {
public:
    std::string chemin_table;
    explicit TableRef(const std::string& path) : chemin_table(path) {}
};

// Classe pour encapsuler les mutations d'une ligne
class LigneModification {
public:
    LigneModification(TableRef& refTable, const std::string& cleLigne)
        : table_ref_(refTable), cle_ligne_(cleLigne) {}

    // Définit une valeur pour une colonne (famille:qualificatif)
    void definir(const std::string& familleQualificateur, const std::string& valeur) {
        std::cout << "  [SET] Clé: " << cle_ligne_ << ", Colonne: " << familleQualificateur
                  << ", Valeur: '" << valeur << "'" << std::endl;
        // Logique interne pour stocker la mutation
    }

    // Supprime une colonne (famille:qualificatif)
    void supprimer(const std::string& familleQualificateur) {
        std::cout << "  [DELETE] Clé: " << cle_ligne_ << ", Colonne: " << familleQualificateur << std::endl;
        // Logique interne pour stocker la mutation
    }

    // Simule l'application atomique des modifications
    void appliquer() {
        std::cout << "Application atomique des modifications pour la table '"
                  << table_ref_.chemin_table << "' sur la ligne '" << cle_ligne_ << "'" << std::endl;
        // Appel RPC réel à Bigtable serait ici
    }

private:
    TableRef& table_ref_;
    std::string cle_ligne_;
};

} // namespace BigtableAPI

// --- Exemple d'utilisation ---
/*
BigtableAPI::TableRef tableWeb("/bigtable/web/webtable");
BigtableAPI::LigneModification mutationLigne(tableWeb, "com.cnn.www");
mutationLigne.definir("ancre:www.c-span.org", "CNN");
mutationLigne.supprimer("ancre:www.abc.com");
mutationLigne.appliquer();
*/

Exemple de scan de ligne (C++)

Le code C++ ci-dessous montre comment utiliser un scanner pour parcourir toutes les ancres d'une ligne. Il est possible de restreindre le scan aux familles de colonnes, aux horodatages ou aux expressions régulières.

#include <string>
#include <vector>
#include <iostream>
#include <cstdio> // Pour printf

// Espace de noms pour simuler l'API client Bigtable
namespace BigtableAPI {

// (TableRef definition as above)
// Représentation simplifiée d'une table
class TableRef {
public:
    std::string chemin_table;
    explicit TableRef(const std::string& path) : chemin_table(path) {}
};

// Structure pour un résultat de cellule
struct CelluleResultat {
    std::string cle_ligne;
    std::string nom_colonne; // ex: "ancre:www.c-span.org"
    long long horodatage;
    std::string valeur;
};

// Classe pour effectuer des scans
class ScanConfig {
public:
    explicit ScanConfig(TableRef& refTable) : table_ref_(refTable), inclure_toutes_versions_(false) {}

    // Spécifie une famille de colonnes à récupérer
    ScanConfig& ciblerFamille(const std::string& famille) {
        famille_cible_ = famille;
        return *this;
    }

    // Demande à retourner toutes les versions des cellules
    ScanConfig& retournerToutesVersions() {
        inclure_toutes_versions_ = true;
        return *this;
    }

    // Simule la recherche d'une ligne et retourne un vecteur de résultats
    std::vector<CelluleResultat> chercherLigne(const std::string& cleLigne) {
        std::vector<CelluleResultat> resultats;
        std::cout << "--- Exécution du scan sur la table '" << table_ref_.chemin_table
                  << "' pour la ligne '" << cleLigne << "'" << std::endl;

        // Simulation de données
        if (cleLigne == "com.cnn.www" && famille_cible_ == "ancre") {
            resultats.push_back({"com.cnn.www", "ancre:www.c-span.org", 1678886400000LL, "CNN"});
            resultats.push_back({"com.cnn.www", "ancre:www.my-look.ca", 1678886401000LL, "MonLook"});
        }
        // Pour un exemple plus complet, ajouterait d'autres données
        // si 'inclure_toutes_versions_' est vrai ou pour d'autres familles
        return resultats;
    }

private:
    TableRef& table_ref_;
    std::string famille_cible_;
    bool inclure_toutes_versions_;
};

} // namespace BigtableAPI

// --- Exemple d'utilisation ---
/*
BigtableAPI::TableRef tableWeb("/bigtable/web/webtable");
BigtableAPI::ScanConfig configurationScan(tableWeb);
std::vector<BigtableAPI::CelluleResultat> resultats =
    configurationScan.ciblerFamille("ancre")
                     .retournerToutesVersions()
                     .chercherLigne("com.cnn.www");

for (const auto& cellule : resultats) {
    printf("Ligne: %s, Colonne: %s, Timestamp: %lld, Valeur: %s\n",
           cellule.cle_ligne.c_str(),
           cellule.nom_colonne.c_str(),
           cellule.horodatage,
           cellule.valeur.c_str());
}
*/

L'API de Bigtable prend également en charge les transactions sur une seule ligne, des compteurs d'entiers et l'exécution de scripts côté serveur (via Sawzall). De plus, Bigtable s'intègre étroitement avec MapReduce, le framework de calcul distribué de Google, en servant de source et de destination pour les tâches.

Architecture des composants Bigtable

Bigtable est construit sur d'autres briques d'infrastructure de Google. Il utilise le système de fichiers distribué de Google (GFS) pour stocker les journaux et les fichiers de données. Les clusters Bigtable fonctionnent souvent sur des pools de machines partagés avec d'autres applications distribuées. Le système de gestion de cluster est responsable de la planification des tâches, de la gestion des ressources, de la détection des pannes et de la surveillance.

Les données internes de Bigtable sont stockées au format Google SSTable, un format de fichier persistant, ordonné et immuable pour des maps clé-valeur. Un SSTable est composé de blocs de données (typiquement 64 Ko), avec un index de blocs chargé en mémoire à l'ouverture, permettant une recherche efficace par clé. L'intégralité d'un SSTable peut aussi être chargée en mémoire pour des accès ultra-rapides.

Bigtable s'appuie également sur Chubby, un service de verrouillage distribué hautement disponible, qui fournit un service de verrouillage et de coordination. Chubby assure qu'il n'y a qu'un seul maître Bigtable actif, stocke l'emplacement des instructions de démarrage, aide à la découverte et au basculement des serveurs de tablettes, et gère les informations de schéma et les listes de contrôle d'accès. La dépendance à Chubby signifie que Bigtable peut être affecté si Chubby devient inaccessible, bien que ces événements soient rares et de courte durée.

Vue d'ensemble de l'implémentation

L'architecture de Bigtable comprend trois composants principaux : une bibliothèque client liée aux applications, un serveur Maître (Master server) et de nombreux serveurs de Tablettes (Tablet servers). Les serveurs de tablettes peuvent être ajoutés ou retirés dynamiquement pour s'adapter à la charge de travail.

  • Le serveur Maître est responsable de l'affectation des tablettes aux serveurs de tablettes, de la détection des serveurs de tablettes disponibles ou défaillants, du rééquilibrage de la charge, du ramasse-miettes des fichiers GFS et de la gestion des modifications de schéma.
  • Chaque serveur de Tablettes gère un ensemble de tablettes (généralement des dizaines à des milliers). Il est responsable de la gestion des opérations de lecture/écriture pour les tablettes qu'il héberge et de la division des tablettes trop volumineuses.

Contrairement à certains systèmes de stockage distribué, les lectures clientes ne passent pas par le serveur Maître. Les clients communiquent directement avec les serveurs de tablettes, réduisant ainsi la charge sur le Maître et la latence des requêtes. Un cluster Bigtable héberge de nombreuses tables, chacune composée d'une collection de tablettes couvrant des plages de clés de ligne. Une table commence avec une seule tablette et se divise automatiquement à mesure que les données augmentent (par défaut, 100-200 Mo par tablette).

Localisation des Tablettes

Les informations de localisation des tablettes sont stockées dans une structure à trois niveaux, similaire à un B-tree, comme illustré dans la Figure 4. Le premier niveau est un fichier dans Chubby qui pointe vers la Tablette Racine (Root Tablet). La Tablette Racine contient la localisation de toutes les tablettes de la table spéciale METADATA. Chaque tablette de la table METADATA contient la localisation d'un ensemble de tablettes utilisateur. La Tablette Racine est la première tablette de la table METADATA et est traitée spécialement (elle ne se divise jamais), garantissant ainsi que la structure reste à trois niveaux.

Allocation des Tablettes

Une tablette est assignée à un seul serveur de tablettes à la fois. Le serveur Maître surveille les serveurs de tablettes actifs et leurs affectations. Lorsqu'une tablette est non assignée et qu'un serveur de tablettes dispose de suffisamment d'espace, le Maître lui envoie une requête pour la charger. Bigtable utilise Chubby pour suivre l'état des serveurs de tablettes : chaque serveur crée un fichier verrouillé dans un répertoire Chubby à son démarrage. Si un serveur perd ce verrou, il cesse de servir les tablettes.

En cas de défaillance d'un serveur de tablettes, le Maître le détecte via Chubby et réassigne rapidement ses tablettes. Lors du démarrage, le Maître acquiert un verrou unique, scanne les répertoires Chubby pour les serveurs actifs, communique avec eux pour leurs affectations de tablettes, puis scanne la table METADATA pour identifier toutes les tablettes et les assigner si nécessaire.

Opérations sur les Tablettes

L'état persistant d'une tablette est stocké dans GFS. Les modifications sont enregistrées dans un journal de réplication (REDO log). Les modifications récentes sont conservées dans une zone tampon triée en mémoire appelée memtable, tandis que les modifications plus anciennes sont stockées dans une série de fichiers SSTable. Pour récupérer une tablette, un serveur de tablettes lit ses métadonnées (liste de SSTables et points de reprise dans le journal) et reconstruit le memtable en rejouant les modifications à partir de ces points.

Gestion de l'espace de stockage : Compactage

Au fur et à mesure des écritures, le memtable grossit. Lorsqu'il atteint une certaine taille, il est "gelé", un nouveau memtable est créé, et l'ancien est converti en SSTable et écrit dans GFS. Ce processus, appelé Compactage Mineur (Minor Compaction), réduit l'utilisation de la mémoire et la quantité de données à lire du journal pour la récupération.

Chaque compactage mineur crée un nouveau SSTable. Pour éviter une prolifération de SSTables qui ralentirait les lectures (nécessitant la fusion de plusieurs sources), des Compactages de Fusion (Merging Compactions) sont exécutés en arrière-plan. Ils fusionnent plusieurs SSTables et le memtable en un nouveau SSTable unique. Les SSTables d'entrée sont ensuite supprimés.

Un Compactage Majeur (Major Compaction) est un type de compactage de fusion qui regroupe tous les SSTables d'une tablette en un seul nouveau SSTable. Il est crucial car il élimine toutes les données supprimées et récupère les ressources, assurant ainsi le nettoyage des données obsolètes ou sensibles. Bigtable scanne périodiquement toutes ses tablettes pour effectuer ces compactages majeurs.

Optimisations de performance

Pour atteindre ses objectifs de performance et de fiabilité, Bigtable intègre plusieurs optimisations:

  • Groupes de localité : Les applications peuvent regrouper des familles de colonnes en "groupes de localité". Chaque groupe de localité est stocké dans des SSTables séparés, améliorant l'efficacité des lectures en évitant de charger des données non pertinentes. Un groupe de localité peut être configuré pour être entièrement stocké en mémoire, ce qui est utile pour de petites données fréquemment accédées.
  • Compression : Les SSTables de chaque groupe de localité peuvent être compressés selon un format spécifié par l'utilisateur. Une compression par blocs, souvent en deux passes (Bentley et McIlroy pour les longues chaînes communes, puis un algorithme rapide pour les répétitions courtes), est utilisée. Cette méthode est rapide (100-200 Mo/s en compression, 400-1000 Mo/s en décompression) et offre des taux de compression excellents (ex: 10:1 pour le contenu web sur Webtable, grâce à la localité des clés de ligne).
  • Mise en cache des lectures : Les serveurs de tablettes utilisent un cache à deux niveaux : un cache de scan pour les paires clé-valeur via l'interface SSTable, et un cache de blocs pour les blocs SSTable lus de GFS. Le cache de scan est efficace pour les lectures répétées des mêmes données, tandis que le cache de blocs aide les lectures séquentielles ou aléatoires dans des régions chaudes.
  • Filtres de Bloom : Pour réduire les accès disque lors des lectures, Bigtable utilise des filtres de Bloom. Ceux-ci permettent de vérifier si un SSTable contient des données pour une ligne et une colonne spécifiques avant d'accéder au disque, réduisant considérablement les E/S pour les données non existantes.
  • Journaux de commit optimisés : Plutôt qu'un fichier de journal par tablette (ce qui entraînerait de nombreux petits fichiers et des E/S inefficaces sur GFS), chaque serveur de tablettes maintient un seul fichier de journal de commit. Les enregistrements de différentes tablettes sont ajoutés à ce journal unique, ce qui augmente le débit des petites écritures. Pour la récupération, le journal est d'abord trié par (table, clé de ligne, numéro de séquence de journal), puis traité en parallèle, permettant des lectures séquentielles par tablette.
  • Accélération de la récupération des tablettes : Lorsqu'une tablette est déplacée, le serveur source effectue un compactage mineur rapide pour réduire la quantité de données non fusionnées dans le journal. Avant de décharger la tablette, un second compactage mineur est effectué, ce qui permet à la tablette d'être chargée par un nouveau serveur sans nécessiter de récupération à partir du journal.
  • Exploitation de l'immutabilité : L'immutabilité des SSTables simplifie le système. Les lectures des SSTables n'ont pas besoin de synchronisation, permettant des opérations parallèles efficaces. Le memtable, la seule structure de données mutable accédée simultanément en lecture et écriture, utilise un mécanisme de copie sur écriture (COW) pour minimiser les conflits. L'immutabilité simplifie également le ramasse-miettes des données supprimées (en supprimant des SSTables entiers) et permet un partage rapide des SSTables lors de la division des tablettes.

Évaluation des performances

Des tests de performance ont été menés sur des clusters Bigtable avec un nombre variable (N) de serveurs de tablettes, chacun disposant de 1 Go de mémoire. Les données étaient stockées sur un cluster GFS de 1786 machines. La Figure 6 présente un résumé des performances pour des lectures et écritures de valeurs de 1000 octets.

Les lectures aléatoires sont significativement plus lentes en raison du transfert de blocs SSTable de 64 Ko depuis GFS pour chaque valeur de 1000 octets lue, saturant la bande passante CPU et réseau. Les lectures aléatoires en mémoire sont beaucoup plus rapides car elles accèdent directement à la mémoire locale. Les écritures séquentielles et aléatoires sont performantes grâce à l'ajout au journal de commit unique par serveur et aux écritures par lots sur GFS. Les lectures séquentielles sont plus rapides que les lectures aléatoires car les blocs SSTable sont mis en cache. Les scans offrent le débit le plus élevé grâce à la récupération de nombreuses valeurs par appel RPC, amortissant ainsi le coût du RPC.

Mise à l'échelle

Le débit global du système augmente considérablement avec le nombre de serveurs de tablettes, démontrant une bonne évolutivité. Par exemple, les lectures aléatoires en mémoire ont montré une augmentation de 300 fois du débit global pour 500 serveurs. Cependant, la mise à l'échelle n'est pas parfaitement linéaire, principalement en raison de déséquilibres de charge (compétition CPU avec d'autres processus) et de la saturation du réseau pour les charges de travail intensives en E/S (comme les lectures aléatoires de gros blocs), qui peuvent entraîner une diminution du débit par serveur à mesure que le nombre de serveurs augmente.

Applications réelles chez Google

En août 2006, Google opérait 388 clusters Bigtable non-tests, totalisant environ 24 500 serveurs de tablettes. La Table 1 présente la distribution des serveurs de tablettes dans ces clusters. La Table 2 fournit des données sur quelques tables en production, illustrant la diversité des tailles, des types de données et des schémas utilisés.

Google Analytics aide les administrateurs de sites web à analyser les schémas de trafic. Il utilise une "Raw Click Table" (environ 200 To) où chaque ligne représente une session utilisateur, avec des clés de ligne composées du nom du site et de l'heure de la session pour assurer une ordonnance chronologique. Cette table est hautement compressible (taux de 14%). Une "Summary Table" (environ 20 To) contient des informations agrégées et est générée périodiquement par des tâches MapReduce à partir de la Raw Click Table. Elle est compressible à 29%.

Google Earth

Google Earth et Google Maps fournissent des images satellites haute résolution. Un système de prétraitement utilise une table (environ 70 To) pour stocker les images brutes, qui sont ensuite nettoyées et fusionnées. Une autre table, "Imagery Table", représente des régions géographiques individuelles, avec des clés de ligne assurant la colocalisation des régions voisines. Une famille de colonnes stocke les sources de données pour chaque zone, étant très éparse. La pipeline de prétraitement s'appuie fortement sur MapReduce exécuté sur Bigtable. Une table d'index (environ 500 Go), utilisée pour des requêtes à faible latence, est stockée sur des centaines de serveurs de tablettes avec des groupes de localité en mémoire.

Recherche Personnalisée

Le service de Recherche Personnalisée de Google (www.google.com/psearch) enregistre les requêtes et les clics des utilisateurs pour offrir des résultats personnalisés. Il utilise Bigtable pour stocker les données de chaque utilisateur, avec un ID utilisateur unique lié à un nom de colonne. Différentes familles de colonnes sont utilisées pour différents types de comportements (ex: requêtes web). Chaque entrée utilise l'horodatage de Bigtable pour enregistrer l'heure de l'activité. Les tâches MapReduce sur Bigtable génèrent des profils utilisateurs qui sont ensuite utilisés pour personnaliser les résultats de recherche. Les données sont répliquées sur plusieurs clusters Bigtable pour améliorer la disponibilité et réduire la latence. Le système inclut un mécanisme de quotas pour gérer l'utilisation de l'espace dans les tables partagées par différentes équipes.

Leçons apprises

Le développement et la maintenance de Bigtable ont fourni de précieuses leçons :

  • Complexité des défaillances : Les grands systèmes distribués sont sujets à des erreurs variées au-delà des pannes simples ou des erreurs fail-stop. Cela inclut la corruption de données en mémoire, les pannes réseau, les dérives d'horloge, les blocages de machines, les partitions réseau asymétriques, les bugs dans les systèmes sous-jacents (comme Chubby), les dépassements de quotas GFS et la maintenance matérielle. L'ajout de sommes de contrôle aux mécanismes RPC et l'évitement des hypothèses implicites sur le comportement des autres composants ont été cruciaux.
  • Développement itératif des fonctionnalités : Il est préférable de ne pas implémenter de nouvelles fonctionnalités tant que l'on n'a pas une compréhension claire de leur utilisation réelle. Initialement, des transactions distribuées générales étaient envisagées, mais l'analyse des besoins a montré que la plupart des applications nécessitaient uniquement des transactions sur une seule ligne. Des mécanismes spécifiques ont été ajoutés pour des cas particuliers (comme la maintenance d'index secondaires), plus efficaces et adaptés à la réplication inter-datacenters.
  • Importance de la surveillance système : Une surveillance approfondie de Bigtable et de ses clients est essentielle. Le système RPC étendu permet d'enregistrer des détails importants sur les appels, aidant à détecter des problèmes tels que les blocages de structures de données, les écritures GFS lentes ou les accès bloqués à la table METADATA. Chaque cluster Bigtable est enregistré dans Chubby, permettant de suivre leur état, taille, versions logicielles et trafic, ainsi que d'identifier les causes de latence élevée.
  • Valeur de la simplicité de conception : Malgré la complexité inhérente aux systèmes distribués, une conception simple et une écriture de code claire sont primordiales pour la maintenance et le débogage. Une première version du protocole d'adhésion des serveurs de tablettes, bien que robuste, était trop complexe et dépendait de fonctionnalités peu utilisées de Chubby, entraînant des difficultés de débogage. Une refonte vers un protocole plus simple, utilisant les fonctionnalités les plus courantes de Chubby, a finalement amélioré la stabilité et la facilité de maintenance.

Conclusion

Bigtable, un système de stockage distribué de données structurées, est en production chez Google depuis avril 2005. Il est utilisé par plus de 60 projets, qui apprécient sa haute performance, sa disponibilité et sa capacité d'évolution par simple ajout de machines. Bien que son interface de programmation ne soit pas conventionnelle, les nombreux succès internes attestent de l'efficacité de sa conception.

Des développements futurs pour Bigtable incluent le support d'index secondaires et la réplication multi-maîtres inter-datacenters. Google commence également à déployer Bigtable en tant que service pour d'autres équipes produits, nécessitant une gestion accrue du partage des ressources internes. La capacité de Google à concevoir son propre modèle de données et à contrôler l'ensemble de l'implémentation de Bigtable, ainsi que ses dépendances sur d'autres infrastructures Google, offre une flexibilité et une capacité de résolution rapide des goulots d'étranglement ou des inefficacités.

Étiquettes: Google Bigtable HBase NoSQL Bases de données distribuées mapreduce

Publié le 27 juillet à 20h11