freebsd:zfs_rep
ZFS Replication Script
On primary node and backup node
- /scripts/clean_snaps.sh
#`date -v -1d +"$type%Y-%m-%d"`
pool="zvol1/vol1"
# iterate i from 15 to 62
# any snapshot older than 2 weeks (14 days) or (15-62 days) old is deleted
for i in 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
do
CLEANDATE=`date -v -${i}d +"$type%Y-%m-%d"`
CLEAN_SNAP="${pool}@${CLEANDATE}"
#echo $CLEAN_SNAP
if zfs list -H -o name -t snapshot | sort | grep "$CLEAN_SNAP" > /dev/null;
then
zfs destroy -r $CLEAN_SNAP
fi
done
On primary node
set pool, host, and destination
link to /etc/periodic/daily/
- /scripts/zfs_rep.sh
#!/bin/sh
pool="tank/vol1"
destination="tank"
remote_pool="tank/vol1"
host="192.168.0.10"
today=`date +"%Y-%m-%d"`
yesterday=`date -v -1d +"$type%Y-%m-%d"`
#yesterday="2017-01-07"
# create today snapshot
snapshot_today="${pool}@${today}"
# look for a snapshot with this name
if zfs list -H -o name -t snapshot | sort | grep "${snapshot_today}" > /dev/null; then
echo " snapshot, ${snapshot_today}, already exists"
# exit 1
else
echo " taking todays snapshot, ${snapshot_today}"
zfs snapshot -r ${snapshot_today}
fi
# look for yesterday snapshot
snapshot_yesterday="$pool@$yesterday"
snapshot_yesterday_r="$remote_pool@$yesterday"
snapshot_today_r="$remote_pool@${today}"
snapshot_start=""
snapshot_end=""
ss_list_local="`zfs list -H -o name -t snapshot | grep ${pool} | cut -d \"@\" -f2 | sort -r`"
ss_list_remote="`ssh root@${host} \"zfs list -H -o name -t snapshot | grep ${remote_pool} | cut -d \"@\" -f2 | sort -r\"`"
#echo $snapshot_yesterday
if ssh root@$host "zfs list -H -o name -t filesystem | sort | grep \"${remote_pool}\"" > /dev/null; then
echo " Pool found on remote"
else
echo " Pool missing on remote, aborting"
exit 1;
fi
if zfs list -H -o name -t snapshot | sort | grep "${snapshot_yesterday}" > /dev/null; then
echo " yesterday snapshot, ${snapshot_yesterday}, exists locally"
for l in $ss_list_local
do
for r in $ss_list_remote
do
if [ "$l" == $r ]; then
snapshot_start="$l"
fi
done
if [ "$snapshot_start" != "" ]; then
break
fi
done
if [ "$snapshot_start" != "" ]; then
echo " found common ss at: ${snapshot_start}"
if ssh root@$host "zfs list -H -o name -t snapshot | sort | grep \"${snapshot_today_r}\"" > /dev/null; then
echo " Remote already has today's snapshot aborting sync"
exit 2
else
echo " proceeding with incremental sync"
echo "zfs send -R -i ${pool}@${snapshot_start} ${snapshot_today} | lzop | ssh root@$host \"lzop -d | zfs receive -Fduv ${destination}\""
zfs send -R -i ${pool}@${snapshot_start} ${snapshot_today} | lzop | ssh root@$host "lzop -d | zfs receive -Fduv ${destination}"
echo " sync complete"
exit 0;
fi
else
echo " yesterday snapshot, ${snapshot_yesterday_r}, missing on destination"
if ssh root@$host "zfs list -H -o name -t snapshot | sort | grep \"${snapshot_today_r}\"" > /dev/null; then
echo " Remote already has today's snapshot aborting sync"
exit 2
else
echo " proceeding with full sync"
zfs send ${snapshot_today} | ssh root@$host "zfs receive -Fduv ${destination}"
echo " sync complete"
exit 0;
fi
fi
else
echo " missing yesterday snapshot aborting, ${snapshot_yesterday}"
exit 1
fi
freebsd/zfs_rep.txt · Last modified: 2017/09/28 21:22 by tschulz