Was ist eine effektive Offsite-Sicherungsstrategie für einen gespiegelten ZFS-Pool?

9

Ich verwende einen ZFS-Pool, der aus zwei gespiegelten Festplatten besteht. Um Offsite-Backups in Gang zu bringen, habe ich zwei weitere Festplatten gekauft.

Mein ursprünglicher Plan war es, die Offsite-Sicherung zu erstellen, indem ich eine dritte Festplatte an den Spiegel anschließe, darauf warte, dass ZFS stabilisiert wird, dann das Laufwerk abtrenne und es außerhalb des Standorts trage. Dies funktioniert gut genug, aber ich war überrascht, dass es jedes Mal, wenn eine Festplatte angeschlossen wird , einen vollständigen Resilver ausführt (ich habe gelesen und möglicherweise missverstanden, dass jeder Anhang zu einem inkrementellen oder Delta-Resilver führen würde). Dies führt dazu, dass Backups länger dauern als akzeptabel.

Meine Anforderungen sind eine Offsite-Kopie meines Zpools und all seiner Schnappschüsse, die ich täglich drehen kann. Dies bedeutet, dass das Resilvering höchstens 24 Stunden dauern muss - derzeit ist es fast so weit, aber unsere Pläne, unseren Pool zu vergrößern, werden ihn über diesen Zeitraum hinausschieben.

Wie kann ich Offsite-Backups aufbewahren, für die kein vollständiger Resilvering-Vorgang erforderlich ist? Sollte ich auf meinen Sicherungslaufwerken ein anderes Dateisystem verwenden (z. B. ein Image exportieren, anstatt es in den ZFS-Pool aufzunehmen)? Sollte ich die Backups in einem separaten Pool haben und neue Snapshots an sie senden, wenn sie erstellt werden?

STW
quelle
Meine derzeitige Strategie ist die Multiple-Pool-Methode, bei der zfs senden und empfangen, um Snapshots synchron zu halten. Würde gerne hören, wenn Sie ein Argument gegen diese oder eine bessere Option gefunden haben.
So12311

Antworten:

3

Nach vielem Basteln und Experimentieren habe ich eine Lösung gefunden, wenn auch mit einem ziemlich großen Kompromiss.

Zunächst die Optionen, die ich ausschließen musste:

  • Ein zweiter externer ZFS-Server mit gespiegeltem Pool war aus Kostengründen keine Option. Wäre dies eine Option gewesen, wäre dies bei weitem der beste Ansatz gewesen, ZFS-Senden / Empfangen zu verwenden, um Snapshots an den Remote-Pool zu senden.

  • Ich habe einen zweiten gespiegelten ZFS-Pool vor Ort, aus dem ich Festplatten entfernen und mit nach Hause nehmen kann. Dies ist praktikabler als die erste Option, aber ich würde den zweiten Pool benötigen, um immer zwei Festplatten vor Ort zu haben (oder um zwei Datenkopien auf einer einzelnen Festplatte vor Ort zu verwenden). Derzeit habe ich vier Festplatten und keinen Platz mehr für eine fünfte auf dem Server. Dies wäre ein fairer Ansatz, aber immer noch nicht ideal.

  • Verwenden von ZFS zum Anhängen und Trennen, um die Sicherungsdiskette in den gespiegelten Pool hinein und aus diesem heraus zu drehen. Dies funktioniert gut, muss jedoch jedes Mal, wenn die Festplatte hinzugefügt wird, einen vollständigen Resilver ausführen. Das dauert unannehmbar lange und ich konnte mich nicht darauf verlassen.

Meine Lösung ähnelt der Verwendung von attachund detachverwendet jedoch onlineund offline. Dies hat den Vorteil, dass ein Delta-Resilvering gegenüber einem vollständigen Resilvering durchgeführt wird. Der Nachteil besteht jedoch darin, dass der Pool immer einen DEGRADEDStatus meldet (der Pool verfügt immer über zwei Festplatten; die rotierenden externen Festplatten werden markiert, offlinewenn sie sich im Remote-Speicher und im Resilver befinden, und werden dann online geschaltet wenn sie vor Ort sind).

Ein kurzer Rückblick und ein Überblick über mein Setup:

Ich habe einen ZFS-Server und vier identische Festplatten. ZFS ist so eingerichtet, dass ein gespiegelter Pool verwendet wird. Zwei der vier Festplatten sind ständige Mitglieder dieses Pools. Die anderen beiden Scheiben drehen sich; Einer befindet sich immer im externen Speicher, der andere ist Teil des Pools, um als sofort einsatzbereites Backup zu fungieren.

Wenn es darum geht, die Backups zu drehen:

  • Ich warte auf einen zfs scrubAbschluss, um sicherzustellen, dass die Sicherungsdiskette fehlerfrei ist

  • Ich zfs offlinedie Festplatte, die entfernt werden wird. Nachdem es offline war, musste ich hdparm -Y /dev/ides herunterdrehen. Nach einer Minute entferne ich den Schlitten teilweise (gerade genug, um den Stromausfall sicherzustellen) und gebe ihm dann eine weitere Minute, bevor ich das Laufwerk vollständig ziehe, um sicherzustellen, dass es sich nicht mehr dreht. Die Festplatte wird in einem statischen Beutel und dann in einer Schutzhülle aufbewahrt und befindet sich außerhalb des Standorts.

  • Ich bringe die andere Offsite-Festplatte mit. Es wird im Hotswap-Fach installiert und dreht sich. Ich verwende zfs online, um die Festplatte im Pool wiederherzustellen und ein partielles Resilvering zu starten, um sie gleichzeitig zu machen.

