[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Datensicherung von ZFS (snapshots) mit rsync


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/