Kein Neustart für ein Rätsel: was Sie vor einem Restart sichern sollten
Ein Neustart beseitigt das Symptom und mit ihm die Beweise. Auf einem zustandsbehafteten System entscheiden die fünf Minuten, die vorher in die Sicherung des Zustands fließen, darüber, ob die Daten überleben.
In diesem Artikel 6 Abschnitte
- Der Neustart eines zustandslosen Dienstes ist eine Reparatur. Der Neustart eines zustandsbehafteten Dienstes, bevor die Ursache bekannt ist, ist ein Experiment auf Ihren Daten, und ein unsauberer Stopp ist der Mechanismus, durch den manche Table Engines korrumpieren.
- Ein Reboot löscht den Prozesszustand, die Socket-Inhaber, den Ring Buffer des Kernels und den Unterschied zwischen einem Crash und einem fehlgeschlagenen Start. Sichern Sie das zuerst, es dauert Minuten.
- Snapshot vor der Reparatur, Reparatur vor dem Restore, und Verifikation an der Grenze, die versagt hat, statt bei «der Dienst läuft».
Wo der Reflex richtig ist, und wo nicht
Aus- und wieder einschalten funktioniert bei einem festgefahrenen Web-Worker, einem hängenden Queue-Consumer, einem Laptop. Der Zustand, der falsch war, wird verworfen und von Grund auf neu aufgebaut, weil nichts von Wert darin lebte. Datenbanken, Message Broker, Storage-Daemons und alles mit einem Write-Ahead-Log sind der gegenteilige Fall. Der Zustand ist das Produkt. Ein Neustart verwirft nicht den schlechten Zustand. Er verwirft die Information darüber, wie er schlecht wurde, und auf manchen Engines fügt er eigenen Schaden hinzu.
Was ein Neustart löscht
Die Prozesstabelle und ihre Zeiten: welcher Prozess seit wann läuft, welcher sich in einem Uninterruptible Sleep befindet und worauf. Den Inhaber jedes offenen Sockets und File Handles, der Ihnen sagt, wer den Lock oder den Port gehalten hat. Den Ring Buffer des Kernels, der auf einer Standardinstallation einen Reboot nicht überlebt und der Ort ist, an dem sich ein Out-of-Memory-Kill, ein Dateisystemfehler oder eine sterbende Platte ankündigt. Den Speicherinhalt des Dienstes, den ein Core Dump bewahren kann und ein Neustart nicht. Die Zeitlinie von Shutdown und Boot, die einen Crash von einem fehlgeschlagenen Start unterscheidet. Und auf einer Table Engine ohne Crash Recovery ist der unsaubere Stopp selbst der Weg, auf dem ein Index-Header beschädigt wird, sodass der Neustart, der den Dienst reparieren sollte, das Ereignis sein kann, das die Tabellen korrumpiert.
Das Beweismittel-Kit, in Minuten
Alles unten ist read-only. Führen Sie es aus einer Shell auf der Maschine aus, leiten Sie die Ausgabe in eine Datei mit Zeitstempel um, und kopieren Sie diese Datei von der Maschine herunter, bevor irgendjemand etwas anderes anfasst.
$ 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 -40Bei einer Datenbank kommt die Sicht der Engine auf sich selbst dazu, solange sie noch antwortet, und das Ende ihres Error-Logs, ob sie antwortet oder nicht.
mysql> SHOW FULL PROCESSLIST;
mysql> SHOW ENGINE INNODB STATUS\G
mysql> SHOW GLOBAL STATUS LIKE 'Threads_%';
$ tail -500 /var/log/mariadb/mariadb.logDer erste Block beantwortet, ob die Maschine bereits neu gestartet wurde, ob der Kernel etwas beendet hat, was hängt und worauf, wer welche Verbindung hält, und ob die Maschine unter Speicher- oder I/O-Druck steht. Der zweite beantwortet, was die Datenbank glaubt, was gerade passiert: eine lange Transaktion, die Locks hält, ein gestoppter Replikations-Thread, ein Deadlock, eine als crashed gemeldete Tabelle.
Crash, oder fehlgeschlagener Start
Die nützlichste Unterscheidung im Log ist die zwischen einem Dienst, der abgestürzt ist, und einem Dienst, der sauber heruntergefahren wurde und dann nicht wieder hochkam. Beim ersten muss der Auslöser gefunden werden, bevor irgendetwas neu gestartet wird, denn ein Neustart in einen lebenden Auslöser hinein reproduziert den Crash. Der zweite ist ein Start- oder Richtlinienproblem: eine geänderte Konfiguration, eine volle Platte, eine Berechtigung, ein Unit, das nicht aktiviert war. Im zweiten Fall sind die Daten nicht in Gefahr, und ihn wie einen Crash zu behandeln verschwendet die Zeit, die den Dienst zurückgebracht hätte. Das Ende des Dienst-Logs zeigt, welcher von beiden es ist: Eine Zeile «shutdown complete», gefolgt von einem Abbruch beim Start, ist der zweite Fall.
Der umkehrbare Weg
Sobald der Auslöser bekannt ist, ist die Reihenfolge auf jedem zustandsbehafteten System dieselbe. Stoppen Sie den Auslöser, damit die Reparatur nicht durch einen weiteren Crash mitten in der Wiederherstellung zunichtegemacht werden kann. Nehmen Sie den kostenlosen Snapshot: Schreibzugriffe stoppen, das Datenverzeichnis beiseite umbenennen oder das Volume snapshotten, und eine Kopie außerhalb der Maschine aufbewahren. Ab diesem Punkt lässt sich jeder Schritt rückgängig machen. Reparieren Sie, bevor Sie wiederherstellen, denn ein Backup trägt getreu das, was das System zum Zeitpunkt der Sicherung getragen hat, und wenn der Fehler mit den Daten hineingekommen ist, pflanzt der Restore ihn wieder ein und verwirft alles, was seitdem geschrieben wurde. Verifizieren Sie an der Grenze, die versagt hat: die Abfrage, die abgebrochen ist, die Tabelle, die null Zeilen gemeldet hat, die Replikationsposition, nicht nur, dass der Port offen ist. Spielen Sie das geplante Tuning erst ein, wenn der Patient gesund ist. Wiederherstellung und Änderung sind zwei verschiedene Eingriffe.
| Der Reflex | Was tatsächlich passiert |
|---|---|
| Den Dienst neu starten | Mit noch lebendem Auslöser stürzt er erneut ab, und der zweite Stopp ist so unsauber wie der erste |
| Vom Stand von gestern Abend wiederherstellen | Alles seit gestern Abend ist weg, und ein Fehler, der mit den Daten hineinkam, wird mit ihnen wiederhergestellt |
| Speicher nachrüsten, es sieht nach Speicher aus | Wenn der Abbruch Software ist, die über beschädigte Metadaten läuft, ändert Hardware nichts |
| Er ist abgestürzt, also ist etwas kaputt | Ein sauberer Shutdown, gefolgt von einem fehlgeschlagenen Start, ist ein Startproblem ohne Gefahr für die Daten |
Eine auf null gefallene Zeilenzahl nach einem harten Reboot ist meist ein beschädigter Index über intakten Zeilen. Auf Engines ohne Crash Recovery baut eine Reparatur den Index aus den Daten neu auf. Ein Restore wirft die Daten weg.
Die Heilung, im Unterschied zur Wiederherstellung
Eine Reparatur ist Wiederherstellung. Die Heilung besteht darin, das zu beseitigen, was unsaubere Stopps verursacht, und Tabellen, die keinen überstehen, auf eine Engine umzustellen, die es kann. Beides gehört in die Nachbereitung, nicht in die Brandbekämpfung.
Klare Antworten
Soll ich meine abgestürzte Datenbank neu starten?+
Nicht, bevor das Log Ihnen gesagt hat, ob sie abgestürzt ist oder nicht starten konnte, und was der Auslöser war. Ein Neustart in einen lebenden Auslöser hinein reproduziert den Crash und kann auf einer nicht crash-sicheren Engine Tabellen beschädigen. Erst read-only sichern, dann entscheiden.
Meine Tabelle zeigt nach einem Crash null Zeilen. Sind die Daten weg?+
Oft nicht. Auf Table Engines ohne Crash Recovery beschädigt ein unsauberer Stopp den Index-Header, während die Zeilen auf der Platte bleiben, und die Engine meldet die Zahl aus dem Header. Snapshotten Sie das Datenverzeichnis, dann führen Sie die Reparatur der Engine aus. Eine Reparatur baut den Index typischerweise aus den noch vorhandenen Zeilen neu auf. Wiederherstellen nur, wenn die Reparatur fehlschlägt.
Ist der Restore aus dem Backup die sicherste Wiederherstellung?+
Er ist meist die zerstörerischste. Alles, was seit dem Backup geschrieben wurde, wird verworfen, und wenn der Fehler schon in den Daten war, als das Backup lief, kommt er mit zurück. Der Restore ist der letzte Schritt nach Diagnose und Reparatur.
Was sollte gesichert werden, bevor jemand irgendetwas neu startet?+
Die Prozesstabelle mit Zeiten, die Inhaber der offenen Sockets, der Ring Buffer des Kernels, Speicher- und I/O-Druck, Platten- und Inode-Belegung, die Boot-Historie sowie Status und Error-Log des Dienstes selbst. In eine Datei geschrieben und von der Maschine herunterkopiert. Es dauert Minuten, und es ist die einzige Kopie dieser Beweise, die Sie haben werden.
Gerade down, mit dem Finger auf dem Neustart-Knopf?
Sprechen Sie mit einem Ingenieur. Wir diagnostizieren zuerst read-only und snapshotten, bevor irgendetwas schreibt.
Mit einem Ingenieur sprechenSie haben das Ende erreicht.
Setzen Sie das Gelesene um
Was betreiben Sie?
Erzählen Sie uns von Workload, Traffic und Anforderungen an die Wiederherstellung. Beginnen Sie mit dem Server-Konfigurator oder besprechen Sie die Details mit einem Ingenieur.
Geschrieben von den Ingenieuren, die die beschriebene Infrastruktur bauen und betreiben.Mit einem Ingenieur sprechen
