[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/