ZFS: Wie können Sie die korrekte Anzahl von Kopien wiederherstellen, nachdem Sie ein Laufwerk verloren haben?

12

Wenn Sie mit zfs copies=2ein Laufwerk mit einigen dieser Kopien haben und dann verlieren, wie können Sie dem System mitteilen, dass es eine neue Kopie der Datenblöcke für die betroffenen Dateien erstellen soll? Oder fängt zfs einfach an, Datenblöcke für die zusätzlichen Kopien hinzuzufügen, sobald es von fehlerhaften Datenblöcken erfährt?

Wird Peeling dies tun?

(v0.6.0.56-rc8, ZFS-Pool Version 28, ZFS-Dateisystem Version 5, Ubuntu 11.10)

James Moore
quelle

Antworten:

10

"copy = 2" (oder 3) ist eher für die Verwendung mit Pools ohne Redundanz (Single Disk oder Stripes) vorgesehen. Das Ziel ist es, kleinere Festplattenschäden und nicht einen Geräteausfall zu beheben. Im letzteren Fall ist der Pool nicht montierbar, sodass keine Blockwiederherstellung erfolgen kann.

Wenn Sie über Redundanz verfügen (Mirroring / Raidz / Raidz2 / Raidz3), unterscheiden sich die Ditto-Blöcke nicht von den anderen, und Scrubbing / Resilvering erstellt sie neu.

jlliagre
quelle
Dies steht in direktem Konflikt mit dem, was @ Redmumba sagt - und Redmumba bietet Links zu Code. Können Sie einige Quellen für das anführen, was Sie sagen? Insbesondere würde ich gerne gute Zitate darüber sehen, warum Kopien = N Ihrer Meinung nach nicht mit dem Ausfall des gesamten Geräts fertig werden - das stimmt nicht mit dem überein, was ich gelesen habe.
James Moore
1
@James Moore Nach einem Geräteausfall werden keine weiteren Blöcke auf diese Festplatte geschrieben. Auf Poolebene gibt es keine Redundanz, sodass die fehlerhafte Festplatte nicht durch eine neue ersetzt werden kann. Die einzige Methode, um diese Situation ordnungsgemäß wiederherzustellen, besteht darin, eine vollständige Sicherung des Pools durchzuführen, ihn mit fehlerfreien Geräten neu zu erstellen und von der Sicherung wiederherzustellen, wobei sichergestellt werden muss, dass kein unbeabsichtigter Neustart erfolgt, bevor die erste Sicherung durchgeführt wird. Andernfalls kann der Pool möglicherweise nicht importiert werden und die Daten gehen verloren. Dies ist eine ziemliche Belastung im Vergleich zu redundanten Pools, bei denen die Wiederherstellung einer fehlerhaften Festplatte online erfolgt und Neustarts überleben.
Jlliagre
1
Hier ist eine Referenz: docs.oracle.com/cd/E19082-01/817-2271/gbbvf/… For a device to be replaced, the pool must be in the ONLINE state. The device must be part of a redundant configuration, or it must be healthy (in the ONLINE state). Ich gehe davon aus, dass Kopien = 2 oder 3 nicht als redundante Konfiguration angesehen werden.
Jlliagre
1
Eine Sache, die Sie beachten sollten, ist, dass Sie, wenn Sie es ursprünglich copies=1getan haben und auf die Sie es aufgerüstet haben copies=2, wahrscheinlich danach resilver / rescrubben möchten - wodurch diese Instanzen erstellt werden. Aber @jilliagre ist richtig: Dito-Blöcke bilden keine redundante Konfiguration. Es gibt keine Garantie dafür, dass die Blöcke auf einem anderen Gerät festgelegt sind, auch wenn sich mehrere Geräte in einem Pool befinden.
Andrew M.
1
Die Funktion "Kopien = N, wobei N> 1" soll keine Redundanz hinzufügen. Es soll die Beschädigung von Daten beheben. Alles, was an zfs geschrieben wird, wird mit einer Prüfsumme oder einem Hash versehen. Beim Zurücklesen wird die Prüfsumme / der Hash überprüft. Wenn N = 1, führt ein Fehler bei der Überprüfung der Prüfsumme / des Hashs zu einem Fehler bei der Rückgabe an die App. Wenn N> 1, kann eine der anderen Kopien konsultiert und zum Reparieren aller anderen Kopien verwendet werden.
Longneck
9

