Aller au contenu
EuroVPSEuroVPS

Ne redémarrez jamais un mystère : quoi capturer avant un redémarrage

Un redémarrage nettoie le symptôme et, avec lui, les preuves. Sur un système à état, les cinq minutes passées à capturer l'état avant décident si les données survivent.

Par EuroVPS EngineeringLa salle des machines

6 min de lecture
Dans cet article 6 sections
En bref
  • Redémarrer un service sans état est une correction. Redémarrer un service à état avant que la cause soit connue est une expérience menée sur vos données, et un arrêt non propre est le mécanisme par lequel certains moteurs de tables se corrompent.
  • Un reboot efface l'état des processus, les propriétaires des sockets, le ring buffer du noyau et la distinction entre un crash et un démarrage raté. Capturez-les d'abord. Cela prend quelques minutes.
  • Snapshot avant réparation, réparation avant restauration, et vérification à la frontière qui a échoué plutôt qu'à « le service est en ligne ».

Là où le réflexe est juste, et là où il ne l'est pas

Éteindre et rallumer fonctionne sur un worker web bloqué, un consommateur de file coincé, un ordinateur portable. L'état qui était faux est jeté et reconstruit à partir de rien, parce que rien de valeur n'y vivait. Les bases de données, les brokers de messages, les démons de stockage et tout ce qui a un write-ahead log sont le cas inverse. L'état est le produit. Un redémarrage ne jette pas le mauvais état. Il jette l'information sur la façon dont il est devenu mauvais, et sur certains moteurs il ajoute ses propres dégâts.

Ce qu'un redémarrage efface

La table des processus et ses horodatages : quel processus tourne depuis quand, lequel est en sommeil ininterruptible et sur quoi. Le propriétaire de chaque socket ouvert et de chaque descripteur de fichier, qui vous dit qui tenait le verrou ou le port. Le ring buffer du noyau, qui sur une installation par défaut ne survit pas à un reboot et où un out-of-memory kill, une erreur de système de fichiers ou un disque défaillant s'annonce. Le contenu mémoire du service, qu'un core dump peut préserver et qu'un redémarrage ne peut pas. La chronologie d'arrêt et de démarrage qui distingue un crash d'un démarrage raté. Et sur un moteur de tables sans crash recovery, l'arrêt non propre lui-même est la façon dont un en-tête d'index s'abîme, de sorte que le redémarrage censé réparer le service peut être l'événement qui corrompt les tables.

Le kit de preuves, en quelques minutes

Tout ce qui suit est en lecture seule. Lancez-le depuis un shell sur la machine, redirigez la sortie vers un fichier horodaté, et copiez ce fichier hors de la machine avant que quiconque touche à autre chose.

TERMINAL
$ uptime; last -x | head -20; journalctl --list-boots | tail -3
$ dmesg -T | tail -200
$ ps -eo pid,ppid,stat,etime,wchan:24,cmd --sort=-etime | head -60
$ ss -tnp state established | head -100
$ free -m; df -h; df -i
$ vmstat 1 5
$ top -b -n 1 | head -40

Pour une base de données, ajoutez la vue que le moteur a de lui-même tant qu'il répond encore, et la fin de son journal d'erreurs qu'il réponde ou non.

TERMINAL
mysql> SHOW FULL PROCESSLIST;
mysql> SHOW ENGINE INNODB STATUS\G
mysql> SHOW GLOBAL STATUS LIKE 'Threads_%';
$ tail -500 /var/log/mariadb/mariadb.log

Le premier bloc répond à : la machine a-t-elle déjà redémarré, le noyau a-t-il tué quelque chose, qu'est-ce qui est bloqué et sur quoi, qui tient quelle connexion, et la machine est-elle sous pression mémoire ou I/O. Le second répond à ce que la base pense qu'il se passe : une longue transaction qui tient des verrous, un thread de réplication arrêté, un deadlock, une table signalée comme crashed.

Crash, ou démarrage raté

La distinction la plus utile dans le journal est celle entre un service qui a planté et un service qui s'est arrêté proprement puis n'a pas réussi à revenir. Le premier exige que le déclencheur soit trouvé avant tout redémarrage, parce que redémarrer dans un déclencheur encore actif reproduit le crash. Le second est un problème de démarrage ou de politique : une configuration modifiée, un disque plein, une permission, une unit qui n'était pas activée. Les données ne sont pas en danger dans le second cas, et le traiter comme un crash gaspille le temps qui aurait ramené le service. La fin du journal du service montre de quel cas il s'agit : une ligne d'arrêt terminé suivie d'un abort au démarrage est le second cas.

