User Tools

Site Tools


freebsd:zfs_rep

ZFS Replication Script

On primary node and backup node

  • set pool
  • link to /etc/periodic/daily/
/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