ZFS-Snapshot zur Datei als Backup mit Rotation

14

Ich habe ein lokales FreeNAS-System und möchte ZFS-Snapshots für Backups verwenden.
FreeNAS verfügt über die integrierten Replikationsaufgaben, die verwendet werden

zfs send snapshot_name

um einen Schnappschuss an ein entferntes System zu senden. Dies erfordert jedoch ein System mit ZFS am anderen Ende.

Ich möchte den Schnappschuss an eine Datei senden und diese komprimierte und verschlüsselte Datei an den Remote-Computer senden.

Dies ist möglich mit

zfs send snapshot_name | gzip | openssl enc -aes-256-cbc -a -salt > file.gz.ssl

Jeden Tag mache ich eine Momentaufnahme des Speicherpools und behalte jede Momentaufnahme 30 Tage lang.
Mit jedem Schnappschuss werde ich diesen Schnappschuss in eine Datei leiten.
- snapshot_file 1 enthält alle Dateien (sagen wir 2 GB)
- snapshot_file 2 enthält nur die Änderungen an snapshot_file 1 (sagen wir 5 MB)
- snapshot_file 3 enthält die Änderungen an snapshot_file 2; und so weiter.

Am 31. Tag wird snapshot_file 1 gelöscht (da ich nur die Änderungen der letzten 30 Tage möchte)

Daher muss snapshot_file 2 jede Datei enthalten (2 GB snapshot_file 1 + 5 MB Änderungen)

Bei diesem Ansatz muss jedoch täglich (ab dem 31. Tag) eine neue 2-GB-Datei erstellt und an ein Remote-System gesendet werden. Das ist zu viel Aufwand.

Was wäre der beste Ansatz, um Snapshots, die an eine Datei weitergeleitet werden, als Sicherungsstrategie mit einer Historie von X Tagen zu verwenden?

PS: Ich weiß, dass es eine Menge Backup-Software gibt (zum Beispiel rdiff-backup), die ich verwenden könnte. Ich bin aber gespannt, wie das geht.

Martin Grohmann
quelle
Warum benutzt du es nicht zfs recvam anderen Ende ( zfs set compression=gzip-9zum Beispiel bei einem Pool mit )? Das Speichern von Snapshot-Dateien klingt für mich sehr ineffizient.
Stéphane Chazelas
1
@StephaneChazelas, weil ich am anderen Ende kein ZFS-Dateisystem habe. Mein Remote-System ist eine Gentoo-Box mit ext4 (ich weiß, ich könnte zfsonlinux installieren, aber ich eher nicht)
Martin Grohmann

Antworten:

12

Wenn Sie die Schnappschüsse nicht im Dateisystem (zB mit zfs receive), sondern in Dateien speichern , ist dies leider nicht möglich.

ZFS auf der Empfangsseite

Wenn Sie auf der Sende- und Empfangsseite ZFS verwenden, müssen Sie nicht den gesamten Snapshot übertragen und übertragen nur die Unterschiede des Snapshots zum vorherigen:

ssh myserver 'zfs send -i pool/dataset@2014-02-04 pool/dataset@2014-02-05' | \
  zfs receive

ZFS kennt die Snapshots und speichert gemeinsame Blöcke nur einmal. Wenn das Dateisystem die Snapshots versteht, können Sie die alten ohne Probleme löschen.

Anderes Dateisystem auf der empfangenden Seite

In Ihrem Fall speichern Sie die Snapshots in einzelnen Dateien, und Ihr Dateisystem kennt die Snapshots nicht. Wie Sie bereits bemerkt haben, bricht dies die Rotation. Sie müssen entweder ganze Schnappschüsse übertragen, was Bandbreite und Speicherplatz verschwendet, aber Sie können einzelne Schnappschüsse löschen. Sie hängen nicht voneinander ab. Sie können inkrementelle Snapshots wie folgt erstellen:

ssh myserver 'zfs send -i pool/dataset@2014-02-04 pool/dataset@2014-02-05' \
  > incremental-2014-02-04:05

Um einen inkrementellen Snapshot wiederherzustellen, benötigen Sie auch die vorherigen Snapshots. Dies bedeutet, dass Sie die alten Inkrementale nicht löschen können.

