Tach auch… Heute mal wieder etwas zum Thema ZFS (anscheinend wohl im Moment gefragt…)

Wenn man ZFS Volumes abgleichen möchte hilft einem bekanntermaßen ja zfs send / revc. Möchte man noch eine gewisse Historie am Ziel oder es handelt sich um recht große Volumes, dann freut man sich sehr über die Möglichkeit nur die Differenz zwischen zwei Snapshots abgleichen zu müssen.

Als kleines Beispiel:

Ich habe eine FreeBSD Jail für subsonic. In dieser liegen einfach die gesamten Mediafiles, was weiß ich.. Sagen wir mal 100GB. Vom Volume werden dann automatisch per zfsutils snapshots erstellt. Die wöchentlichen snapshots davon möchte ich nun gerne per SSH auf ein anderes System schieben, einfach um die Daten so „gesichert“ zu haben. Jedes System steht dann vielleicht noch in der Colocation in einem anderen DataCenter. Einmal die Woche 100GB abgleichen, das sind dann im Monat 400GB (ja, viel ist anders aber es ist ein reales Beispiel).

Initial pumpt das Skript nun also die 100GB rüber. Ich schreib mal den Befehl ohne Variablen zur besseren Lesbarkeit, ok?

zfssend@system01:~ # zfs send zroot/jails/subsonic@zfs-auto-snap_weekly-2015-06-14-00h14 | ssh zfsrecv@system02 zfs recv zroot/backup/bsd02/subsonic

So jetzt habe ich also auf der zweiten Kiste eine 1a Kopie der Jail. Ab dem Moment muss ich nun nur noch die Differenz zum nächsten Snapshot übertragen mit einem:

zfssend@system01:~ # zfs send -i zroot/jails/subsonic@zfs-auto-snap_weekly-2017-03-12-00h14 zroot/jails/subsonic@zfs-auto-snap_weekly-2017-03-19-00h14 | ssh zfsrecv@system02 zfs recv zroot/backup/bsd02/subsonic

Dieses funktioniert natürlich nur so lange die Daten im Ziel nicht verändert werden. Klar wie bei jeder Datensicherung die auf Inkrementen beruht. Ändere ich eines sind die nachfolgenden nicht mehr konsistent. Wie könnte nun so eine Änderung passieren? Ganz einfach ich renne in dem Filesystem herum und ändere Daten oder lege neue an. Was viele übersehen ist etwas wie atime. Also das einfache speichern der Information: Wann wurde die Datei zuletzt angefasst. Dieses würde schon als Änderung reichen um folgendes zu bekommen:

zfssend@system01:~ # zfs send -i zroot/jails/subsonic@zfs-auto-snap_weekly-2017-03-12-00h14 zroot/jails/subsonic@zfs-auto-snap_weekly-2017-03-19-00h14 | ssh zfsrecv@system02 zfs recv zroot/backup/bsd02/subsonic
cannot receive incremental stream: destination zroot/backup/bsd02/subsonic has been modified
since most recent snapshot
warning: cannot send 'zroot/jails/subsonic@zfs-auto-snap_weekly-2017-03-19-00h14': signal received

Und nun ist Essig mit der schönen Sicherung und man muss wieder Initial alles rüber schieben? Jain… Natürlich kann man dem zfs recv einfach mitteilen die Änderung zu ignorieren. Denn der snapshot ist dem Ziel ja bekannt. Also kann man dem Ziel sagen: der bestehende snapshot zählt, ignoriere als was danach passiert ist und gleiche das Delta zum aktuellen ab:

zfssend@system01:~ # zfs send -i zroot/jails/subsonic@zfs-auto-snap_weekly-2017-03-12-00h14 zroot/jails/subsonic@zfs-auto-snap_weekly-2017-03-19-00h14 | ssh zfsrecv@system02 zfs recv -F zroot/backup/bsd02/subsonci

Ein -F ist hier also unser Freund. Hat man alles sauber geskriptet und ebenfalls nicht vergessen im Ziel hin und wieder die alten snapshots aufzuräumen, sollte man damit schon eine ganz brauchbare Datensicherheit haben!

Viel Spaß!