Le chemin réversible

Une fois le déclencheur connu, la séquence est la même sur tout système à état. Arrêtez le déclencheur, pour que la correction ne puisse pas être défaite par un autre crash en pleine reprise. Prenez le snapshot gratuit : arrêtez les écritures, renommez le répertoire de données à côté ou prenez un snapshot du volume, et gardez une copie hors de la machine. À partir de là, chaque étape peut être inversée. Réparez avant de restaurer, parce qu'une sauvegarde transporte fidèlement ce que le système transportait au moment où elle a été prise, et si le défaut est entré avec les données, la restauration le replante tout en jetant tout ce qui a été écrit depuis. Vérifiez à la frontière qui a échoué : la requête qui a avorté, la table qui a signalé zéro ligne, la position de réplication, pas simplement le fait que le port est ouvert. Déployez le tuning prévu seulement une fois le patient en bonne santé. Reprise et changement sont deux opérations différentes.

Le réflexeCe qui se passe vraiment
Redémarrer le serviceAvec le déclencheur encore actif il plante de nouveau, et le second arrêt est aussi peu propre que le premier
Restaurer la sauvegarde d'hier soirTout ce qui a été écrit depuis hier soir est perdu, et un défaut entré avec les données est restauré avec elles
Ajouter de la mémoire, ça ressemble à de la mémoireSi l'abort est un logiciel qui parcourt des métadonnées abîmées, le matériel ne change rien
Ça a planté, donc quelque chose est casséUn arrêt propre suivi d'un démarrage raté est un problème de redémarrage sans risque pour les données

Un nombre de lignes tombé à zéro après un reboot brutal est en général un index abîmé au-dessus de lignes intactes. Sur les moteurs sans crash recovery, une réparation reconstruit l'index à partir des données. Une restauration jette les données.

Le remède, distinct de la reprise

Une réparation est une reprise. Le remède, c'est retirer ce qui provoque des arrêts non propres, et convertir les tables qui n'en supportent pas un seul vers un moteur qui le supporte. Les deux relèvent du suivi, pas de la lutte contre l'incendie.

Réponses directes

Dois-je redémarrer ma base de données qui a planté ?+

Pas avant que le journal vous ait dit si elle a planté ou n'a pas réussi à démarrer, et quel était le déclencheur. Redémarrer dans un déclencheur actif reproduit le crash et, sur un moteur qui ne résiste pas aux crashs, peut abîmer des tables. Capturez en lecture seule d'abord, puis décidez.

Ma table affiche zéro ligne après un crash. Les données sont-elles perdues ?+

Souvent non. Sur les moteurs de tables sans crash recovery, un arrêt non propre abîme l'en-tête d'index pendant que les lignes restent sur le disque, et le moteur rapporte le compte depuis l'en-tête. Prenez un snapshot du répertoire de données, puis lancez la réparation du moteur. Une réparation reconstruit typiquement l'index à partir des lignes encore présentes. Ne restaurez que si la réparation échoue.

Restaurer depuis la sauvegarde est-il la reprise la plus sûre ?+

C'est en général la plus destructrice. Tout ce qui a été écrit depuis la sauvegarde est jeté, et si le défaut était déjà dans les données quand la sauvegarde a tourné, il revient avec elle. La restauration est la dernière étape, après le diagnostic et la réparation.

Que faut-il capturer avant que quiconque redémarre quoi que ce soit ?+

La table des processus avec les horodatages, les propriétaires des sockets ouverts, le ring buffer du noyau, la pression mémoire et I/O, l'usage disque et inodes, l'historique des démarrages, et l'état et le journal d'erreurs du service lui-même. Écrits dans un fichier et copiés hors de la machine. Cela prend quelques minutes, et c'est la seule copie de ces preuves que vous aurez.

En panne en ce moment, le doigt sur le bouton de redémarrage ?

Parlez à un ingénieur. Nous diagnostiquons en lecture seule d'abord et prenons un snapshot avant tout ce qui écrit.

Parler à un ingénieur

Vous êtes arrivé à la fin.

Mettez la lecture en pratique

Que faites-vous tourner ?

Parlez-nous de la charge de travail, du trafic et des exigences de reprise. Commencez par le configurateur de serveur, ou passez en revue les détails avec un ingénieur.

Écrit par les ingénieurs qui construisent et exploitent l'infrastructure qu'il décrit.
Parler à un ingénieur
XIn

6 min restantes