Haftungsausschluss: Da ich nie zvols verwendet habe, kann ich nicht sagen, ob sie sich in der Replikation von normalen Dateisystemen oder Snapshots unterscheiden. Ich nehme an, dass dies der Fall ist, aber nehme mein Wort nicht dafür.
Ihre Frage ist eigentlich mehrere Fragen, ich versuche, sie getrennt zu beantworten:
Replizieren / Spiegeln des gesamten Pools an einen Remotestandort
Sie müssen die Aufgabe in zwei Teile aufteilen: Erstens muss die erste Replikation abgeschlossen sein, danach ist eine inkrementelle Replikation möglich, solange Sie nicht mit Ihren Replikations-Snapshots herumspielen . Um die inkrementelle Replikation zu aktivieren, müssen Sie die letzten Replikations-Snapshots aufbewahren, alles, was zuvor gelöscht werden kann. Wenn Sie den vorherigen Snapshot löschen, zfs recv
wird die Replikation beanstandet und abgebrochen. In diesem Fall müssen Sie noch einmal von vorne beginnen. Versuchen Sie also, dies nicht zu tun.
Wenn Sie nur die richtigen Optionen benötigen, sind dies:
zfs send
:
-R
: Sende alles unter dem angegebenen Pool oder Datensatz (rekursive Replikation, wird die ganze Zeit benötigt, enthält -p
). Außerdem werden beim Empfang alle gelöschten Quellschnappschüsse auf dem Ziel gelöscht.
-I
: Alle Zwischen-Snapshots zwischen dem letzten Replikations-Snapshot und dem aktuellen Replikations-Snapshot einschließen (nur bei inkrementellen Sends erforderlich)
zfs recv
:
-F
: Erweitern Sie den Zielpool, einschließlich des Löschens vorhandener Datensätze, die in der Quelle gelöscht wurden
-d
: Verwerfen Sie den Namen des Quellpools und ersetzen Sie ihn durch den Namen des Zielpools (der Rest der Dateisystempfade wird beibehalten und bei Bedarf auch erstellt).
-u
: Hänge das Dateisystem nicht am Ziel an
Wenn Sie ein vollständiges Beispiel bevorzugen, finden Sie hier ein kleines Skript:
#!/bin/sh
# Setup/variables:
# Each snapshot name must be unique, timestamp is a good choice.
# You can also use Solaris date, but I don't know the correct syntax.
snapshot_string=DO_NOT_DELETE_remote_replication_
timestamp=$(/usr/gnu/bin/date '+%Y%m%d%H%M%S')
source_pool=tank
destination_pool=tank
new_snap="$source_pool"@"$snapshot_string""$timestamp"
destination_host=remotehostname
# Initial send:
# Create first recursive snapshot of the whole pool.
zfs snapshot -r "$new_snap"
# Initial replication via SSH.
zfs send -R "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"
# Incremental sends:
# Get old snapshot name.
old_snap=$(zfs list -H -o name -t snapshot -r "$source_pool" | grep "$source_pool"@"$snapshot_string" | tail --lines=1)
# Create new recursive snapshot of the whole pool.
zfs snapshot -r "$new_snap"
# Incremental replication via SSH.
zfs send -R -I "$old_snap" "$new_snap" | ssh "$destination_host" zfs recv -Fdu "$destination_pool"
# Delete older snaps on the local source (grep -v inverts the selection)
delete_from=$(zfs list -H -o name -t snapshot -r "$source_pool" | grep "$snapshot_string" | grep -v "$timestamp")
for snap in $delete_from; do
zfs destroy "$snap"
done
Verwenden Sie etwas schneller als SSH
Wenn Sie eine ausreichend gesicherte Verbindung haben, z. B. IPSec- oder OpenVPN-Tunnel, und ein separates VLAN, das nur zwischen Sender und Empfänger besteht, können Sie von SSH zu unverschlüsselten Alternativen wie mbuffer wechseln, wie hier beschrieben , oder SSH mit schwacher / keiner Verschlüsselung verwenden und deaktivierte Komprimierung, die hier detailliert beschrieben wird . Es gab auch eine Website über das Rekomilieren von SSH, um viel schneller zu sein, aber ich erinnere mich leider nicht an die URL - ich bearbeite sie später, wenn ich sie finde.
Bei sehr großen Datenmengen und langsamen Verbindungen kann es auch nützlich sein, die erste Übertragung über die Festplatte durchzuführen (verwenden Sie eine verschlüsselte Festplatte, um zpool zu speichern und in einem versiegelten Paket per Kurier, Post oder persönlich zu senden). Da die Übertragungsmethode für send / recv keine Rolle spielt, können Sie alle Daten auf die Festplatte leiten, den Pool exportieren, die Festplatte an das Ziel senden, den Pool importieren und anschließend alle inkrementellen Sends über SSH senden.
Das Problem mit kaputten Schnappschüssen
Wie bereits erwähnt, erhalten Sie beim Löschen / Ändern Ihrer Replikations-Snapshots die Fehlermeldung
cannot send 'pool/fs@name': not an earlier snapshot from the same fs
Dies bedeutet, dass entweder Ihr Befehl falsch war oder Sie sich in einem inkonsistenten Zustand befinden, in dem Sie die Schnappschüsse entfernen und von vorne beginnen müssen.
Dies hat mehrere negative Auswirkungen:
- Sie können einen Replikations-Snapshot erst löschen, wenn der neue Replikations-Snapshot erfolgreich übertragen wurde. Da diese Replikations-Snapshots den Status aller anderen (älteren) Snapshots enthalten, wird der leere Speicherplatz gelöschter Dateien und Snapshots nur dann wiederhergestellt, wenn die Replikation abgeschlossen ist. Dies kann zu vorübergehenden oder dauerhaften Speicherplatzproblemen in Ihrem Pool führen, die Sie nur durch einen Neustart oder Abschluss des vollständigen Replikationsvorgangs beheben können.
- Sie werden viele zusätzliche Snapshots haben, die den Befehl list verlangsamen (mit Ausnahme von Oracle Solaris 11, wo dies behoben wurde).
- Möglicherweise müssen Sie die Snapshots vor (versehentlichem) Entfernen schützen, außer durch das Skript selbst.
Es gibt eine mögliche Lösung für diese Probleme, aber ich habe es nicht selbst ausprobiert. Sie könnten zfs bookmark
eine neue Funktion in OpenSolaris / illumos verwenden, die speziell für diese Aufgabe erstellt wurde. Dies würde Sie von der Snapshot-Verwaltung befreien. Der einzige Nachteil ist, dass es derzeit nur für einzelne Datensätze funktioniert, nicht rekursiv. Sie müssten eine Liste aller Ihrer alten und neuen Datensätze speichern und diese dann durchlaufen, mit Lesezeichen versehen, senden und empfangen und dann die Liste (oder eine kleine Datenbank, wenn Sie dies vorziehen) aktualisieren.
Wenn Sie die Lesezeichenroute ausprobieren, würde mich interessieren, wie es für Sie geklappt hat!
zfs send -R ...
? Wenn Sie die Ausgabe über weitergeleitet habenssh
, haben Sie die Escape-Zeichen mit deaktiviertzfs send -R ... | ssh -e none ...
?