Dieses System garantiert, dass ich zu jedem Zeitpunkt zwei ONLINESpiegelplatten und eine OFFLINERemote-Platte (die gesäubert wurde) habe. Die vierte Festplatte wird entweder ausgelagert oder ist online. Dies hat den Vorteil, dass bei einem Ausfall eines laufenden Laufwerks der Pool wahrscheinlich immer noch aus zwei Online-Festplatten besteht.

Es hat in den letzten Wochen gut funktioniert, aber ich würde dies immer noch als hackigen Ansatz betrachten. Ich werde nachgehen, wenn ich auf größere Probleme stoße.


Update: Nachdem ich ein paar Monate damit gearbeitet habe, habe ich festgestellt, dass das Resilvering in meiner realen Verwendung für das Trennen / Anhängen und Offline / Online dieselbe Zeit benötigt. Bei meinen Tests glaube ich nicht, dass ich ein Scrub ausgeführt habe. Meine Vermutung ist, dass ein Laufwerk, das für ein Scrub offline ist, einen vollständigen Resilver benötigt.

STW
quelle
Funktioniert dies definitiv nicht mit nur drei statt vier Geräten? Das Oracle Solaris ZFS-Administrationshandbuch besagt, dass ein Spiegelpool fehlerhaft ist "Wenn alle Komponenten eines Spiegels entfernt werden" [Hervorhebung von mir], was zu bedeuten scheint, dass ein viertes Laufwerk nicht unbedingt erforderlich ist.
Kenny Evitt
1
Mit drei Geräten meinen Sie zwei Festplatten, die sich immer im Pool befinden, und eine, die sich gelegentlich außerhalb des Standorts befindet, oder eine Festplatte, die sich immer im Pool befindet, und zwei, die sich außerhalb des Standorts drehen? Bei der zweiten Option würde ich einen Datenverlust erwarten, wenn der Pool auf fehlerhafte Daten stößt, während nur eine vollständig online verfügbare Festplatte vorhanden ist (wenn die zweite Festplatte entweder gedreht oder noch nicht vollständig ausgelastet ist). Meine zwei Cent sollen immer sicherstellen, dass Ihr gespiegelter Pool über zwei Vollzeit-Online-Festplatten verfügt.
STW
Ich meinte die zweite Option, die Sie erwähnen. Wie wahrscheinlich sind bei dieser Option fehlerhafte Daten, wenn nur eine Festplatte online ist? Das partielle / inkrementelle Resilvering sollte relativ schnell sein, oder? Und selbst wenn es schlechte Daten gab, sollten Sie nicht in der Lage sein, sich vom zweiten Laufwerk zu erholen? Oder vom dritten Laufwerk erholen, schlimmster Fall? [Offensichtlich gibt es Szenarien, in denen eine Wiederherstellung nicht möglich ist. Aber das gilt auch für vier Laufwerke. oder eine beliebige Zahl tatsächlich.]
Kenny Evitt
Ich würde mich daran halten, immer zwei gespiegelte Online-Festplatten zu haben, wobei eine dritte und eine vierte zum Drehen von Sicherungen verwendet werden. Jedes Mal, wenn Sie nur eine Online-Festplatte in einem Spiegel haben, sind Sie anfällig - und selbst bei meinem Ansatz besteht das Risiko, dass die Offsite-Sicherungsdiskette Integritätsprobleme entwickelt und nicht zu 100% wiederherstellbar ist (im Idealfall) Es können jederzeit zwei gespiegelte Festplatten außerhalb des Standorts sein, damit die Integrität der beiden verglichen werden kann.
STW
Zusammenfassend geht es bei ZFS darum, eine einzelne Kopie von Daten zu vermeiden (oder zumindest Parität zu haben, um die Rekonstruktion fehlerhafter Daten zu ermöglichen). Wenn Sie nur eine Online-Festplatte oder eine Kopie der Sicherungsdaten haben, besteht die Gefahr eines Datenverlusts.
STW
2

Warum sendet zfs Ihre Snapshots nicht an einen Remote-ZFS-Computer? Ich benutze dafür ein einfaches Bash-Skript:

#!/usr/local/bin/bash
# ZFS Snapshot BASH script by Shawn Westerhoff
# Updated 1/14/2014

### DATE VARIABLES
# D = Today's date
# D1 = Yesterday's date
# D# = Today less # days date
Y=$(date -v-1d '+%m-%d-%Y')
D=$(date +%m-%d-%Y)
D1=$(date -v-1d '+%m-%d-%Y')
D10=$(date -v-10d '+%m-%d-%Y')
D20=$(date -v-20d '+%m-%d-%Y')

# Step 1: Make the snapshots

for i in $( zfs list -H -o name ); do
    if [ $i == tier1 ]
    then echo "$i found, skipping"
    else
    zfs snapshot $i@$D
    fi
done

# Step 2: Send the snapshots to backup ZFS sever

    for i in $( zfs list -H -o name ); do
        zfs send -i $i@$D1 $i@$D | ssh -c arcfour root@10.10.10.10 zfs recv $i
    done

# Step 3: Destroy snapshots that are 20 days old

for i in $( zfs list -H -o name ); do
        if [ $i == tier1 ]
        then echo "$i found, skipping"
        else
        zfs destroy $i@$D20
        fi
done
Shawn Westerhoff
quelle
0

Ich habe ein Tool namens snapdump erstellt , mit dem Sie inkrementelle Speicherauszüge Ihrer zfs-Datasets in einem fremden (nicht zfs) Dateisystem erstellen können. Snapdump unterstützt auch die Wiederherstellung einer inkrementellen Snapshot-Kette mit einem einzigen Befehl.

Omry Yadan
quelle