- Ce que sont les snapshots et où les trouver
- Comment le problème se manifeste
- Les stratégies de récupération possibles et ce que chacune d’elles implique
Vue d’ensemble des snapshots de Keeper
Qu’est-ce qu’un snapshot ?
Un snapshot est un état sérialisé des données internes de Keeper (comme les métadonnées sur les clusters, les chemins de coordination des tables et les configurations) à un instant donné. Les snapshots sont essentiels pour resynchroniser les nœuds Keeper au sein d’un cluster, restaurer les métadonnées en cas de défaillance, ainsi que pour les processus de démarrage ou de redémarrage qui s’appuient sur un état valide connu de Keeper.Où puis-je trouver des snapshots ?
Les snapshots sont stockés sous forme de fichiers sur le système de fichiers local des nœuds Keeper. Par défaut, ils sont enregistrés dans/var/lib/clickhouse/coordination/snapshots/, ou dans le chemin personnalisé défini par snapshot_storage_path dans votre fichier keeper_server.xml. Les snapshots sont numérotés de manière incrémentielle (par exemple, snapshot.23), les plus récents portant des numéros plus élevés.
Dans les clusters multinœuds, chaque nœud Keeper possède son propre répertoire de snapshots.
La cohérence des snapshots entre les nœuds est essentielle à la récupération.
Principaux symptômes et manifestations de snapshots Keeper corrompus
Le tableau ci-dessous présente quelques symptômes et manifestations courants de snapshots Keeper corrompus :
Indicateurs dans les logs :
Avant de diagnostiquer une corruption de snapshot, vérifiez les logs Keeper afin d’identifier des motifs d’erreur spécifiques :
Récupération après des snapshots Keeper corrompus
Avant de toucher aux fichiers, veillez toujours à :- Arrêter tous les nœuds Keeper pour éviter toute corruption supplémentaire
- Sauvegarder l’ensemble en copiant l’intégralité du répertoire de coordination dans un emplacement sûr
- Vérifier le quorum du cluster afin de vous assurer qu’au moins un nœud dispose de données intactes
- Restaurer à partir d’une sauvegarde existante
Suivez cette procédure si :
- La corruption des métadonnées de Keeper ou d’un snapshot rend les données actuelles irrécupérables.
- Une sauvegarde existe avec un état Keeper connu comme sain.
- Repérez et validez la sauvegarde la plus récente afin de vérifier la cohérence des métadonnées.
- Arrêtez les services ClickHouse et Keeper.
- Remplacez les snapshots et les logs défectueux par ceux du répertoire de sauvegarde.
- Redémarrez le cluster Keeper et vérifiez la synchronisation des métadonnées.
- Revenir à un snapshot plus ancien
Suivez cette procédure dans les cas suivants :
- Des snapshots récents sont corrompus, mais d’anciens snapshots restent exploitables.
- Les logs incrémentiels sont intacts, ce qui permet une restauration cohérente.
- Identifiez et sélectionnez un ancien snapshot valide (par exemple, snapshot.19) dans le répertoire Keeper.
- Supprimez les snapshots et les logs plus récents.
- Redémarrez Keeper afin qu’il rejoue les logs pour reconstruire l’état des métadonnées.
- Restaurer les métadonnées à l’aide de
SYSTEM RESTORE REPLICA
Vous devez suivre ce processus dans les cas suivants :
SYSTEM RESTORE REPLICA- les métadonnées de Keeper sont perdues ou corrompues, mais les données de la table existent toujours sur le disque
- les tables sont passées en mode lecture seule en raison de métadonnées ZooKeeper/Keeper manquantes
- vous devez recréer les métadonnées dans Keeper à partir des parties de données disponibles localement
-
Vérifiez que les données de la table existent localement dans le chemin de données de votre clickhouse-server, défini par
<path>dans votre configuration. (/var/lib/clickhouse/data/par défaut) - Pour chaque table concernée, exécutez :
- Pour une récupération au niveau de la base de données (si vous utilisez le moteur de base de données Replicated) :
- Attendez la fin de la synchronisation :
- Vérifiez la récupération en vérifiant que
system.replicasais_readonly = 0et en surveillantsystem.detached_parts
Comment cela fonctionne
SYSTEM RESTORE REPLICA détache toutes les parts existantes, recrée les métadonnées dans Keeper (comme s’il s’agissait d’une nouvelle table vide), puis réattache toutes les parts. Cela évite de retélécharger les données via le réseau.
- Supprimer et recréer les métadonnées de la réplique dans Keeper
Vous devez suivre cette procédure dans les cas suivants :
- L’erreur se produit sur une seule réplique du cluster et les métadonnées correspondantes dans Keeper sont corrompues ou incohérentes
- Vous rencontrez des erreurs du type “Part XXXXX intersects previous part YYYYY”
- Vous devez réinitialiser complètement les métadonnées d’une réplique dans Keeper tout en conservant les données locales
- Sur la réplique affectée, détachez la table :
- Supprimez de Keeper les métadonnées de la réplique (à exécuter sur n’importe quelle réplique) :
- Réattachez la table (elle sera en mode lecture seule) :
- Restaurez les métadonnées de la réplique :
- Synchronisez-vous avec les autres répliques :
- Vérifiez
system.detached_partssur toutes les répliques après la récupération
- Arrêtez le serveur ClickHouse
- Créez le flag de récupération :
- Démarrez le serveur ClickHouse
- Le serveur supprimera automatiquement le flag et restaurera toutes les tables répliquées
- Surveillez les logs pour suivre la progression de la restauration
- Reconstruire le cluster Keeper
Vous devez suivre ce processus lorsque :
- Ni snapshots, ni journaux, ni sauvegardes valides ne sont disponibles pour la restauration.
- Vous devez recréer l’intégralité du cluster Keeper et de ses métadonnées.
- Arrêtez complètement les clusters ClickHouse et Keeper.
- Réinitialisez chaque nœud Keeper en nettoyant les répertoires de snapshots et de journaux.
- Initialisez un nœud Keeper comme leader, puis ajoutez progressivement les autres nœuds.
- Réimportez les métadonnées si elles sont disponibles depuis des enregistrements externes.
- Supprimer les nœuds orphelins du snapshot au démarrage
Un nœud orphelin est un nœud dont le parent est absent du snapshot. Keeper refuse de charger un tel
snapshot et consigne le message Failure to load from latest snapshot with index dans le journal.
Suivez cette procédure lorsque :
- Le snapshot présente précisément ce type de corruption structurelle, et
- Aucune sauvegarde valide ni aucun snapshot plus ancien n’est disponible (privilégiez les stratégies 1 et 2 chaque fois qu’elles sont applicables).
<keeper_server>, puis redémarrez le nœud :
Nécessite le stockage des nœuds en mémoireLe nettoyage n’est implémenté que par le stockage des nœuds en mémoire. Si
use_lsmt_storage est activé dans
<coordination_settings>, Keeper refuse de démarrer lorsque remove_orphaned_nodes_on_startup est défini : désactivez
use_lsmt_storage pour le redémarrage de récupération, puis réactivez-le une fois le démarrage réussi.WARNING
sous la forme de deux lignes : l’une indique le nombre total de nœuds supprimés ainsi que les racines des sous-arbres orphelins
supprimés, l’autre les paths absents du snapshot qui délimitent la région endommagée. Les descendants
situés sous ces racines sont également supprimés, mais ne sont pas listés individuellement.
Après avoir vérifié la fin du journal local, Keeper écrit l’arbre réparé dans un nouveau fichier de snapshot au même
index de journal, avant de démarrer Raft. Les réparations terminées ont préséance sur les copies plus anciennes situées à cet index,
si bien qu’une récupération interrompue peut reprendre sans sélectionner le snapshot endommagé. Les nouveaux followers reçoivent
le snapshot réparé, et il n’est plus nécessaire d’activer la suppression des orphelins
lors des redémarrages ultérieurs. Le snapshot d’origine et toutes les copies au même index sont conservés
avec le préfixe de nom de fichier orphaned_ ; ces fichiers sont exclus du chargement des snapshots et de la rétention
automatique. Conservez-les à des fins de diagnostic, puis supprimez-les manuellement lorsque vous n’en avez plus besoin. Le
redémarrage de récupération nécessite de l’espace disque supplémentaire pour le snapshot réparé et la sauvegarde de l’original.
En cas d’échec de l’écriture du snapshot réparé, de la synchronisation des modifications du répertoire local ou de la conservation des originaux,
Keeper refuse de démarrer. Le démarrage suivant achève tout archivage interrompu.
Keeper refuse délibérément de démarrer si une entrée de journal locale postérieure au snapshot fait référence à la région
endommagée : un nœud supprimé, tout élément situé en dessous, ou le parent direct d’un sous-arbre supprimé. Le parent direct
est considéré comme un conflict, car son ensemble d’enfants ne correspond plus à l’arbre à partir duquel le journal a été écrit ;
ainsi, même une entrée qui ne fait que le modifier — y compris la création ou la suppression d’un nœud frère sous celui-ci, qui
met à jour ses compteurs d’enfants réparés — pourrait être rejouée différemment. Les entrées qui n’examinent que l’existence,
la version ou les identifiants de modification du parent, comme un Check, un CheckNotExists, un CheckStat qui ne compare ni numChildren ni cversion,
un Set ou SetACL qui réécrit uniquement les données ou l’ACL propres au parent, ou encore
les watches de données, d’enfants et d’existence qu’un client réenregistre après une reconnexion, ne sont pas concernées et ne bloquent
pas la récupération ; les watches persistants réenregistrés par un client ne consultent jamais l’arbre et ne la bloquent donc jamais.
Les nœuds situés plus haut dans la chaîne ne sont pas
concernés : ils conservent exactement les mêmes données, version et enfants que sur un pair sain, de sorte qu’une entrée qui
ne modifie qu’un tel nœud est rejouée à l’identique et ne bloque pas la récupération. Font exception les entrées qui
parcourent l’intégralité du sous-arbre situé sous leur path, comme une suppression récursive ou une énumération récursive : celles-ci
voient bel et bien les nœuds supprimés et entrent en conflict quelle que soit la hauteur, sauf si Keeper rejette la requête avant d’examiner
l’arbre (par exemple, une suppression récursive de /). Il en va de même pour une fermeture de session
(Close) en fin de journal lorsque cette session possédait un nœud éphémère supprimé, ou possède un nœud éphémère subsistant
directement sous un tel parent : la fermeture de la session supprime ses nœuds éphémères et met à jour les compteurs de leurs
parents. Rejouer une telle entrée sur
l’arbre réparé produirait silencieusement un état différent. Dans ce cas, récupérez plutôt le nœud à partir d’un pair
sain : arrêtez-le, videz son répertoire de coordination et laissez-le se resynchroniser depuis le leader, ou appliquez
la stratégie 1 ou 2.