Wie kann ich das Raid des BTRFS-Dateisystems auf Fehler überwachen?

11

Ich habe eine Dokumentation zu einem Daemon gesehen, der ein Programm / Skript für verschiedene BTRFS-Ereignisse ausführen kann, aber ich kann sie nicht mehr finden.

Wie kann ich ein Skript / Programm bei einem Laufwerksfehler für ein BTRFS-RAID1-Array ausführen lassen? Ich möchte bei jedem Fehler ein Skript ausführen, um als Frühwarnung für ein möglicherweise fehlerhaftes Laufwerk zu fungieren, aber der tatsächliche Laufwerksfehler ist am wichtigsten. Ich möchte das Dateisystem an diesem Punkt aushängen (wenn BTRFS dies sowieso nicht tut) und einen Alarm einstellen.

Ioan
quelle
1
Warum sollte das System raid1 bei einem Laufwerksausfall aushängen? Diese Art schlägt den Zweck, nicht wahr? Ich meine, Sie haben vielleicht einen Grund dafür, aber standardmäßig sollte es das nicht tun
Petr
Ich hatte ein RAID5, bei dem zwei Laufwerke in kurzer Zeit ausfallen. Ich wollte ein neues System mit der Mirror Raid-Funktion von BTRFS einrichten und schnell auf Laufwerksprobleme (nicht unbedingt Laufwerksausfälle) reagieren, um das Risiko weiterer Schäden zu verringern und gleichzeitig Zeit für die Behebung der ursprünglichen Ursache zu schaffen. Ich hoffe, dass der N-Wege-Spiegel von BTRFS eines Tages gut funktioniert.
Ioan
@Ioan: Aus diesem Grund wird RAID-5 nicht immer empfohlen und stattdessen sollte RAID-6 verwendet werden. Ein Resilver belastet alle Laufwerke stark, was dazu führen kann, dass ein zweites Laufwerk, das möglicherweise ausfällt, während dieses Vorgangs ausfällt. Im Gegensatz zu RAID-5 kann RAID-6 dies verarbeiten (Sie können es auch schreibgeschützt erneut bereitstellen und Ihr Backup aktualisieren, bevor Sie das zweite Laufwerk austauschen).
basic6

Antworten:

18

Zusätzlich zum regulären Protokollierungssystem verfügt BTRFS über einen Statistikbefehl , der Fehler (einschließlich Lese-, Schreib- und Korruptions- / Prüfsummenfehler) pro Laufwerk verfolgt:

# btrfs device stats /
[/dev/mapper/luks-123].write_io_errs   0
[/dev/mapper/luks-123].read_io_errs    0
[/dev/mapper/luks-123].flush_io_errs   0
[/dev/mapper/luks-123].corruption_errs 0
[/dev/mapper/luks-123].generation_errs 0

So können Sie einen einfachen Root-Cronjob erstellen:

[email protected]
@hourly /sbin/btrfs device stats /data | grep -vE ' 0$'

Dadurch wird stündlich nach positiven Fehlern gesucht und Ihnen eine E-Mail gesendet. Natürlich würden Sie ein solches Szenario testen (z. B. indem Sie eine Beschädigung verursachen oder das grep entfernen), um zu überprüfen, ob die E-Mail-Benachrichtigung funktioniert.

Darüber hinaus wird bei erweiterten Dateisystemen wie BTRFS (mit Prüfsummen) häufig empfohlen, alle paar Wochen ein Scrub zu planen, um eine stille Beschädigung durch ein fehlerhaftes Laufwerk zu erkennen.

@monthly /sbin/btrfs scrub start -Bq /data

Die -BOption hält das Peeling im Vordergrund, sodass Sie die Ergebnisse in der E-Mail sehen, die cron Ihnen sendet. Andernfalls wird es im Hintergrund ausgeführt und Sie müssen daran denken, die Ergebnisse manuell zu überprüfen, da sie nicht in der E-Mail enthalten sind.

Update : Verbessertes grep wie von Michael Kjörling vorgeschlagen, danke.

