Sichern Sie den ZFS-Pool mit rsync

1919
Octaviour

Ich habe derzeit eine FreeNAS-Box zum Speichern meiner persönlichen Dateien. Ich hätte gerne eine Off-Site-Sicherung, aber ich bin nicht bereit, das Geld für einen zweiten Computer auszugeben, der ZFS ordnungsgemäß ausführen kann. Daher plante ich, die Remote-Backups mit zu machen rsync.

Ich möchte, dass alle Dateien in der Sicherung konsistent sind. Ich dachte, ich könnte dies tun, indem ich zuerst einen rekursiven Schnappschuss mache und ihn dann mithilfe von übertrage rsync. Es stellt sich jedoch heraus, dass für jedes Dataset ein separater Snapshot erstellt wird.

Jetzt frage ich mich, ob es einen Weg gibt, einen rekursiven Snapshot, einschließlich aller Datensätze, anzuzeigen, oder ob es einen anderen empfohlenen Weg zum rsyncGesamtbild gibt zpool. Ich denke nicht, dass es einfach ist, einfach mit den .zfsOrdnern in den Datensätzen zu verlinken, da ich rsyncalle in den Datensätzen selbst vorhandenen Symlinks beibehalten möchte .


Bearbeiten

Aufgrund der Kommentare, die ich erhalten habe, sind meiner Meinung nach einige Details zu meiner gewünschten Konfiguration vorhanden. Ich bin auf der Suche nach einem NAS zu Hause, auf dem ich bequem Daten ablegen kann, in dem Wissen, dass es unwahrscheinlich ist, dass ich es jemals verlieren werde. Für mich bedeutet das, mehrere Kopien vor Ort, mehrere Kopien außerhalb des Standorts, eine Offline-Kopie für den Fall, dass die Dinge wirklich schlecht werden, periodische Momentaufnahmen der Daten im Falle eines versehentlichen Löschens und ein Mittel zur Vermeidung von Datenfehlern (z. B. Bit Rot). Je unwahrscheinlicher das Ereignis ist, desto entspannter bin ich, wenn ich nach einer Katastrophe nicht mehrere Kopien der Daten habe und weniger Momentaufnahmen. Ich interessiere mich auch mehr für alte Daten als für neue Daten, da ich normalerweise eine Kopie auf einem anderen Gerät habe. Schließlich sollte ich beachten, dass die meisten Dateien nicht zu oft aktualisiert werden. Bei den meisten Übertragungen handelt es sich um neue Dateien.

Mein vorheriges Setup bestand aus zwei Raspberry Pi mit angeschlossenen externen 4-TB-Festplatten. Ich verlor das Vertrauen in diese Strategie, aber die Hardware war sofort verfügbar. Nach einigen Nachforschungen schien es, als ob der einzige Weg, um Fehler im Laufe der Zeit zu verhindern, darin bestand, ein Dateisystem mit Prüfsummen wie ZFS und Server-Komponenten wie ECC-RAM und eine USV zu verwenden. Für meine lokale Kopie bin ich diesen Weg gegangen. Ich verwende 2x4TB-Festplatten im Spiegel und mache hier regelmäßig Schnappschüsse.

Diese Maschine sollte alle Fälle abdecken, außer für Off-Site- und Offline-Sicherungen. Da ich diese Backups höchstwahrscheinlich nicht benötigen werde, möchte ich nicht zu viel investieren. Ich dachte daher, ich könnte mit den Himbeer-Pis und externen Festplatten fahren, die ich schon herumliegen hatte. Ich könnte es so machen, dass eine der Festplatten immer offline ist, während die andere die Sicherungen erhält. Das Wechseln der Festplatten in regelmäßigen Abständen würde dann eine Offline-Sicherung meiner älteren Daten ermöglichen.