Mögliche Lösungen

Sie können inkrementelle Schritte ausführen, wie in meinem letzten Beispiel gezeigt, und jeden Monat einen neuen, nicht inkrementellen Schritt ausführen. Die neuen inkrementellen Werte hängen von diesen nicht inkrementellen Werten ab und Sie können die alten Snapshots löschen.

Oder schauen Sie sich andere Backup-Lösungen an. Es gibt rsnapshot , das rsyncharte Links verwendet. Es macht einen sehr guten Job bei der Rotation und ist sehr bandbreiteneffizient, da es nur einmal eine vollständige Sicherung erfordert.

Dann gibt es Bareos . Es führt inkrementelle Schritte aus, die Bandbreite und Platz sparen. Es hat eine sehr schöne Eigenschaft; Es kann eine vollständige Sicherung aus einer Reihe von Inkrementalen berechnen. Auf diese Weise können Sie alte inkrementelle Daten löschen. Aber es ist ein ziemlich komplexes System und für größere Konfigurationen gedacht.

Die beste Lösung ist jedoch die Verwendung von ZFS auf der Empfängerseite. Es wird bandbreiteneffizient, speichereffizient und viel schneller als die anderen Lösungen sein. Der einzige wirkliche Nachteil, den ich mir vorstellen kann, ist, dass Sie mindestens 8 GiB ECC-Speicher auf dieser Box haben sollten (4 GiB sind möglicherweise in Ordnung, wenn Sie keine Dienste ausführen und sie nur verwenden zfs receive).

Marco
quelle
ja das weiß ich. Aber was ist, wenn ich den Dateidatensatz @ 2014-02-04 lösche (weil ich nur einen Verlauf von 30 Tagen haben möchte)? Dann habe ich erst die Änderungen nach dem 4. Februar vorgenommen, aber nicht jede Datei.
Martin Grohmann
2
@MartinGrohmann Ich verstehe was du jetzt meinst. Nun, das ist das Schöne an ZFS. Sie können die alten Snapshots auf ZFS problemlos löschen. Auf anderen Dateisystemen müssen Sie die alten behalten. Vielleicht bist du mit so etwas besser dran rsnapshot. Sie können auch nach einem Monat eine neue, nicht inkrementelle Aktion starten und dann die vorherigen inkrementellen Aktionen löschen.
Marco
Danke für deine Hilfe; Ich habe gerade Doppelspurigkeit festgestellt. Das ist wahrscheinlich der richtige Weg, um Verschlüsselung zu ermöglichen.
Martin Grohmann
2
@MartinGrohmann Duplicity ist ein schönes Programm, aber es leidet unter dem gleichen Problem . Wenn Sie nur inkrementelle Schritte ausführen, wächst Ihr Speicherplatz weiter. Sie können keinen Speicherplatz zurückfordern, ohne Bandbreite zu verschwenden und eine neue vollständige Sicherung durchzuführen. Entweder beidseitig auf ZFS umsteigen oder sich Bareos anschauen , es kann aus inkrementellen Daten eine neue vollständige Sicherung berechnen. So können Sie alte inkrementelle Daten löschen, ohne alles erneut übertragen zu müssen.
Marco
Wenn die Bandbreite von Ihrer Quelle das Problem ist, besteht eine mögliche Lösung (die ich jetzt für mein Heim-ZFS-NAS implementiere) darin, immer nur inkrementelle Daten an Ihren Remotespeicher zu senden, aber einmal im Monat ein Remote-FreeBSD-VPS hochzufahren (z. B. auf digitaler Ozean), der dann den letzten vollständigen Schnappschuss öffnen kann, zfs die Anzahl der inkrementellen Daten darin aufnimmt und dann das Ergebnis als neuen Schnappschuss speichert. Der VPS muss nur so lang sein, dass die neue Basis-Sicherung erstellt werden kann. Digital Ocean verfügt über eine API, die die einfache Erstellung / Zerstörung ihrer VPS ermöglicht. Und Ihr lokales System muss nur inkrementelle Sicherungen senden.
stuckj