Script de sauvegarde : ZFS + Snapshots + Rsync

Dans un article précédent j’ai commenté la méthode pour réaliser des sauvegardes efficaces avec l’utilisation de ZFS + compression + snapshots + rsync sur FreeBSD. Dans cet article je vous laisse une version simplifiée de l’un des scripts que j’utilise pour réaliser les sauvegardes. Avec quelques modifications vous pouvez facilement l’adapter à votre infrastructure en obtenant la liste des serveurs et des répertoires/fichiers à exclure d’une base de données par exemple.

La compression utilisée dans chaque dataset pour chaque serveur sera héritée du dataset parent que vous dédierez aux sauvegardes.

Le script crée un snapshot pour chaque jour de la semaine qui vont se succéder en rotation, de même il crée un snapshot pour chaque 1er jour de chaque mois, la rotation dans ce cas sera annuelle.

L’entrée « cron » peut être similaire à la suivante pour obtenir un fichier log du résultat qui est sauvegardé sur le serveur de sauvegarde lui-même :

 

0 2 * * * /usr/home/backups/scripts/rsync-external-servers.sh &>> /home/backups/logs/`date +\%Y\%m\%d`-external-rsync.log

 

Le script :

 

#!/usr/local/bin/bash

mydir="$(dirname "$0")"

# srv list: serverconnection@serverpathtosync@destinationdirectory@exclude1|exclude2|exclude3|...
# Examples:
ARR="mymtp.indeax.com@/@mymta.indeax.com@/home/user1
hypervisorlinux07.indeax.com@/var/lib/lxd/storage-pools/zlxd/containers/testvps1/rootfs/@testvps1.indeax.com@/home/user1|/home/user2
hypervisorlinux07.indeax.com@/var/lib/lxd/storage-pools/zlxd/containers/testvps2/rootfs/@testvps2.indeax.com@/home/user1|/home/user2
hypervisorFBSD04@/iocell/jails/2a4e3ea4/root/@testjail1.indeax.com@/home/jl1|/usr/ports
aws34.indeax.com@/@aws34.indeax.com
111.222.111.222@/@externalvps45.indeax.com@/home/bindmountdata|/var/hugetempdata
"

# Data
emailalert="[email protected]"
SSHKEY="$mydir/keys/backup"
LOCALDIR="/usr/home/backups/vps"
USER="root"
ZPOOL="backup/backups/vps"
CIPHER="aes128-ctr"

# RSYNC general command
MYRSYNC="/usr/local/bin/rsync --stats -e \"ssh -i $SSHKEY -c '$CIPHER' -q -x\" -a --numeric-ids -H --delete \
"

# Shared exclude for all rsync
EXCLUDE='--exclude "catalog/product/cache" --exclude "var/po_fpc/" --exclude "media/tmp" --exclude "var/session/" --exclude "var/cache/" \
--exclude "var/report/" --exclude "var/export/" --exclude "/proc" --exclude "/sys" --exclude "/dev" --exclude "/tmp" --exclude "cache/smarty" \
'

##########################################################################
# début boucle
FECHA=`date "+%Y-%m-%d %T"`
DIA=`date +%u`
echo "#########################################################"
echo "## DÉBUT: $FECHA"
echo

for LIN in $ARR; do

# récupérer les données de la chaîne
IFS='@';
ar1=($LIN)
SRV=${ar1[0]} # serveur
SOURCE=${ar1[1]} # source
DESDIR=${ar1[2]} # destination
EXCstr=${ar1[3]} # chaîne d'exclusion

# chemins zfs et sauvegarde
DIRBK=${LOCALDIR}/${DESDIR}
ZFSNAME=${ZPOOL}/${DESDIR}

# créer dataset si inexistant
zfs list $ZFSNAME &> /dev/null
if [[ $? != 0 ]]; then zfs create -p ${ZFSNAME}; fi

# créer snapshots
zfs destroy ${ZFSNAME}@dow${DIA}
zfs snapshot ${ZFSNAME}@dow${DIA}
DAYOM=`date "+%d"`
MONOY=`date "+%m"`
if [[ $DAYOM = '01' ]]; then
zfs destroy ${ZFSNAME}@dom${MONOY}${DAYOM}
zfs snapshot ${ZFSNAME}@dom${MONOY}${DAYOM}
fi

# DÉBUT sauvegarde
FECHA=`date "+%Y-%m-%d %T"`
echo "------------------------"
echo "## DÉBUT Serveur: $FECHA -- $SRV: $SOURCE - $EXCstr"
# récupérer les exclusions pour le serveur
IFS='|'; EXC2=""
for EXCL in $EXCstr; do
EXC2="$EXC2 --exclude '$EXCL'"
done

COMMAND="$MYRSYNC $EXCLUDE $EXC2 $USER@$SRV:$SOURCE ${DIRBK}"

echo "Sauvegarde en cours..."
echo $COMMAND
MYOUT=$(eval $COMMAND 2>&1)
s="$?"

# Vérifier si la sauvegarde s'est bien déroulée
if [[ ! $s -eq 0 && ! $s -eq 23 && ! $s -eq 24 ]]; then
echo "Erreur rsync ($s)"
printf "Erreur rsync ($s) $SRV $SOURCE $FECHA\n$MYOUT" | mail -s "ERREUR SAUVEGARDE: $SRV $SOURCE $FECHA" $emailalert
fi
echo "SORTIE: $MYOUT"

FECHA=`date "+%Y-%m-%d %T"`
echo "### FIN: $FECHA"
echo

done

FECHA=`date "+%Y-%m-%d %T"`
echo
echo "----------------------------"
echo "## FIN: $FECHA"
echo

Laisser un commentaire

Este formulario guarda los datos que indiques de nombre, email y comentario para poder realizar un seguimiento de los comentarios dejados en cada entrada.