Update 2 : Zusätzliche Hinweise zum Scrubben im Vergleich zu regulären Lesevorgängen (dies gilt nicht nur für BTRFS):
Wie Ioan betont hat, kann ein Scrub je nach Größe und Typ des Arrays (und anderen Faktoren) viele Stunden dauern, in einigen Fällen sogar mehr als einen Tag. Und es ist ein aktiver Scan, der zukünftige Fehler nicht erkennt. Ziel eines Scrubs ist es, zu diesem Zeitpunkt Fehler auf Ihren Laufwerken zu finden und zu beheben. Wie bei anderen RAID-Systemen wird jedoch empfohlen, regelmäßige Scrubs zu planen. Es ist wahr, dass eine typische E / A-Operation wie das Lesen einer Datei prüft, ob die gelesenen Daten tatsächlich korrekt sind. Betrachten Sie jedoch einen einfachen Spiegel: Wenn die erste Kopie der Datei beschädigt ist, möglicherweise durch ein Laufwerk, das kurz vor dem Absterben steht, die zweite Kopie, die korrekt ist, tatsächlich von BTRFS gelesen wird, weiß BTRFS nicht, dass eine Beschädigung vorliegt auf einem der Laufwerke. Dies liegt einfach daran, dass die angeforderten Daten empfangen wurden.Dies bedeutet, dass selbst wenn Sie speziell eine Datei lesen, von der Sie wissen, dass sie auf einem Laufwerk beschädigt ist, keine Garantie dafür besteht, dass die Beschädigung durch diesen Lesevorgang erkannt wird.
Nehmen wir nun an, dass BTRFS immer nur vom guten Laufwerk liest, kein Scrub ausgeführt wird, das den Schaden auf dem fehlerhaften Laufwerk erkennt, und dann wird auch das gute Laufwerk fehlerhaft - das Ergebnis wäre ein Datenverlust (zumindest würde BTRFS dies wissen Welche Dateien sind noch korrekt und können noch gelesen werden? Dies ist natürlich ein vereinfachtes Beispiel. In der Realität liest BTRFS nicht immer von einem Laufwerk und ignoriert das andere.
Der Punkt ist jedoch, dass regelmäßige Scrubs wichtig sind, da sie Fehler finden (und beheben), die bei regulären Lesevorgängen nicht unbedingt erkannt werden.

Fehlerhafte Laufwerke : Da diese Frage sehr beliebt ist, möchte ich darauf hinweisen, dass diese "Überwachungslösung" dazu dient, Probleme mit möglicherweise fehlerhaften Laufwerken zu erkennen (z. B. aussterbende Laufwerke, die Fehler verursachen, aber immer noch zugänglich sind).

Wenn andererseits ein Laufwerk plötzlich ausfällt (getrennt oder vollständig tot, anstatt zu sterben und Fehler zu erzeugen), handelt es sich um ein fehlerhaftes Laufwerk (ZFS würde ein solches Laufwerk als FEHLERHAFT markieren). Leider kann BTRFS nicht erkennen, dass ein Laufwerk während des Bereitstellens des Dateisystems nicht mehr vorhanden ist, wie in diesem Mailinglisteneintrag vom 09.09.15 angegeben (möglicherweise wurde dies gepatcht):

Der Unterschied besteht darin, dass wir Code haben, um ein Gerät zu erkennen, das beim Mounten nicht vorhanden ist. Wir haben (noch) keinen Code, um zu erkennen, dass es auf einem gemounteten Dateisystem abgelegt wird. Ich habe keine Ahnung, warum die ordnungsgemäße Erkennung eines verschwundenen Geräts keine Priorität zu haben scheint. Ich habe keine Ahnung, aber das ist ein vom Mount-Verhalten getrenntes Problem.

https://www.mail-archive.com/[email protected]/msg46598.html

Zu diesem Zeitpunkt würde es in dmesg Unmengen von Fehlermeldungen geben, sodass das Greppen von dmesg möglicherweise nicht zuverlässig ist.
Für einen Server, der BTRFS verwendet, kann es sinnvoll sein, eine benutzerdefinierte Prüfung (Cron-Job) durchzuführen, die eine Warnung sendet, wenn mindestens eines der Laufwerke im RAID-Array nicht mehr verfügbar ist, dh nicht mehr verfügbar ist.

basic6
quelle
1
Wäre etwas grep -vE ' 0$'nicht besser?
Ein CVn
@ MichaelKjörling: Gute Idee, ich habe meine Antwort aktualisiert, danke!
basic6
Dies ist eine gute Idee, und ich mache sie als regelmäßige Integritätsprüfung. Die Prüfsumme aller Daten kann jedoch viel länger als eine Stunde dauern. Ganz zu schweigen vom Verschleiß der Hardware, wenn diese kontinuierlich ausgeführt wird, um die Fehler zu beheben. BTRFS führt eine Prüfsumme aller normalen Dateisystemvorgänge durch, und dies wäre eine effizientere Möglichkeit, sofort darauf zu reagieren.
Ioan
@loan: Sie haben Recht, ein Scrub kann viele Stunden lang ausgeführt werden, was die Laufwerke offensichtlich stark belastet. Es wird jedoch eine stille Beschädigung erkannt, sodass Sie ein fehlerhaftes Laufwerk ersetzen können, bevor ein anderes fehlerhaft wird. Während des normalen fs-Betriebs tritt keine stille Beschädigung auf, sodass Sie nicht automatisch informiert werden.
basic6
@ basic6: Absolut, und das ist großartig dafür. Es erkennt jedoch bis zum nächsten Scrub keine Fehler während des normalen Betriebs, z. B. ein verschlechtertes BTRFS-Array. Stille Korruption kann aus Effizienzgründen mit einem monatlichen Peeling behoben werden, aber das ist für andere Fehler zu lang.
Ioan
4

Ab btrfs-progs v4.11.1 hat stats die Option --check, die einen Wert ungleich Null zurückgibt, wenn einer der Werte nicht Null ist, wodurch der reguläre Ausdruck entfällt.

Gerätestatistiken -c /

Nick Mayer
quelle
3

Ich würde mich bei der Fehlerbenachrichtigung nicht auf den Befehl stats verlassen, da dieser Befehl keinen Fehler zurückgibt, wenn ein Laufwerk plötzlich ausfällt. Sie können es testen, indem Sie ein SATA-Kabel abziehen oder ein Laufwerk ziehen - dies wird bei einem wichtigen Dateisystem nicht empfohlen.

btrfs device stats /

Nach einem Neustart zeigt btrfs fehlende Laufwerke an, dies kann jedoch zu spät sein.

btrfs fi show
Charles Young
quelle
2

Es scheint keinen Daemon oder Dienstprogramm zu geben, das BTRFS-Ereignisse offiziell für die Benutzerbehandlung meldet. Die nächste Alternative besteht darin, das Systemprotokoll auf Nachrichten von BTRFS zu überwachen und entsprechend zu reagieren.

http://marc.merlins.org/perso/btrfs/post_2014-03-19_Btrfs-Tips_-Btrfs-Scrub-and-Btrfs-Filesystem-Repair.html

Der obige Link enthält weitere Details zum Konfigurieren eines Skripts ( secPaket unter Debian oder SEC ), das für die allgemeine Protokollüberwachung entwickelt wurde, um auf unerwartete Protokollnachrichten in Bezug auf BTRFS zu reagieren. Es hängt auch von einem regelmäßig geplanten Scrub des Dateisystems ab, um nach Bit-Rot zu suchen und Protokolleinträge als vorbeugende Maßnahme auszugeben. Unten finden Sie einen Auszug speziell für das SEC-Skript:

So konfigurieren Sie sec, event korrelator, um Fehler oder Warnungen des btrfs-Dateisystems zu melden

Installieren Sie nach der Installation von sec.pl (apt-get install sec auf debian oder http://simple-evcorr.sourceforge.net/ ) die beiden folgenden Konfigurationsdateien.

Dies ist nicht kinderleicht, sondern basiert auf einer Regex bekannter Nachrichten, die in Ordnung sind, und meldet alle unbekannten Nachrichten. Sie können den zukunftsgerichteten negativen regulären Ausdruck nach Bedarf erweitern.

polgara:~\# cat /etc/default/sec  
\#Defaults for sec  
RUN_DAEMON="yes"  
DAEMON_ARGS="-conf=/etc/sec.conf -input=/var/log/syslog -pid=/var/run/sec.pid -detach -log=/var/log/sec.log"

polgara:~# cat /etc/sec.conf  
\# http://simple-evcorr.sourceforge.net/man.html  
\# http://sixshooter.v6.thrupoint.net/SEC-examples/article.html  
\# http://sixshooter.v6.thrupoint.net/SEC-examples/article-part2.html  
type=SingleWithSuppress  
ptype=RegExp  
pattern=(?i)kernel.*btrfs: (?!disk space caching is enabled|use ssd allocation|use .* compression|unlinked .* orphans|turning on discard|device label .* devid .* transid|detected SSD devices, enabling SSD mode|has skinny extents|device label|creating UUID tree|checking UUID tree|setting .* feature flag|bdev.* flush 0, corrupt 0, gen 0)  
window=60  
desc=Btrfs unexpected log  
action=pipe '%t: $0' /usr/bin/mail -s "sec: %s" root
Ioan
quelle
1

Klingt nach einer Aufgabe zur Systemüberwachung. Es gibt eine Prüfung, die die Nagios-Plugin-API implementiert: check_btrfs . Wie Sie im Quellcode sehen können, hat es eine Funktion namens, check_dev_statsdie nach Gerätestatistiken sucht und kritisch wird, wenn einer der Werte ungleich Null ist. Es wird auch nach Zuordnungsproblemen gesucht. Unklar bleibt, wie sich die Prüfung verhält, wenn eine Festplatte fehlt oder offline geht .

PS: Das Plugin ist in Debian gepackt: Monitoring-Plugins-btrfs

ypid
quelle