Der einfache Weg wäre zu verwenden zfs sendund receivezu zwei Pools, einer auf jeder Platte. Der Raspberry Pi, kombiniert mit der USB-Verbindung zur Festplatte, würde jedoch zfs(oder ein Dateisystem für diese Angelegenheit) keine sehr verlässliche Umgebung für den Betrieb bereitstellen . Daher erwarte ich, dass in diesem Setup regelmäßig Fehler auftreten. Da ich nur eine Platte verwende, zfshätte ich keine zuverlässigen Mittel zur Wiederherstellung nach einem Ausfall.

Das ist der Grund, aus dem ich gerne gehen würde ext3oder mit ihm ext4kombiniert würde rsync. Sicher, einige fehlerhafte Bits könnten auf die Festplatte geschrieben werden. Bei Metadaten gibt es Tools, um die meisten dieser Probleme zu beheben. Bei Datenblöcken würde dies zum Verlust einer einzelnen Datei führen. Die Datei könnte auch mit wiederhergestellt werden, rsync -cda dies eine falsche Prüfsumme ergibt und die Datei erneut von der als fehlerfrei bekannten Kopie auf den lokalen Computer übertragen wird. Angesichts der nicht idealen Hardware scheint dies die bestmögliche Lösung zu sein.

Das ist meine Begründung für die Verwendung rsync, die mich zu der ursprünglichen Frage führte, wie man sich rsynczurückziehen sollte zfs snapshot. Wenn ich keinen Ihrer Ratschläge angesprochen habe, lassen Sie es mich wissen, da ich wirklich offen für Alternativen bin. Ich sehe gerade nicht, wie sie mir einen Vorteil verschaffen.

0

3 Antworten auf die Frage

1
Attie

Ich würde mit sehr empfehlen zfs sendund zfs receiveüber rsync- es wird deutlich schneller sein und kommt mit anderen großen Vorteile (zB: nicht fehlen Änderungen, Verschlüsselung ohne die Schlüssel zu benötigen).

Es gibt Speicherdienste, die Ihnen die Möglichkeit geben, Datensätze zu ihnen zu pushen (ähnlich wie bei der Verwendung eines Dienstes, der dies unterstützt rsync).

Es gibt sogar ein schönes Werkzeug syncoid(Teil des sanoid- Projekts), das ich sehr empfehlen kann. Es verwaltet Momentaufnahmen und ermöglicht Push- oder Pull-Vorgänge.

Dieser Vortrag diskutiert die Unterschiede zwischen zfs send/recvund rsync.


Als Folgemaßnahme bin ich gerade von Obnam (das jetzt im Ruhestand ist) abgewandert und habe mich mit ZFS mit Schnappschüssen entschieden. Ich habe auch gerade den Prozess der Untersuchung von Speicherdiensten außerhalb des Standorts durchlaufen und bin zu dem Schluss gekommen, dass das Erstellen und Hosten eines Computers an einem Remote-Standort billiger ist als der Einsatz eines dedizierten Speicherdienstes die ~ 1-Jahres-Marke ... obwohl Sie natürlich Ihre eigene Entscheidung treffen.


Um auf einige Ihrer Aussagen einzugehen:

Ich bin nicht bereit, das Geld für einen zweiten Computer auszugeben, der ZFS ordnungsgemäß ausführen kann.

Es ist erwähnenswert, dass ZFS kein ECC-RAM verwenden muss und dass Sie ZFS problemlos auf einer einzelnen Festplatte ausführen können - es handelt sich hierbei um eine Off-Site-Sicherung, daher könnte dies für Sie akzeptabel sein.

Für mich war der Bau meiner eigenen Maschine ungefähr so ​​teuer wie der Cloud-Speicher.

Wie ich oben bereits erwähnt habe, habe ich einige Berechnungen angestellt und bin zu dem Schluss gekommen, dass der Bau eines billigen Off-Site-Rechners günstiger wäre, als für ein Jahr " Cloud-Speicher " von einem Diensteanbieter zu zahlen ... also zahlte ich im Vorfeld für den Bau solcher Maschinen. und innerhalb eines Jahres werde ich Einsparungen sehen. " Cloud Storage " ist nicht etwas, das Sie kaufen - Sie müssen dafür bezahlen.

