From 2134b66df934aeb616fbc79d23c68010c756f268 Mon Sep 17 00:00:00 2001 From: n Date: Sun, 14 Sep 2014 00:36:27 +0200 Subject: [PATCH] zfsync.sh: send incremental zfs snapshots to another server --- zfsync.sh | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100755 zfsync.sh diff --git a/zfsync.sh b/zfsync.sh new file mode 100755 index 0000000..7f11021 --- /dev/null +++ b/zfsync.sh @@ -0,0 +1,59 @@ +#!/bin/sh + +# zfsync: sync zfs pool(s) between two servers + +# in case of failure, unepexpected reboot while syncing, etc.: +# - destroy all snapshots on both local & ${bro} +# - for i in ftp web mail; do zfs send servers/$i/home@newsync | ssh ${bro} zfs receive -vFd servers ;done +# - for i in ftp web mail; do zfs rename servers/$i/home@newsync servers/$i/home@prevsync ;done +# - ssh ${bro} "for i in ftp web mail; do zfs rename servers/$i/home@newsync servers/$i/home@prevsync ;done" + +bro="small" +pools="ftp mail web" + +SENDNSCA=/usr/local/sbin/send_nsca\ -H\ 192.168.3.3\ -d\ ';;'\ -c\ /usr/local/etc/nagios/send_nsca.cfg +HOSTNAME=`/bin/hostname -f | /usr/bin/cut -d '.' -f 1,1` +SERVICENAME=zfsync +LOGFILE=/tmp/zfsync.log +sync_success=1 + +alert() +{ + echo "${HOSTNAME};;${SERVICENAME};;2;CRITICAL - ZFS Sync failed at `date`, please check ${LOGFILE} for complete report." | ${SENDNSCA} >/dev/null + exit $? +} +if [ $1 ] +then +if [ $1 = "init" ] +then +echo "`date`: ZFSync INIT starting." + echo "wiping previous syncs" + for snapshot in `zfs list -t snapshot -o name | grep -e prevsync -e newsync`; do zfs destroy $snapshot ; done + ssh -q ${bro} 'for snapshot in `zfs list -t snapshot -o name | grep -e prevsync -e newsync`; do zfs destroy $snapshot ; done' + echo "making full snapshots" + for jail in $pools; do zfs snapshot servers/$jail/home@newsync;done + echo "sending full snapshots" + for jail in $pools; do zfs send servers/$jail/home@newsync | ssh -q ${bro} 'zfs receive -vFd servers' ;done + echo "renaming them to use them as a base for diff snapshots" + for jail in $pools; do zfs rename servers/$jail/home@newsync servers/$jail/home@prevsync ;done + ssh -q ${bro} 'for jail in ftp mail web; do zfs rename servers/$jail/home@newsync servers/$jail/home@prevsync ;done' + exit $? +fi +fi + +echo "`date`: ZFSync starting." +for pool in $pools +do + dataset="servers/${pool}/home" + echo "making new snapshot for ${pool}" + zfs snapshot ${dataset}@newsync || alert + echo "sending snapshot" + zfs send -i prevsync ${dataset}@newsync | ssh -q ${bro} "zfs receive -vFd servers" || alert + echo "cleaning" + zfs destroy ${dataset}@prevsync || alert + zfs rename ${dataset}@newsync ${dataset}@prevsync || alert + ssh -q ${bro} "zfs destroy ${dataset}@prevsync && zfs rename ${dataset}@newsync ${dataset}@prevsync" || alert +done + +echo +echo "${HOSTNAME};;${SERVICENAME};;0;OK - ZFS Sync succeeded at `date`" | ${SENDNSCA} >/dev/null