Ich kann keinen Weg finden, um mdadm mitzuteilen, dass er diesen Chunk reparieren soll.
Das liegt daran, dass md bei einer unbeaufsichtigten Datenbeschädigung nicht über ausreichende Informationen verfügt, um zu wissen, welcher Block unbemerkt beschädigt ist.
Ich lade Sie ein, meine Antwort auf Frage 4 ("Warum md
verwendet ein Gerät weiterhin mit ungültigen Daten?") Hier zu lesen, was dies ausführlicher erklärt.
Um das geplante Layout noch zu verschlechtern , kann der oben beschriebene Btrfs-Layer nicht erkannt werden, wenn ein Paritätsblock stumme Datenfehler aufweist. Wenn ein Datenträger mit dem entsprechenden Datenblock ausfällt und Sie versuchen, ihn zu ersetzen, verwendet md die beschädigte Parität und beschädigt Ihre Daten irreversibel. Nur wenn diese Festplatte ausfällt, erkennt Btrfs die Beschädigung, aber Sie haben die Daten bereits verloren.
Dies liegt daran, dass md nicht aus Paritätsblöcken liest, wenn das Array nicht beeinträchtigt wird.
Gibt es eine Möglichkeit, mdadm mitzuteilen, einen einzelnen Chunk zu reparieren (was nicht die Parität ist) und möglicherweise sogar einen Plattensektor als schlecht zu kennzeichnen? Möglicherweise wird ein Lesefehler erstellt.
Bei fehlerhaften Sektoren, die von der Festplatte selbst erkannt wurden, kann md dies problemlos verkraften, da der fehlerhafte Sektor für md erkannt wird.
Sie können technisch einen fehlerhaften Sektor mit machen hdparm --make-bad-sector
, aber woher wissen Sie, auf welcher Festplatte der Block von der unbeaufsichtigten Datenbeschädigung betroffen ist?
Betrachten Sie dieses vereinfachte Beispiel:
Paritätsformel: PARITY = DATA_1 + DATA_2
+--------+--------+--------+ | DATA_1 | DATA_2 | PARITY | +--------+--------+--------+ | 1 | 1 | 2 | # OK +--------+--------+--------+
Lassen Sie uns nun jeden Block mit einem Wert von Folgendes beschädigen 3
:
+--------+--------+--------+ | DATA_1 | DATA_2 | PARITY | +--------+--------+--------+ | 3 | 1 | 2 | # Integrity failed – Expected: PARITY = 4 | 1 | 3 | 2 | # Integrity failed – Expected: PARITY = 4 | 1 | 1 | 3 | # Integrity failed – Expected: PARITY = 2 +--------+--------+--------+
Wenn Sie nicht die erste Tabelle zum Anschauen hätten, woher würden Sie wissen, welcher Block beschädigt war?
Sie können es nicht sicher wissen.
Deshalb blockieren Btrfs und ZFS beide Prüfsummen. Es benötigt etwas mehr Speicherplatz, aber diese zusätzlichen Informationen lassen das Speichersystem herausfinden, welcher Block liegt.
Aus Jeff Bonwicks Blogartikel "RAID-Z" :
Wenn Sie einen RAID-Z-Block lesen, vergleicht ZFS ihn mit seiner Prüfsumme. Wenn die Datenfestplatten nicht die richtige Antwort geliefert haben, liest ZFS die Parität und führt anschließend eine kombinatorische Rekonstruktion durch, um herauszufinden, welche Festplatte fehlerhafte Daten zurückgegeben hat.
Um dies mit Btrfs auf md zu tun, müssten Sie versuchen, jeden Block neu zu berechnen, bis die Prüfsumme in Btrfs übereinstimmt. Dies ist ein zeitaufwendiger Prozess, für den kein Benutzer / Skript eine einfache Schnittstelle hat.
Ich weiß, dass ZFS dies alles alleine erledigen kann, aber ich möchte keinen ECC-Speicher verwenden
Weder ZFS noch Btrfs über md hängen vom ECC-Speicher ab oder kennen ihn sogar. ECC-Speicher fängt nur stille Datenbeschädigung im Speicher auf, sodass das Speichersystem agnostisch ist.
Ich habe ZFS über Btrfs für RAID-5 und RAID-6 (analog zu ZFS RAID-Z bzw. RAID-Z2) zuvor in Btrfs über Mdadm Raid6 empfohlen? and Fail Device in MD RAID, wenn ATA nicht mehr reagiert, aber ich möchte die Gelegenheit nutzen, um einige weitere Vorteile von ZFS zu skizzieren:
- Wenn ZFS eine unbegründete Datenbeschädigung feststellt, wird diese sofort und ohne menschliches Eingreifen sofort korrigiert.
- Wenn Sie eine gesamte Festplatte neu erstellen müssen, "resilver" ZFS nur die tatsächlichen Daten, anstatt unnötig über das gesamte Blockgerät zu laufen.
- ZFS ist eine All-in-One-Lösung für logische Volumes und Dateisysteme, was die Verwaltung weniger vereinfacht als die Erstellung von Btrfs über md.
- Im Gegensatz zu sind RAID-Z und RAID-Z2 zuverlässig und stabil
- Btrfs unter md RAID-5 / RAID-6, das nur Fehlererkennung für unbemerkt beschädigte Datenblöcke bietet (plus fehlerhaft beschädigte Paritätsblöcke werden möglicherweise nicht erkannt, bis es zu spät ist) und keine einfache Möglichkeit zur Fehlerkorrektur
- Btrfs RAID-5 / RAID-6, das " mehrere schwerwiegende Datenverluste enthält ".
- Wenn ich eine ganze Festplatte mit ZFS RAID-Z2 unbemerkt beschädigt habe, würde ich keinerlei Daten verlieren, während ich bei md RAID-6 tatsächlich 455,681 Inodes verlor .