Dans la partie 1 de cette série sur les instantanés Apache HBase, vous avez appris à utiliser la nouvelle fonctionnalité d'instantanés et un peu de théorie sur la mise en œuvre. Il est maintenant temps d'approfondir un peu plus les détails techniques.
Qu'est-ce qu'un tableau ?
Une table HBase comprend un ensemble d'informations de métadonnées et un ensemble de paires clé/valeur :
- Informations sur le tableau :un fichier manifeste décrivant les "paramètres" de la table, tels que les familles de colonnes, les codecs de compression et d'encodage, les types de filtres Bloom, etc.
- Régions :Les « partitions » de la table sont appelées régions. Chaque région est responsable de la gestion d'un ensemble contigu de clés/valeurs, et elles sont définies par une clé de début et une clé de fin.
- WAL/MemStore :Avant d'écrire des données sur le disque, les puts sont écrits dans le Write Ahead Log (WAL), puis stockés en mémoire jusqu'à ce que la pression de la mémoire déclenche un vidage sur le disque. Le WAL fournit un moyen simple de récupérer les puts non vidés sur le disque en cas d'échec.
- HFiles :À un moment donné, toutes les données sont vidées sur le disque ; un HFile est le format HBase qui contient les clés/valeurs stockées. Les HFiles sont immuables mais peuvent être supprimés lors du compactage ou de la suppression de région.
(Remarque :pour en savoir plus sur le chemin d'écriture HBase, consultez l'article de blog sur le chemin d'écriture HBase.)
Qu'est-ce qu'un instantané ?
Un instantané est un ensemble d'informations de métadonnées qui permet à l'administrateur de revenir à un état précédent de la table sur laquelle il est pris. Un instantané n'est pas une copie de la table; la façon la plus simple d'y penser est comme un ensemble d'opérations pour garder une trace des métadonnées (informations de table et régions) et des données (HFiles, memstore, WAL). Aucune copie des données n'est impliquée pendant l'opération d'instantané.
- Instantanés hors ligne :Le cas le plus simple pour prendre un instantané est lorsqu'une table est désactivée. La désactivation d'une table signifie que toutes les données sont vidées sur le disque et qu'aucune écriture ou lecture n'est acceptée. Dans ce cas, prendre un instantané consiste simplement à parcourir les métadonnées de la table et les HFiles sur le disque et à en conserver une référence. Le maître effectue cette opération, et le temps requis est principalement déterminé par le temps requis par le namenode HDFS pour fournir la liste des fichiers.
- Instantanés en ligne :Dans la plupart des situations, cependant, les tables sont activées et chaque serveur de région gère les demandes d'insertion et d'obtention. Dans ce cas, le maître reçoit la demande d'instantané et demande à chaque serveur de région de prendre un instantané des régions dont il est responsable.
La communication entre les serveurs maître et de région se fait via Apache ZooKeeper à l'aide d'une transaction de type commit en deux phases. Le maître crée un znode qui signifie "préparer l'instantané". Chaque serveur de région traitera la demande et préparera l'instantané pour les régions à partir de la table dont il est responsable. Une fois qu'ils ont terminé, ils ajoutent un sous-nœud au znode de demande de préparation avec le sens "J'ai terminé".
Une fois que tous les serveurs de région ont rendu compte de leur état, le maître crée un autre znode qui signifie «Commit snapshot» ; chaque serveur de région finalisera l'instantané et signalera l'état comme avant de rejoindre le nœud. Une fois que tous les serveurs de région ont rendu compte, le maître finalisera l'instantané et marquera l'opération comme terminée. Dans le cas où un serveur de région signale une panne, le maître créera un nouveau znode utilisé pour diffuser le message d'abandon.
Étant donné que le serveur de région traite en permanence de nouvelles demandes, différents cas d'utilisation peuvent nécessiter différents modèles de cohérence. Par exemple, quelqu'un peut être intéressé par un instantané bâclé sans les nouvelles données dans le MemStore, quelqu'un d'autre peut vouloir un instantané entièrement cohérent qui nécessite des écritures verrouillées pendant un certain temps, et ainsi de suite.
Pour cette raison, la procédure pour prendre un instantané sur le serveur de région est enfichable. Actuellement, la seule implémentation présente est "Flush Snapshot", qui effectue un vidage avant de prendre un instantané et garantit uniquement la cohérence des lignes. D'autres procédures avec des politiques de cohérence différentes peuvent être mises en œuvre à l'avenir.
Dans le cas en ligne, le temps requis pour prendre un instantané est limité par le temps requis par le serveur de région le plus lent pour effectuer l'opération d'instantané et signaler le succès au maître. Cette opération est généralement de l'ordre de quelques secondes.
Archivage
Comme nous l'avons vu précédemment, les HFiles sont immuables. Cela nous permet d'éviter de copier les données lors des opérations de snapshot ou de clonage, mais lors du compactage, elles sont supprimées et remplacées par une version compactée. Dans ce cas, si vous avez un instantané ou une table clonée qui fait référence à l'un de ces fichiers, au lieu de les supprimer, ils sont déplacés vers un emplacement "archive". Si vous supprimez un instantané et que personne d'autre ne fait référence aux fichiers référencés par l'instantané, ces fichiers seront supprimés.
Cloner et restaurer des tables
Les instantanés peuvent être considérés comme une solution de sauvegarde où ils peuvent être utilisés pour restaurer/récupérer une table après une erreur d'utilisateur ou d'application, mais la fonction d'instantané peut permettre bien plus qu'une simple sauvegarde et restauration. Après avoir cloné une table à partir d'un instantané, vous pouvez écrire une tâche MapReduce ou une application simple pour fusionner de manière sélective les différences, ou ce que vous pensez être important, en production. Un autre cas d'utilisation est que vous pouvez tester les modifications de schéma ou les mises à jour des données sans avoir à attendre des heures pour une copie de table et sans vous retrouver avec beaucoup de données dupliquées sur le disque.
Cloner un tableau à partir d'un instantané
Lorsqu'un administrateur effectue une opération de clonage, une nouvelle table avec le schéma de table présent dans l'instantané est créée pré-divisée avec les clés de début/fin dans les informations sur les régions de l'instantané. Une fois les métadonnées de la table créées, au lieu de copier les données, la même astuce qu'avec l'instantané est utilisée. Comme les HFiles sont immuables, seule une référence au fichier source est créée; cela permet à l'opération d'éviter les copies de données et permet de modifier le clone sans affecter la table source ou l'instantané. L'opération de clonage est effectuée par le maître.
Restaurer une table à partir d'un instantané
L'opération de restauration est similaire à l'opération de clonage; vous pouvez considérer cela comme la suppression de la table et son clonage à partir de l'instantané. L'opération de restauration ramène les anciennes données présentes dans l'instantané en supprimant toutes les données de la table qui ne sont pas également dans l'instantané, et le schéma de la table est également rétabli à celui de l'instantané. Sous le capot, la restauration est implémentée en faisant un diff entre l'état de la table et l'instantané, en supprimant les fichiers qui ne sont pas présents dans l'instantané et en ajoutant des références à ceux de l'instantané mais qui ne sont pas présents dans l'état actuel. Le descripteur de table est également modifié pour refléter le "schéma" de la table au moment de l'instantané. L'opération de restauration est effectuée par le maître et la table doit être désactivée.
Futures
Actuellement, l'implémentation d'instantané inclut toutes les fonctionnalités de base requises. Comme nous l'avons vu, les nouvelles politiques de cohérence des instantanés pour les instantanés en ligne peuvent offrir plus de flexibilité, de cohérence ou d'amélioration des performances. Une meilleure gestion des fichiers peut réduire la charge sur le nœud de nom HDFS et améliorer la gestion de l'espace disque. De plus, les métriques, l'interface utilisateur Web (Hue) et plus encore sont sur la liste des tâches.
Conclusion
Les instantanés HBase ajoutent de nouvelles fonctionnalités telles que la "coordination des procédures" utilisée par l'instantané en ligne, ou l'instantané de copie sur écriture, la restauration et les clones.
Les instantanés offrent une alternative plus rapide et meilleure aux solutions de « sauvegarde » et de « clonage » artisanales basées sur distcp ou CopyTable. Toutes les opérations d'instantané (instantané, restauration, clonage) n'impliquent pas de copies de données, ce qui se traduit par des instantanés plus rapides de la table et des économies d'espace disque.
Pour plus d'informations sur l'activation et l'utilisation des instantanés, veuillez consulter le document de gestion opérationnelle HBase.
Matteo Bertozzi est ingénieur logiciel au sein de l'équipe Platform et HBase Committer.