Wenn Sie mit zfs copies=2
ein 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)
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.copies=1
getan haben und auf die Sie es aufgerüstet habencopies=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.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 wirdio_vd
auf 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: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!
quelle
@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.
quelle