Es gibt auch weitere Vorteile - Ich kann der Person, die meine Maschine hostet, Dienste und Backups außerhalb des Standorts anbieten ... etwas, das sie in diesem Fall überhaupt nicht hatten.

Für mich war der Bau meiner eigenen Maschine ungefähr so ​​teuer wie der Cloud-Speicher. Da ich gerne bastle und da ich durch den Bau meiner eigenen Maschine (Plex, VPN, Git-Repos usw.) einige zusätzliche Funktionen erhalten kann, entschied ich mich, diesen Weg zu gehen. Mir ist klar, dass ich im Idealfall ein Backup auf einem ähnlichen Computer durchführen würde, aber das wäre zu teuer (genauso wie das Backup in die Cloud). Für den Fall, dass meine Wohnung niederbrennt oder ich etwas möchte, hätte ich gerne zwei Off-Site-Backups. Ich brauche keine Versionierung oder irgendetwas, ich möchte nur meine Dateien in diesem extremen Fall. Deswegen würde ich gerne rsync oder ähnliches verwenden. Octaviour vor 6 Jahren 0
Ich bin mir nicht sicher, ob ich deiner Logik folge. Ich habe meine Antwort aktualisiert, um einige Punkte zu klären. Attie vor 6 Jahren 0
Ich kann ZFS nicht mit falscher Hardware ausführen. Ein einzelner Speicherfehler an einem fehlerhaften Speicherort kann zu viele Daten beschädigen, möglicherweise ohne dass ich es merkt. Außerdem habe ich derzeit ein Raspberry Pi und eine externe Festplatte aus einem anderen Projekt. Die "rsync" - Straße ist daher mit null Kosten verbunden. Durch die Formatierung in `ext4` ist es auch einfacher, das Laufwerk auszulesen, falls Probleme auftreten. Octaviour vor 6 Jahren 0
"_improper hardware _"? ... haben Sie die Links gelesen? Ich gebe dir, dass ein RPi kein großartiger ZFS-Host sein wird ... Attie vor 6 Jahren 0
Um ehrlich zu sein, habe ich den Artikel vor ein paar Monaten gelesen. Ich lese es einfach noch einmal. Für mich scheint es, dass kein Dateisystem ohne ECC-RAM zuverlässig funktionieren kann. Direkt vor dem Schreiben auf die Festplatte kann es vorkommen, dass ein wenig Flip angezeigt wird. `zfs` nicht schlechter, aber auch nicht besser in dieser Hinsicht. Das Problem mit `zfs` ist in diesem Fall, dass ein einzelner Bitfehler viel schwieriger zu beheben ist. In meinem bearbeiteten, ursprünglichen Beitrag erfahren Sie, wie ich mit "ext" etwas Resilienz erzielen wollte. Octaviour vor 6 Jahren 0
Ich habe es schon gesagt und ich sage es noch einmal ... "_Ich bin ständig überrascht, dass ** irgendetwas ** an allem funktioniert_" Attie vor 6 Jahren 0
1
Dan

Ich stimme mit anderen Antworten überein, die Sie im Allgemeinen besser verwenden zfs send.

Wenn Sie jedoch entschieden haben, rsyncstattdessen zu verwenden, und alles, was Sie möchten, eine konsistente Momentaufnahme des gesamten Pools ist, können Sie dies mit rekursiv tun zfs snapshot. Obwohl die Snapshots zfs listfür jeden betroffenen Datensatz / jedes Volume separat in der Ausgabe von erscheinen, werden sie zu einem konsistenten Zeitpunkt erstellt (dh sie sind " atomar " - alle haben txgim ZFS-internen Wortschatz dasselbe ).

