zfsync.sh: send incremental zfs snapshots to another server
This commit is contained in:
parent
bd67510ceb
commit
2134b66df9
1 changed files with 59 additions and 0 deletions
59
zfsync.sh
Executable file
59
zfsync.sh
Executable file
|
@ -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
|
Loading…
Reference in a new issue