Ich fand diese Frage wirklich faszinierend und nachdem ich eine Stunde lang über die Dokumentation nachgedacht hatte, tauchte ich in den Code ein. Folgendes habe ich gefunden.

Zunächst einige Begriffe. Dito-Blöcke (das sind die Kopien im Gegensatz zu Spiegeln) werden beim Schreiben automatisch erstellt, befinden sich jedoch möglicherweise auf demselben virtuellen Gerät (vdev) wie die ursprüngliche Kopie. Andererseits werden gespiegelte Blöcke immer auf ein anderes virtuelles Gerät gespiegelt.

Der Code bezieht sich jedoch auf beide Arten von Blöcken als untergeordnete Elemente. Sie werden hier sehen , dass ditto-Blöcke nur Kinder sind io_vd == NULL(dies ist in der Schreibfunktion). Für einen gespiegelten Block wird io_vdauf das entsprechende virtuelle Gerät gesetzt (z. B. Ihre zweite Festplatte).

In diesem Sinne werden beim Lesen alle untergeordneten Elemente (Spiegel- oder Dito-Blöcke) als potenziell unsicher eingestuft, wenn sie nicht die erwarteten Elemente enthalten good_copies, und sie werden bei Bedarf neu geschrieben . Die Antwort auf Ihre Frage lautet also: Ja, sie wird neu geschrieben, wenn Sie mindestens eine gute Kopie haben, und eine der folgenden Angaben:

  • Unerwartete Fehler beim Versuch, die Daten zu lesen,
  • Sie versilbern oder
  • Sie schrubben.

Puh! Vielleicht kann jemand auf Fehler hinweisen, aber ich habe es genossen, durch diese kleine Übung etwas über ZFS zu lernen, und ich hoffe, das hilft!

Andrew M.
quelle
1
Das Problem liegt in der Antwort von @ jlliagre - der Pool ist tot, wenn er ein Gerät verliert. Die Tatsache, dass der Pool noch genügend Dito-Blöcke hat, scheint keine Rolle zu spielen. Irgendwie darum herum?
James Moore
4
@JamesMoore Sie können das Array online in einen herabgesetzten Zustand zwingen, wenn Sie die ersten 1 MB des Geräts haben, bei dem ein Fehler aufgetreten ist. Vermutlich benötigen Sie nur die Metadaten des ausgefallenen Geräts. Ich habe dies mit einem Zpool im JBOD-Stil getestet und es funktioniert: Raidz-defekte Labels wiederherstellen . Ich habe eine md5sum gemacht, bevor und nachdem ich den zpool kaputt gemacht habe, und nur das Dateisystem copy = 1 war nach dem Import kaputt. Die Dateisysteme copy = 2 und copy = 3 sind perfekt aufeinander abgestimmt.
Jodie C
2

@jlliagre und andere, die zu glauben scheinen, dass der gesamte zpool stirbt, wenn einer der Datenträger (vdevs) stirbt, der Pool jedoch nicht redundant ist (mirror / raidz). Das ist nicht wahr; Ein Pool mit mehreren Datenträgern übersteht immer einen vollständigen Ausfall eines einzelnen Datenträgers, auch wenn es sich nicht um einen Mirror oder ein Raidz handelt.