Denken Sie auch, dass "zfs send" eine gute Option für sehr billiges Equipment ist? Octaviour vor 6 Jahren 0
Ich verstehe, dass eine rekursive Momentaufnahme konsistent ist. Ich sehe jedoch nicht, wie ich diesen Snapshot mit `rsync` auf den Remote-Rechner übertragen kann. Anfangs plante ich eine `for`-Schleife in` bash`, die alle Datensätze durchläuft. Da die Datensätze verschachtelt sind, werden nachfolgende Läufe von `rsync` die zuvor geschriebenen Daten entfernen. Octaviour vor 6 Jahren 0
rsync wird mehr Ressourcen als zfs send verwenden, um festzustellen, welche Blöcke sich geändert haben (mehr E / A, mehr Speicher, mehr CPU). Ich sehe also nicht, wie die Verwendung billiger Geräte in diesem Fall eine Rolle spielt. ZFS beansprucht normalerweise wegen des Cache viel RAM, aber das ist für ein System, das gerade Backups erhält, egal. Dan vor 6 Jahren 1
Ressourcen auf dem Remote-Host sind kein Problem, da der einzige Zweck die Sicherungen sind. Der lokale Host wird wahrscheinlich etwas mehr Arbeit erledigen, bietet jedoch die Option, die entfernte Kopie zu korrigieren, wenn er mit `rsync -c 'kombiniert wird, wie oben erläutert. Für mich ist das die zusätzliche Berechnung wert. Weitere Informationen finden Sie im bearbeiteten Originalbeitrag. Octaviour vor 6 Jahren 0
1
Attie

Sie scheinen ziemlich bereit zu sein rsyncund ein RaspberryPi zu verwenden, daher gibt es hier eine weitere Antwort mit ein bisschen Gehirnablage, die Ihnen hoffentlich dabei helfen wird, eine Lösung zu finden.


Jetzt frage ich mich, ob es einen Weg gibt, einen rekursiven Snapshot anzuzeigen, einschließlich aller Datensätze, oder ob es einen anderen empfohlenen Weg gibt, einen gesamten Zpool zu synchronisieren.

Nicht dass ich wüsste ... Ich gehe davon aus, dass die Empfehlungen meinen anderen Antworten entsprechen würden.


Wenn Sie mit dem Ausführen rsyncdes einfachen ZFS-Pools zufrieden waren, können Sie entweder die .zfsVerzeichnisse (sofern für Sie sichtbar) ausschließen rsync --exclude='/.zfs/', oder die snapdir=hiddenEigenschaft festlegen .

Dies führt jedoch zu Problemen, da jedes Dataset an beliebiger Stelle gemountet werden kann und Sie wahrscheinlich keine ...


Sie möchten Schnappschüsse verwalten und einen neuen Schnappschuss für " jetzt " erstellen, sichern und wahrscheinlich danach löschen. Wenn Sie diesen Ansatz verwenden (anstatt nur " live " gemountete Dateisysteme zu verwenden), erhalten Sie eine konsistente Sicherung eines Zeitpunkts. Dadurch wird auch sichergestellt, dass Sie keine fremden Hierarchien sichern oder Dateisysteme verpassen, die möglicherweise an anderer Stelle bereitgestellt werden.

$ SNAPSHOT_NAME="rsync_$(date +%s)" $ zfs snapshot -r $@$ $ # do the backup... $ zfs destroy -r $@$ 

Als Nächstes müssen Sie eine vollständige Liste der Datensätze erhalten, die Sie beim Ausführen sichern möchten zfs list -Hrt filesystem -o name $. Zum Beispiel möchte ich vielleicht meinen usersBaum sichern, unten ist ein Beispiel:

$ zfs list -Hrt filesystem -o name ell/users ell/users ell/users/attie ell/users/attie/archive ell/users/attie/dropbox ell/users/attie/email ell/users/attie/filing_cabinet ell/users/attie/home ell/users/attie/photos ell/users/attie/junk ell/users/nobody ell/users/nobody/downloads ell/users/nobody/home ell/users/nobody/photos ell/users/nobody/scans 

Dadurch erhalten Sie eine rekursive Liste der Dateisysteme, an denen Sie interessiert sind ...

Sie können jedoch bestimmte Datensätze überspringen, und ich würde empfehlen, dazu eine Eigenschaft zu verwenden. Dies rsync:sync=truewürde beispielsweise die Synchronisierung dieses Datensatzes verhindern. Dies ist der gleiche Ansatz, den ich kürzlich hinzugefügt habesyncoid .

Die Felder darunter sind durch ein Tabulatorzeichen getrennt.

$ zfs list -Hrt filesystem -o name,rsync:sync ell/users ell/users - ell/users/attie - ell/users/attie/archive - ell/users/attie/dropbox - ell/users/attie/email - ell/users/attie/filing_cabinet - ell/users/attie/home - ell/users/attie/photos - ell/users/attie/junk false ell/users/nobody - ell/users/nobody/downloads - ell/users/nobody/home - ell/users/nobody/photos - ell/users/nobody/scans - 

Sie müssen dies auch verstehen (wie oben erwähnt), da ZFS-Datasets an beliebiger Stelle gemountet werden können. Es ist nicht in Ordnung, an sie zu denken, wie sie im VFS dargestellt werden. Sie sind separate Entitäten und sollten als solche behandelt werden eine solche.

Um dies zu erreichen, reduzieren wir die Dateinamen des Dateisystems, indem wir jeden Schrägstrich /durch drei Unterstriche ersetzen ___(oder einen anderen Begrenzer, der normalerweise nicht im Namen des Dateisystems erscheint).

$ filesystem="ell/users/attie/archive" $ echo "$" ell___users___attie___archive 

Dies kann alles zu einem einfachen Bash-Skript zusammengefügt werden ...

HINWEIS: Ich habe das nur kurz getestet ... und es sollte mehr Fehlerbehandlung geben.

#!/bin/bash -eu  ROOT="$" SNAPSHOT_NAME="rsync_$(date +%s)" TMP_MNT="$(mktemp -d)"  RSYNC_TARGET="$@$:$"  # take the sanpshots zfs snapshot -r "$"@"$"  # push the changes... mounting each snapshot as we go zfs list -Hrt filesystem -o name,rsync:sync "$" \ | while read filesystem sync; do [ "$" != "false" ] && continue echo "Processing $..."  # make a safe target for us to use... flattening out the ZFS hierarchy rsync_target="$/$"  # mount, rsync umount mount -t zfs -o ro "$"@"$" "$" rsync -avP --exclude="/.zfs/" "$/" "$" umount "$" done  # destroy the snapshots zfs destroy -r "$"@"$"  # double check it's not mounted, and get rid of it umount "$" 2>/dev/null || true rm -rf "$" 
Vielen Dank für all die Mühe, sogar eine Reihe von Skripten zu schreiben, als Sie meinem Standpunkt zunächst nicht einmal zugestimmt haben. Die Iteration über die Datensätze scheint die beste Lösung zu sein. Gibt es einen bestimmten Grund für das Mounten des Snapshots und nicht nur das Kopieren des Verzeichnisses `.zfs / snapshot`? Octaviour vor 6 Jahren 0
Kein Problem, ich hoffe es ist nützlich :-) Attie vor 6 Jahren 0
Der Hauptgrund für die explizite Anbringung an einem bestimmten Ort wäre die Frage "_where is mount? _" (Wie oben erwähnt) ... ohne die `mountpoint'-Eigenschaft des Dateisystems zu prüfen und sich mit allen Problemen zu befassen, die dazu führen, dass Sie nicht sicher sind, wo Sie sich befinden Das Dateisystem erscheint im VFS. Attie vor 6 Jahren 0