Aktualisierungsprüfsumme auf zfs erzwingen?

13

Ich habe kürzlich die checksumEigenschaft für eines meiner nicht duplizierten zfs-Dateisysteme in sha256from on(fletcher4) geändert , um das Senden duplizierter Replikations-Steams wie in diesem Befehl besser zu unterstützen zfs send -DR -I _starting-snaphot_ _ending-snapshot_.

In der zfs-Manpage heißt es jedoch send -D:

Dieses Flag kann unabhängig von der dedup-Eigenschaft des Datasets verwendet werden. Die Leistung wird jedoch erheblich verbessert, wenn das Dateisystem eine dedup-fähige Prüfsumme verwendet (z. B. sha256).

Die zfs-Manpage gibt dies auch für die checksumEigenschaft an:

Das Ändern dieser Eigenschaft wirkt sich nur auf neu geschriebene Daten aus.

Ich habe keine Lust, fletcher4 zu vertrauen. Der Nachteil ist, dass fletcher4 im Gegensatz zu SHA256 keine pseudozufällige Hash-Funktion ist und daher kein Kollisionsrisiko besteht. Es ist daher nur für die Deduplizierung geeignet, wenn es mit der Option "Verify" (Überprüfen) kombiniert wird, mit der Hash-Kollisionen erkannt und behoben werden.

Wie kann ich die Prüfsummen des Dateisystems aktualisieren, vorzugsweise ohne das System zu verlagern?

84104
quelle

Antworten:

11

Um die Eigenschaften (Komprimierung, Deduplizierung oder Prüfsumme) bereits geschriebener Daten zu ändern, müssen die Daten nach dem zfs-Ansatz durch eine zfs send | zfs receiveSequenz geführt werden. Natürlich müssen Sie das System dafür nicht offline schalten, aber Sie werden es brauchen

  1. genügend Ressourcen in Ihrem zpool / auf dem System, um zwei deduplizierte Kopien des betreffenden Datensatzes zu speichern
  2. Ausfallzeit für den Datensatz, da Sie ihn entweder zerstören oder in der Prozedur umbenennen müssten
  3. genug Zeit und Geduld, um die Operation abzuschließen

Da Sie bereits die Deduplizierung für den zpool verwenden, würde das Ausführen von a zfs send | zfs receivemit dem Ziel auf demselben Pool wie die Quelle nur den für die neu geschriebenen Metadatenblöcke benötigten Speicherplatz belegen . Aber seien Sie darauf vorbereitet, dass die Kopie eine Weile dauert - die Deduplizierung kann sehr langsam sein, insbesondere wenn Sie nicht über genügend RAM verfügen, um die gesamte Deduplizierungstabelle im RAM zu speichern.

Es ist klar, dass Sie alle Schreibvorgänge unterbrechen müssen, um die endgültige, autorisierende Kopie des Datensatzes zu erstellen. Sie können jedoch die Ausfallzeit minimieren, indem Sie zuerst einen Snapshot kopieren, alle Schreibvorgänge stoppen und zfs send -i | zfs receiveals letzten Schritt inkrementell ausführen .

das-wabbit
quelle
Mir ist überhaupt nicht klar, ob zfs receivedie Metadaten eines Dateisystems aktualisiert werden. Es scheint mir, dass es viel schneller gehen würde, wenn die Metadaten einfach so wären, wie sie sind. Dies kann jedoch aufgrund der Block- und nicht der Dateiebene der Prüfsumme unmöglich sein. In diesem Fall zfs send | zfs receivewürde sich eine akzeptable Basis für eine Lösung bilden.
84104
1
zfs senden | zfs recv ändert effektiv alle Metadaten (Auswahl der Komprimierung, Auswahl der Prüfsumme, Auswahl der Deduplizierung). zfs send erstellt ein Objekt, das Sie dann mit zfs recv aufnehmen. Dabei wird es so geschrieben, als ob es sich nur um neue Daten handelte. Ich denke jedoch, dass Sie unter Umständen ein Missverständnis über zfs send | recv in Bezug auf die Deduplizierung haben. zfs send -D versucht, die Daten / innerhalb des Streams selbst / zu deduplizieren, ohne die vorhandene Deduplizierung der Daten aus dem Quelldatensatz beizubehalten. Aus diesem Grund ist es nicht erforderlich, dass auf der Empfängerseite auch die Deduplizierung für den Zieldatensatz aktiviert ist.
Nex7
Weitere Erklärungen: Derzeit gibt es keine Möglichkeit, deduplizierte Daten so zu senden, dass nur eine einzige Kopie der deduplizierten Daten und der zugehörigen Einträge in der Deduplizierungstabelle übertragen wird. Nicht einmal, wenn die Quelle und das Ziel synchron sind und Sie nur einen inkrementellen Schnappschuss senden. ZFS speichert die gesendeten Daten weiterhin in voller Größe, wenn die darin enthaltenen Daten nicht deduplizierbar sind (im Bereich des Streams selbst). Möglicherweise verfügen Sie über Daten, die im POOL-DDT leicht dedupliziert werden können, aber als kleines Sendeobjekt nicht deduplizierbar sind.
Nex7