[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Datensicherung von ZFS (snapshots) mit rsync
[Thread Prev] | [Thread Next]
- Subject: Datensicherung von ZFS (snapshots) mit rsync
- From: Raphael Eiselstein <rabe@xxxxxxxxx>
- Date: Tue, 24 Dec 2013 02:58:05 +0100
- To: uugrn@xxxxxxxxxxxxxxx
Hallo Liste,
manchmal will man einen Server, der intensiv mit ZFS-Datasets arbeitet
auf Filesystem-Ebene sichern.
Datensicherungen mit rsync sollte man allerdings immer mit dem Parameter
"-x" ausfuehren, damit nicht unendlich durch unten darunter gemountete
Dateisysteme traversiert wird (etwa in Jails, wo ueberall /freebsd als
nullmount existiert und gigatonnen von Ports und Sourcen enthaelt).
Durch die typischerweise hierachisch angeordneten ZFS-Datasets kann es
aber recht aufwendig werden das Backup-Script immer mit der tendenziell
flexiblen ZFS-Struktur nachzufuehren.
Mein Backup-Script (laeuft unter Linux, sichert einen FreeBSD-Server mit
ZFS) ermittelt daher zunaechst fuer den "interessanten Teil" der Hierachie
alle Filesysteme und Snapshots und erzeugt daraus eine Liste ("ZFS").
Ueber die Filesysteme in der Liste iteriert das Script dann auf der Suche
nach dem *jeweils* aktuellsten Snapshot, der fuer ein (jedes) Dataset
existiert und erzeugt daraus dann einen Job (zunaechst als Liste), der
dann ausgefuehrt wird.
Gesichert werden dann aus jedem Dataset der aktuellste Snapshot auf
Dateisystem-Ebene (.../.zfs/snapshot/<name>/).
.----------
| #! /bin/bash
|
| HOST='fooserv02.example.com'
| BASE_DIR="/backup/${HOST}/"
|
|
| ZFS="$(mktemp --tmpdir zfs_XXXXXX)"
| JOB="$(mktemp --tmpdir job_XXXXXX)"
|
| # create JOB: get all filesystems and snapshots of zroot/jails
| ssh "${HOST}" "zfs list -H -r -o type,name,mountpoint -t snapshot,filesystem zroot/jails" | tr '\t' '|' > "${ZFS}"
|
| while IFS='|' read TYPE DS MNT ; do
| # find most recent snapshot of DataSet
| SRC="${MNT}/.zfs/snapshot/$(grep "^snapshot|${DS}" ${ZFS} | cut -f 2 -d "|" | sort | tail -n 1 | grep -o "@[^@]*$" | cut -f2 -d "@")"
| MNT_FLAT="${MNT//\//_}"
| DST=${BASE_DIR}/${MNT_FLAT}/
| LOG="${BASE_DIR}/${MNT_FLAT}.log"
| echo "${DS}|${MNT}|${SRC}|${DST}|${LOG}"
| done < <(grep "^filesystem|" "${ZFS}") > "${JOB}"
|
| # run job
| while IFS='|' read DS MNT SRC DST LOG; do
| sleep 1
| echo "-------------------------------------------"
| echo "Backup DataSet=${DS} (mounted on ${MNT})"
| echo "rsync from ${HOST}:${SRC} to ${DST}"
| echo "logging into ${LOG}"
| /usr/bin/rsync -aHx --itemize-changes --progress --stats --exclude=tmp/ --exclude=thumb/ --exclude=var/squid/ --delete --delete-excluded --log-file="${LOG}" "${HOST}:/${SRC}/" "${DST}"
| echo "-------------------------------------------"
| done < "${JOB}"
|
`----------
Das Dataset zroot/jails/foo/bar (gemountet nach /jails/foo/bar) wird
dabei von
$HOST:/jails/foo/bar/.zfs/snapshot/<neuester>/
nach
/backup/$HOST/_jails_foo_bar/
ge-rsynct, also *flach*. ebenso auch nach
.../_jails/
.../_jails_foo/
.../_jails_foo_bla/
.../_jails_xyz_abc_hjk_yyy/
sofern die jeweiligen Datasets/Mountpoints existieren.
Der Vorteil die ZFS-Snapshots zu sichern liegt auf der Hand:
Diese werden z.B. taeglich einmal fuer zroot/jails (und alle darunter
liegenden Filesysteme) erzeugt.
Sichert man nun die jeweiligen Snapshots anstatt direkt die gemounteten
Dateisysteme so erhaelt man eine Datensicherung, die von vorne bis hinten
den exakt selben Zeitpunkt umfasst und nicht je nach Laufzeit vom ersten
bis zum letzten ZFS/Jail eine Differenz von 1-2 Stunden, so bekomme ich
beispielsweise alle Dateisysteme von exakt 6 Uhr morgens (Snapshot-Time),
auch wenn der Abtransport der Datensicherung zB erst um 7 Uhr loslaeuft
und vielleicht bis 8 Uhr benoetigt. Selbst wenn der Abtransport
unterbrochen wird und neu angesetzt wird, bleibt der Snapshot als Quelle
vollkommen statisch.
Have fun!
Raphael
--
Raphael Eiselstein <rabe@xxxxxxxxx> http://rabe.uugrn.org/
xmpp:freibyter@xxxxxx | https://www.xing.com/profile/Raphael_Eiselstein
PGP (alt): E7B2 1D66 3AF2 EDC7 9828 6D7A 9CDA 3E7B 10CA 9F2D
PGP (neu): 4E63 5307 6F6A 036D 518D 3C4F 75EE EA14 F625 DB4E
.........|.........|.........|.........|.........|.........|.........|..
--
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/