Snapshots sind wichtig, egal ob Sie eine einfache virtuelle Maschine auf Ihrem Heimcomputer betreiben oder ob es sich um eine Unternehmensdatenbank handelt, die ständig aktualisiert und verändert wird. Snapshots, d.h. eine Kopie des gesamten Dateisystems, wie es zu einem bestimmten Zeitpunkt war, sind wichtig.
Die Leute verlieren oft den Überblick, wo etwas schief gelaufen ist, eine Datei wurde gelöscht und niemand hat bemerkt, dass sie weg war. Mehrere Backups sind vergangen und nun stellt man fest, dass eine wichtige Datei in allen verfügbaren Backups der letzten 5 Wochen fehlt. In diesem Tutorial werden wir sehen, wie man ZFS-Snapshots verwendet und verschiedene Snapshotting-Strategien erörtern, die sowohl in Bezug auf die Ressourcennutzung als auch auf die Wiederherstellbarkeit optimal funktionieren.
ZFS hat sowohl einen Überblick über Dateien und Verzeichnisse auf hoher Ebene als auch darüber, wie Daten auf die Festplatte geschrieben werden. Wenn Daten physisch auf eine Festplatte geschrieben werden, geschieht dies in diskreten Blöcken. Normalerweise kann die Blockgröße bis zu 1 MB betragen, die Standardgröße ist jedoch 128 KB. Das bedeutet, dass jede Änderung (Lesen, Schreiben oder Löschen) in den einzelnen Blöcken erfolgt.
Der Copy-on-Write-Mechanismus sorgt dafür, dass bei jeder Änderung eines Blocks eine Kopie des Blocks mit den erforderlichen Änderungen auf dem neuen Block erstellt wird, anstatt den Block direkt zu ändern.
Dies ist besonders hilfreich, wenn es beispielsweise zu einem Stromausfall kommt und das System abstürzt, während neue Daten auf die Platte geschrieben werden. Wenn das in einem herkömmlichen Dateisystem passiert, werden Ihre Dateien beschädigt oder mit Löchern darin hinterlassen. Wenn Sie jedoch ZFS verwenden, können Sie die laufende Transaktion verlieren, während dies geschieht, aber der letzte gültige Zustand Ihrer Dateien bleibt erhalten.
Schnappschüsse beruhen ebenfalls auf dieser Funktion, und zwar ziemlich stark. Wenn Sie einen Schnappschuss von einem bestimmten Datensatz machen („Datensatz“ ist der ZFS-Begriff für ein Dateisystem), zeichnet ZFS nur den Zeitstempel auf, wann der Schnappschuss gemacht wurde. Das war’s! Es werden keine Daten kopiert und es wird kein zusätzlicher Speicherplatz verbraucht.
Erst wenn sich das Dateisystem ändert und die darin enthaltenen Daten vom Schnappschuss abweichen, beginnt der Schnappschuss zusätzlichen Speicherplatz zu verbrauchen. Was unter der Haube passiert, ist Folgendes: Anstatt die alten Blöcke im Laufe der Zeit zu recyceln, behält ZFS sie bei sich. Dadurch wird auch die Speichernutzung verbessert. Wenn Sie einen 20 GB großen Datensatz per Snapshot sichern und nur hier und da ein paar Textdateien ändern, benötigt der Snapshot nur ein paar MB Speicherplatz.
Snapshots erstellen
Um die Verwendung von Snapshots zu demonstrieren, lassen Sie uns mit einem Datensatz beginnen, der viele Textdateien enthält, um die Sache einfach zu halten. Die virtuelle Maschine, die ich für die Demo verwende, läuft unter FreeBSD 11.1-RELEASE-p3, der neuesten stabilen Version, die zum Zeitpunkt der Erstellung dieses Artikels verfügbar ist. Das Root-Dateisystem ist standardmäßig auf dem zroot-Pool gemountet und viele der bekannten Verzeichnisse wie /usr/src, /home, /etc sind alle ihre eigenen Datensätze, die auf zroot gemountet sind. Wenn Sie nicht wissen, was ein Pool (oder ein zpool) in der ZFS-Sprache bedeutet, sollten Sie das nachlesen, bevor Sie fortfahren.
Eines der vielen Dateisysteme oder Datasets, die standardmäßig in FreeBSD enthalten sind, ist: zroot/usr/src
Um seine Eigenschaften zu sehen, führen Sie den folgenden Befehl aus.
:~$ zfs list zroot/usr/src
Wie Sie sehen können, belegt es 633 MB Speicherplatz. Er enthält den gesamten Quellbaum des Betriebssystems.
Lassen Sie uns einen Schnappschuss von zroot/usr/src machen
:~$ zfs snapshot zroot/usr/
Das @-Symbol dient als Trennzeichen zwischen dem Datensatz und dem Namen des Schnappschusses, der in unserem Fall snapshot1 ist.
Schauen wir uns nun den Zustand des Snapshots an, während er erstellt wird.
Bei der Ausführung des Befehls:
zfs list -rt all zroot/usr/src
Sie können sehen, dass der Snapshot keinen zusätzlichen Speicherplatz verwendet, wenn er erstellt wird. Es gibt auch keinen verfügbaren Speicherplatz, da es sich um einen reinen Lesedatensatz handelt, der Snapshot selbst kann nicht wachsen, geändert oder verkleinert werden. Und schließlich ist er nirgendwo eingehängt, so dass er von der gegebenen Dateisystemhierarchie völlig isoliert ist.
Löschen wir nun das sbin-Verzeichnis in /usr/src/
:$ rm /usr/src/sbin
Bei Betrachtung des Schnappschusses werden Sie nun feststellen, dass er gewachsen ist,
Das ist zu erwarten, da hier der Copy-on-Write-Mechanismus zum Tragen kommt und das Löschen (oder Ändern) der Dateien dazu geführt hat, dass mehr Daten nur dem Schnappschuss und nicht dem tatsächlich verwendeten Datensatz zugeordnet sind.
Beachten Sie die Spalte REFER in der obigen Ausgabe. Sie gibt die Menge der zugänglichen Daten auf dem Dataset an, während die USED-Spalte nur anzeigt, wie viel Platz auf der physischen Platte belegt ist.
Der Copy-On-Write-Mechanismus von ZFS führt oft zu diesen kontraintuitiven Ergebnissen, bei denen das Löschen einer Datei den Anschein erweckt, als würde jetzt mehr Platz als vorher belegt. Aber nachdem Sie bis hierher gelesen haben, wissen Sie, was tatsächlich passiert!
Bevor wir das beenden, lassen Sie uns die sbin von snapshot1 wiederherstellen. Dazu führen Sie einfach aus:
:/usr/src$ zfs rollback zroot/usr/
Snapshotting Policy
Die nächste Frage, die Sie sich stellen müssen, ist: Wie oft wollen Sie die Snapshots machen? Das kann zwar von Unternehmen zu Unternehmen unterschiedlich sein, aber nehmen wir das Beispiel einer sehr dynamischen Datenbank, die sich häufig ändert.
Zunächst würden Sie etwa alle sechs Stunden Snapshots erstellen, aber da sich die Datenbank so häufig ändert, wäre es bald nicht mehr möglich, die zahlreichen erstellten Snapshots zu speichern. Der nächste Schritt wäre also, Snapshots zu löschen, die älter als 48 Stunden sind.
Das Problem wäre nun, etwas wiederherzustellen, das vor 49 Stunden verloren gegangen ist. Um dieses Problem zu umgehen, können Sie ein oder zwei Snapshots aus dem 48-Stunden-Verlauf behalten und eine Woche lang aufbewahren. Löschen Sie sie, wenn sie älter als eine Woche sind.
Und wenn Sie so weitermachen, können Sie Schnappschüsse bis zur Entstehung des Systems aufbewahren, nur in abnehmender Reihenfolge der Häufigkeit. Abschließend möchte ich darauf hinweisen, dass diese Snapshots NUR GELESEN sind, d.h. wenn Sie von einer Ransomware infiziert werden und alle Ihre Daten verschlüsselt (geändert) werden. Diese Snapshots wären höchstwahrscheinlich noch intakt.