[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Review ZFS Backup Script
[Thread Prev] | [Thread Next]
- Subject: Review ZFS Backup Script
- From: Raphael Eiselstein <rabe@xxxxxxxxx>
- Date: Fri, 29 Mar 2013 23:45:41 +0100
- To: uugrn@xxxxxxxxxxxxxxx
Hallo ZFS-Freaks,
ich bastel gerade an einem auf ZFS Snapshots basierendem Backup fuer den
Vereinsserver. Da ich noch nicht arg viel Erfahrung mit ZFS habe,
benoetige ich mal euer Feedback dazu:
== Das Script ==
.........|.........|.........|.........|.........|.........|.........|..
#! /bin/sh
set -x
NOW="$(date +%Y%m%d%H%M%S)"
FS=zroot/home
SRC="${FS}"
DST="tank/backup/uugrn.org/top3/${FS}@${NOW}"
OLD="${SRC}@backup_old"
# snapshot last successfull backup
CURRENT="${SRC}@backup_current"
# create working snapshot (NOW!)
# zroot/home@backup_working_YYYYMMDDHHMMSS
WORK="${SRC}@backup_working_${NOW}"
zfs snapshot "${WORK}"
# send incremental snapshot to destination
zfs send -i "${CURRENT}" "${WORK}" |
buffer -m 20m |
zfs receive -F "${DST}" &&
(
zfs destroy "${OLD}" ; # @backup_old
zfs rename -r "${CURRENT}" "${OLD}" && # @backup_current --> @backup_old
zfs rename "${WORK}" "${CURRENT}" # @backup_work* --> @backup_current
)
.........|.........|.........|.........|.........|.........|.........|..
== Das Ergebnis ==
Wenn das Script erfolgreich (paarmal) durchgelaufen ist, dann ergibt das
folgende Snapshots:
[root@top3 ~]# zfs list -Ht snapshot | grep home | awk '{print $1;}'
tank/backup/uugrn.org/top3/zroot/home@20130329222410
tank/backup/uugrn.org/top3/zroot/home@20130329223631
tank/backup/uugrn.org/top3/zroot/home@20130329223759
tank/backup/uugrn.org/top3/zroot/home@20130329223834
tank/backup/uugrn.org/top3/zroot/home@20130329230014
tank/backup/uugrn.org/top3/zroot/home@20130329230912
tank/backup/uugrn.org/top3/zroot/home@20130329231022
zroot/home@backup_old
zroot/home@backup_current
== Was noch fehlt ==
Was das Script bisher nicht kann: Pruefen, ob zroot/home@backup_current
existiert und falls nicht einen initialen snapshot erzeugen und
nicht-inkrementell (zfs send ohne "-i") nach
tank/backup/uugrn.org/top3/zroot/home@YYYYMMDDHHMMSS zu schieben und
bei Erfolg diesen nicht-inkrementellen snapshot dann umbennen nach
zroot/home@backup_current
== Meine Strategie ==
1) An der Quelle (zroot/*) werden zu Backup-Zwecken nur maximal 2 Snapshots
rollierend angelegt (current, old) und langfristig aufbewahrt, ich erspare
mir eine Loeschtaktik und irgendwelche Script-Konstrukte auf Timestamp-Snapshots.
2) Am Ziel (tank/backup/uugrn.org/top3/zroot/) bekomm ich diese
Snapshots archiviert, es werden (vorerst) keine alten Snapshots
geloescht (wenn hier der Platz eng wird muss ich mir was ausdenken)
3a) Im Falle eines Full-Restore wuerde ich den erforderlichen Stand zB
tank/backup/uugrn.org/top3/zroot/home@20130329230912 kopieren nach
zroot/home@20130329230912 und anschliessend ein "zfs rollback" auf diesen
Snapshot ausfuehren.
3b) Im Falle eines partiellen restores wuerde ich die erforderlichen Dateien
einfach per rsync oder sonstwie kopieren von tank/home nach zroot/home.
== Fragen ==
1) Kann ich irgendwie innerhalb von ZFS an zroot/home@backup_current
eine Freitext-Information einfuegen, in der
tank/backup/uugrn.org/top3/zroot/home@20130329231022 steht? Damit waere
es moeglich zu den nicht-historisierten Snapshots (current, old) den
jeweiigen Historisierungs-Stand zu "merken":
Q: Wohin wurde das letzte Backup geschrieben?
A: zroot/home@backup_current::Freitext-Property
Q: Wohin das Backup davor?
A: zroot/home@backup_old::Freitext-Property
Bitte mit Beispiel.
2) Was ist das *sinnvollste* Command um die Existenz eines Snapshots (zB
zroot/home@backup_current) zu pruefen? zfs get? Ich benoetige das um zu
erkennen, ob "zfs send" inkrementell erfolgen kann oder nicht.
3) Hier geht es erstmal darum, zroot nach tank/backup zu sichern,
Traffic spielt hier kaum eine Rolle (lokale pipes). Allerdings sollen
die Snapshots auch auf andere Server ueberrtagen werden (via ssh). Wie
kann ich *vor* einem "zfs send" ermitteln, wieviele Daten (in MBytes/GBytes)
uebertragen werden?
Ich will hier eine Sollbruchstelle einbauen, dass eine remote-Sicherung
von Snapshots nur dann automatisiert erfolgt, wenn die Datenmenge nicht
zu gross ist.
== Kritik erwuenscht ==
* Gibt es prinzipiell bessere Methoden, Best practises?
* Wird mein Konstrukt irgendwann vor die Wand laufen?
+ mit welchen Auswirkungen?
* Koennte mein Konstrukt wie oben einen Restore gefaehrden?
Danke und Gruss
Raphael
--
Raphael Eiselstein <rabe@xxxxxxxxx> http://rabe.uugrn.org/
xmpp:freibyter@xxxxxx | https://www.xing.com/profile/Raphael_Eiselstein
GnuPG: E7B2 1D66 3AF2 EDC7 9828 6D7A 9CDA 3E7B 10CA 9F2D
.........|.........|.........|.........|.........|.........|.........|..
--
UUGRN e.V. http://www.uugrn.org/
http://mailman.uugrn.org/mailman/listinfo/uugrn
Wiki: https://wiki.uugrn.org/UUGRN:Mailingliste
Archiv: http://lists.uugrn.org/