ZFS-Pool ausgestiegen - Pool im laufenden Betrieb wieder importieren

17.09.2017
Bild

Vor kurzem sind mir doch tatsächlich 2 SSDs von einem ZFS-Pool in TrueNAS nacheinander ausgestiegen. Dies führt dann natürlich zu einem einfrieren der jeweiligen Dateien und auch teilweise der Dienste, da keinerlei Schreibvorgänge mehr auf dem Pool ausgeführt werden sowie nur noch Daten im ARC-Cache gelesen werden können.

Da in dieser Zeit relativ viele Dinge auf dem Server liefen wollte ich es vermeiden, die Maschine völlig neu zu starten, also suchte ich nach einer Lösung, den Pool wieder zu funktionstüchtig zu machen, ohne einen Neustart durchführen zu müssen.

Die hier beschriebene Vorgehensweise wurde mit TrueNAS SCALE Cobia durchgeführt, müsste aber auf Ubuntu bzw. einer anderen Linux-Distribution auch nativ so funktionieren.

Achtung: Wir "operieren" hier definitiv direkt am Herzen von ZFS, die Sicherheits-Funktionen, welche im Normalfall bei ZFS einschreiten müssen wir teilweise kurzfristig umgehen, was auch zu Datenverlust führen kann.  Ein Backup der Daten ist unerlässlich!

In meinem Fall waren beide Geräte des RAID-Z1-Pools mit zu vielen Fehlern ausgestiegen. Teilweise Prüfsummen-Fehler, teilweise Lese/Schreibfehler.

Ein "normales" zurücksetzen der Fehler und bereinigen des Zustandes mit 

zpool clear <POOLNAME>

funktionierte daher nicht.

Es ist in ZFS auch möglich, einem Pool offline zu nehmen. Aber auch dieser Versuch mittels

zpool offline <POOLNAME> 

sowie

zpool online <POOLNAME>

war nicht von Erfolg gekrönt.

Also entfernte ich beide SSDs physikalisch aus dem System (glücklicherweise alles Hot-Swap) und schob diese wieder in den Schacht, damit diese wieder neu vom System erkannt werden.

Der Aufruf von

zpool status

brachte zeigte den Pool nun als "offline" an. Nun versuchte ich, den Pool wieder mittels

zpool online <POOLNAME>

online zu nehmen, was allerdings nicht funktionierte. Es wurde die Fehlermeldung ausgegeben, der Pool hätte nicht korrigierbare Fehler.

Nun kommt der gefährliche Teil: Wir müssen, damit der Pool ohne Neustart wieder korrekt funktioniert, diesen wieder einen "fehlerfreien" Zustand zuweisen. Hierzu gibt es einige Befehlszeilenparameter, welche teilweise dokumentiert sind, teilweise auch weniger. Im Prinzip setzt dies den Fehlerzähler für jegliche I/O-Fehler sowie Prüfsummenfehler vollständig zurück:

zpool clear -nFX <POOLNAME>

Der Pool wird aber hierdurch nicht automatisch wieder im System online genommen, dies müssen wir nun noch manuell machen:

zpool online <POOLNAME>

Nun wurde der Pool wieder als online gelistet.

Allerdings hingen einige Dienste noch und auch das Kubernetes-System von TrueNAS war auf dem ausgestiegenen Pool gespeichert bzw. die Docker-Nutzdaten wie z.B. Konfigurationsdateien.

Hierzu müssen wir nun die Middleware von TrueNAS mit dem Befehl

service middlewared restart

neu starten. Dies kann unter Umständen einige Minuten dauern. Hierdurch werden auch alle anderen Dienste, wie SMB oder NFS neu gestartet, welche evtl. durch den fehlerhaften Pool eingefroren sind bzw. nicht mehr richtig funktionierten.

Nun sollte nach einigen Minuten auch Kubernetes wieder funktionieren. In meinem Fall wurden automatisch alle Container bzw. Pods neu erstellt, was kurzfristig zu einer erhöhten Systemlast geführt hat.

Der betroffene Pool sollte nun schnellstmöglich mit dem Befehl

zpool scrub <POOLNAME>

einem Scrub unterzogen werden, um Hardware-Fehler zumindest teilweise ausschließen zu können. Sollten hier erneut I/O-Fehler auftreten, ist entweder die SSD selbst defekt oder der HBA-Controller. 

Es kann sich aber auch um ein langsam sterbendes Netzteil handeln, welches unter Spitzenlast nicht mehr genug Strom liefert und somit die SSDs für einen kurzen Zeitraum nicht mehr aktiv sind.


 

Feedback, Verbesserungsvorschläge, weitere Ideen?

Einfach das Kontaktformular verwenden oder direkt eine E-Mail an info@kirgus.net.