Wie kann ich feststellen, ob meine ZFS-Momentaufnahmen wirklich redundant sind und ohne Datenverlust sicher gelöscht werden können?

387
Stilez

Ich verwende FreeBSD 11.1 und die Ausgabe von zfs list -t snap -r poolnamezeigt eine große Anzahl meiner Momentaufnahmen mit "0" unter "USED". Ich habe gelesen, wie ZFS den Platz einnimmt, also verstehe ich die Grundlagen und sie schlagen mir das vor

  1. "0" bedeutet, dass der Snapshot keinen Speicherplatz belegt, dh wenn er gelöscht wird, wird kein Speicherplatz mehr wiederhergestellt.
  2. Wenn eine Datei in zwei Momentaufnahmen vorhanden ist, verbessert dies nicht die Redundanz dieser Datei, da lediglich mehrere Zeiger (Verweise) auf diese Datei vorhanden sind (genauer gesagt auf die Reihe von Blöcken, aus denen die Datei besteht), nicht diese zusätzlichen Kopien existieren.

Die Logik schlägt daher vor, dass ein Snapshot mit USED = 0 wahrscheinlich eine identische Kopie des vorherigen Snapshots des Rhat-Objekts ist und sicher gelöscht werden kann, wenn Sie keine Snapshots behalten möchten, für die sich gegenüber dem vorherigen Snapshot nichts geändert hat, und keine Redundanz geht dabei verloren .

Ich bin sehr daran interessiert, alte Daten nicht zu löschen oder Redundanz zu reduzieren, wenn dadurch die Datensicherheit verringert wird, und ich kann mir ein paar mögliche Gründe einfallen lassen, die möglicherweise nicht ganz so einfach sind:

  • Die USED-Werte für Snapshots können sich ändern, wenn andere Snapshots zerstört werden, aber das Vorhandensein der Größe Null sollte in fast jeder normalen Verwendung stark darauf schließen lassen, dass ein anderer Snap mit einer Größe ungleich Null vorhanden ist, mit der er identisch ist. Aber "deutet stark an" bedeutet nicht "unplausibel, dass es nicht so ist", und Null bedeutet, dass alle Blöcke existieren, nicht dass sie identisch organisiert sind und die Dateien gleich sind. Gibt es Fälle, in denen es nicht unbedingt sicher ist, alle nullgroßen Snaps "out of hand" zu löschen?

  • Stellen Sie sich als Beispiel vor, dass wir (1) eine 100-MB-Datei erstellen und den Pool snapshoten, (2) zwei weitere 75-MB-Dateien erstellen, die jeweils die ersten und letzten 75% der 100-MB-Datei enthalten, die 100-MB-Datei löschen und dann den Snapshot nochmal. Der zweite Schnappschuss zeigt den verwendeten Speicherplatz 0, da alle Blöcke im vorherigen Schnappschuss vorhanden sind, die Dateien in diesem Schnappschuss jedoch tatsächlich eindeutig sind. Ich kann mir keine Möglichkeit vorstellen, dies zu erkennen, da die Speicherplatzabrechnung in ZFS nicht dateibasiert ist. Bei Verwendung von Dedup und einigen Arten von Dateien, die angefügt oder "endlos" werden, kann dies häufig vorkommen, wenn es selten vorkommt, nicht nur um einen pathologischen Randfall.

Ich bin mir nicht sicher. Vielleicht ist die Fanggröße ein roter Hering und ich muss stattdessen andere Eigenschaften überprüfen.

Gibt es irgendwelche nicht trivialen Umstände, in denen Sie sicher und schnell feststellen können, ob ein ZFS-Snapshot redundant ist (in dem Sinne, dass ich den Begriff verwende) und dass er sicher gelöscht werden kann?

Oder gibt es eine andere (schnellere und effektivere) Methode, um von anderen Eigenschaften oder ZFS-Unterschieden oder was auch immer zu unterscheiden, ob zwei aufeinanderfolgende Snaps tatsächlich auf dieselbe Zeit / Pool-Schreibsequenznummer in der Geschichte des Pools zeigen (was sie kategorisch bestätigen würde) Referenz identische Daten)?

5

1 Antwort auf die Frage

1
Dan

USED=0ist ein vernünftiger Indikator dafür, dass ein Schnappschuss ein Duplikat des vorherigen ist. Sie sollten jedoch sicherstellen, dass es tatsächlich Null ist und nicht eine abgerundete Version von Null (wie 0,1 KB, auf die nächste KB gerundet). Sie können das -pFlag ("Parseable") verwenden, um die genaue Anzahl in Bytes zu ermitteln. Beachten Sie auch, dass es nach dem Erstellen eines Schnappschusses einige Sekunden dauern kann, bis die Speicherplatznummern aktualisiert sind.

Wie Sie vermuten, könnten Sie auch zfs diffdas Gleiche erreichen. Dies hat den zusätzlichen Vorteil, Ihnen mitzuteilen, was sich geändert hat.

Das von Ihnen angegebene Beispiel (wo Blöcke zwischen Dateien gemeinsam genutzt werden) kann nur vorkommen, wenn Sie die Deduplizierung aktiviert haben. Andernfalls würde ZFS immer noch mehrere Kopien der Blöcke speichern und diesen Speicherplatz entsprechend berücksichtigen. Selbst mit dedup weisen die beiden oben genannten Methoden Unterschiede auf - der Snapshot würde keinen USEDSpeicherplatz beanspruchen, da Sie für die beiden Dateien neue Metadaten benötigen (zwei Inodes plus die indirekten Blöcke, die auf die dedupierten Blöcke verweisen, möglicherweise auch andere Elemente) ) und zfs diffwird +<filename>für die beiden neuen Dateien angezeigt.

BEARBEITEN: Die letzte für den Benutzer sichtbare Möglichkeit, dies zu überprüfen, ist das Ausführen zfs send -nv(Trockenlauf, ausführlich) zwischen den Snapshots. Dadurch wird nicht der vollständige Sendestrom generiert, es wird jedoch möglicherweise angegeben, was gesendet werden würde. Dies sollte nichts sein, wenn die beiden Momentaufnahmen gleich sind.

Ich gehe davon aus, dass Dedup aktiviert ist. Es ist nicht nur ein robusteres general.case, aber im Moment verwende ich es auch (ca. 4.5x Speicherplatz wird dadurch eingespart :)) Aber wenn ich "sinnlose" Snapshots in einem großen Pool löschen möchte, `zfs diff` dauert lange zu überprüfen. Gibt es so etwas wie eine Schreibsequenznummer, die zuletzt geschrieben wurde, oder etwas, das ZFS speichert und verwendet werden kann, um schnell zu überprüfen (etwa 1 / 10sec oder weniger ideal), ob zwei Momentaufnahmen die gleichen Daten widerspiegeln? Ich weiß, dass er Schreibsequenzen prüfen kann (z. B. Elemente in ZIL nach einem Absturz), weiß jedoch nicht, ob er dem Benutzer alles Nutzbare freigibt Stilez vor 6 Jahren 0
Ich denke, der einzige Weg, dies schnell zu tun, besteht darin, USED = 0 in der zfs-Liste zu betrachten, da für die meisten anderen Operationen ein Aufruf von txg_sync () erforderlich ist (was eine Weile dauert). Es gibt definitiv Nicht-API-Wege, um herauszufinden, ob zwei Snapshots gleich sind, aber Sie müssten zdb verwenden, ein nur für Entwickler bestimmtes Debugging-Tool, das schwer zu verstehen ist und nicht immer funktioniert. Dan vor 6 Jahren 0