
Einige Hintergrundinformationen.
Ich benutzeZREPum zwei Server untereinander zu replizieren. Jeder Server enthält einen ZFS-Pool mit zwei Datasets als Replikationsmaster und zwei Sets als Replikationsziel. Die Mastersets enthalten das System und die VirtualBox-VMs des lokalen Servers, die Replikationsziele die gleichen wie beim anderen.
Zusätzlich sichere ich alle Master-Sets pro Server auf einem NAS mit rsync
. Das NAS ist ziemlich langsam und es dauert Stunden, bis ein Backup erfolgreich ist. Der implementierte Ansatz besteht daher darin, VMs anzuhalten, einen Snapshot zu erstellen, die VMs wiederherzustellen und sie rsync
vom erstellten Snapshot aus laufen zu lassen. Wichtig ist, dass der manuell erstellte Snapshot nicht der ZREP-Namenskonvention entsprach und direkt nach der Fertigstellung wieder zerstört wurde rsync
. Zunächst lief ZREP parallel weiter, gestartet von cron
.
Das Problem.
Aber von Zeit zu Zeit kam es vor, dass ZREP in einen Zustand geriet,kann nicht mehr synchronisiert werden. Um dieses Problem zu lösen, sagte mir ein Kollege, er müsse Snapshots löschen und den Prozess zur Initialisierung von ZREP erneut durchführen. Dieses Problem wurde behoben, indem ZREP rsync
schließlich nicht mehr parallel zu unserem eigenen Snapshot laufen gelassen wurde.
Leider fehlen mir die konkreten Details zu diesem Fehler und der Kollege ist nicht mehr erreichbar, aber seiner Beschreibung nach klang es, als gäbe es ein Problem beim Finden gemeinsamer Vorgänger von Snapshots zwischen Replikationsmaster und Ziel, um inkrementell zu synchronisieren. Ich glaube, die Fehlermeldungen waren etwa folgende:
cannot receive incremental stream: most recent snapshot of zfs-pool/vbox/tori does not match incremental source
cannot open 'zfs-pool/vbox/tori@zrep_0001b7': dataset does not exist
Mein Verständnis davon, wie inkrementelles Senden/Empfangen funktioniert.
Nach meinem Verständnis vondie DokumenteUndandere Fragen, um Snapshots erfolgreich inkrementell zu senden, müssen der sendende Master und das empfangende Ziel diesen einen Snapshot gemeinsam nutzen, der als Argument 1 verwendet wird, zfs send
und dieser Snapshot muss zusätzlich der aktuelle auf dem empfangenden Ziel sein.
Das zweite Argument ist ein beliebiger neuerer Snapshot, der von ZFS verwendet wird, um die Unterschiede zu dem Snapshot zu berechnen, den Master und Ziel gemeinsam haben, und diese Unterschiede an das Replikationsziel zu senden. Da beide denselben Snapshot verwenden, der als Argument 1 angegeben ist, sind die Unterschiede für das Ziel sinnvoll und können einfach so angewendet werden.
Die Argumente -i
vs. -I
führen nach meinem Verständnis entweder dazu, dass ein logischer Snapshot gesendet wird, der alle berechneten inkrementellen Daten der Masterseite enthält, ODER dazu, dass alle Zwischen-Snapshots gesendet werden, die ihre inkrementellen Änderungen enthalten. Das -i
führt z. B. immer zu EINEM neuen Snapshot auf dem Ziel vs. -I
kann zu N zusätzlichen führen.
Das Erstellen und Löschen von Zwischen-Snapshots zwischen den als Argument 1 und 2 angegebenen zfs send -i
sollte kein Problem darstellen, da ZFS immer nur die Unterschiede zwischen diesen beiden angegebenen Argumenten berechnet und sich nicht um andere Zwischen-Snapshots kümmert. Im Fall von ZREP bedeutet das theoretisch, dass es keinen Unterschied machen sollte, ob während des Betriebs zusätzliche Snapshots erstellt werden oder nicht, solange ich nicht in von ZREP verwaltete Snapshots eingreife. Einfach, weil immer spezielle ZREP-Snapshots verfügbar sind, die von ZREP verwaltet und zum Berechnen von Unterschieden für die Replikation verwendet werden. Theoretisch rsync
sollte das zusätzliche Erstellen von Snapshots für und Backup also überhaupt kein Problem darstellen.
Sind diese Annahmen richtig?
Nicht mit ZREP zusammenhängende Fragen.
Ist es im Allgemeinen sicher, ZFS-Snapshots inkrementell zu senden und dabei einige Zwischen-Snapshots zu ignorieren? Oder ist es notwendig, ALLE jemals erstellten Zwischen-Snapshots an das Replikationsziel zu senden, um nicht aus der Synchronisation zu geraten oder so? Inwiefern hängen die Dinge von -i
vs. ab -I
?
Antwort1
Ja, Sie erhalten zwischendurch immer noch alle Daten, können aber nicht zu den Zwischendaten zurückspulen.
Wenn Sie die Snapshots 1, 2 und 3 haben und der Remote-Pool nur Snapshot 1 hat, können Sie ihm Snapshot 3 geben und 2 überspringen. Es ist dann nicht möglich, in den Zustand „2“ zurückzukehren. Die Daten sind aber noch da.
Die Snapshots beschreiben, was zu dem Zeitpunkt da war. Wenn also Snapshot „2“ im Remote-Pool fehlt, ist es so, als ob Sie zu diesem Zeitpunkt nie einen gemacht hätten. Es weiß buchstäblich nichts über den Snapshot „2“ und wie die Dinge damals aussahen.
Wenn Sie Ihre Meinung ändern, müssen Sie Snapshot „3“ im Remote-Pool löschen und können erst dann „2“ und dann erneut „3“ senden.
https://www.reddit.com/r/zfs/comments/cfzdb3/is_it_safe_to_send_zfssnapshots_incrementally/euensuy/