ZFS-Metadaten werden immer mindestens zweimal kopiert, sodass ein Totalausfall einer vollständigen Festplatte (oder eines Teils davon) das Dateisystem nicht beeinträchtigt. Darüber hinaus werden viele Dateien, insbesondere kleinere, nicht auf alle Datenträger verteilt und daher nicht unbedingt durch den Datenträgerfehler beeinträchtigt. Das OP fragt nach dem Fall eines Multi-Disk-Pools mit Dito-Blöcken (Nutzdatenkopien> 1). Hier wurde ein einziger vollständiger Festplattenausfall soll nie in beliebigem Datenverlust führen.ZFS versucht immer, ditto-Blöcke weit vom ursprünglichen Block entfernt zu platzieren. Bei Pools mit mehreren vdevs bedeutet dies immer auf einem anderen vdev (eine Ausnahme könnte sein, dass ein vdev> 50% des Pools ist, was sehr ungewöhnlich wäre). . Metadaten des Dateisystems werden immer +1 oder +2 mal mehr als die gleiche Ebene kopiert , sodass ein Festplattenfehler immer überlebt wird. Wenn Sie über einen Pool mit mehr als drei Datenträgern verfügen, sollten Sie in der Lage sein, bis zur Hälfte dieser Datenträger ohne Datenverlust zu verlieren. ZFS speichert die Ditto-Blöcke auf der nächsten Festplatte, so lange Sie nie zwei benachbarte Festplatten verlieren und keinen Datenverlust haben. (Fehler mit drei benachbarten Festplatten für ditto = 2).

Wenn es genügend Kopien von Daten gibt, um auf eine Datei zuzugreifen (unabhängig davon, ob diese Kopien von Blöcken, Spiegeln oder Raidz stammen), werden alle fehlenden Kopien von Daten repariert, wenn auf die Datei zugegriffen wird. Dies ist der Zweck des Peelings; Lesen Sie alle Daten und reparieren Sie alle fehlerhaften Daten, indem Sie redundante Kopien verwenden. Um die OP-Frage direkt zu beantworten, müssen Sie nach dem Ersetzen des ausgefallenen Laufwerks lediglich ein Scrub ausführen. Alle Kopien werden wiederhergestellt.

Wie immer können Sie leicht mit den Konzepten experimentieren, indem Sie Pools erstellen, deren vdevs für den Sicherungsspeicher nur normale, spärliche Dateien sind. Durch Löschen oder Beschädigen der vdev-Dateien können Sie jeden Fehlertyp simulieren und die Integrität des Pools, der Dateisysteme und der Daten auf diesem Weg überprüfen.

BEARBEITEN: Nach dem Experimentieren sieht es so aus, als würde ZFS den Pool nicht erreichen, wenn eine Festplatte in einem nicht redundanten Pool mit mehreren Festplatten mit Kopien> = 2 ausfällt. Die Beschädigung von Parital-Daten auf einer oder mehreren Festplatten sollte überlebensfähig bleiben und durch ein Peeling behoben werden.

Aaron B
quelle
Das Beängstigende an solchen Experimenten ist, dass sie mir sagen können, dass ein Setup sofort oder zumindest schnell fehlschlagen wird. Sie sind nicht so toll, wenn man mir sagt, dass ein Setup gelegentlich fehlschlägt. In jedem Fall ist nicht klar, wie Sie einen fehlerhaften Pool zurückholen. Ich habe versucht, einen Pool wie diesen mit drei Sparse-Dateien einzurichten, und das Entfernen einer der Sparse-Dateien scheint für den gesamten Pool fatal zu sein. zpool replace ersetzt die fehlgeschlagene Datei nicht, zpool scrub bleibt bei 5% stehen (und dies sind sehr kleine Pools), und die Fehlerseite unter illumos.org/msg/ZFS-8000-5E ist nicht optimistisch.
James Moore
Ich hatte ein ähnliches Ergebnis wie meine Experimente, die erst nach meiner Antwort durchgeführt wurden. Normalerweise benutze ich nur raidz und antwortete auf der Grundlage von Informationen aus glaubwürdigen Quellen (Orakel-Blogs). Ich glaube nicht mehr, dass ein JBOD-Pool mit mehreren Datenträgern und Kopien> 1 einen Datenträgerfehler überleben kann.
Aaron B