Table of Contents

Création de snapshots de système de fichiers XFS

L'atelier consiste à reprendre les données des répertoires /data/ops et /data/petra de l'ancien serveur vers le partage NFS du nouveau serveur, et d'ammorcer les snapshots journaliers avec des liens physqiues comme POC.

Les dossiers dans lesquels sont hébergés ces liens sont libellés avec le numero du jour du mois

 mkdir -pv /data/backups/{01..31}/ops /data/backups/{01..31}/petra

Contrairement aux snapshots btrfs ou xfs, les images créées avec cette méthode sont interdépendantes, les fichiers référencés avec un lien physique sont ceux de la source. Si on altère le source on altère le fichier référencé dans le dossier de backup et vice-versa, mais lorsqu'on détruit l'inode de la source le fichiers hard linked subsistent.

Les scripts de synchronisation

Les Scripts ont la même structure et déroulent le même algorithme:

cat > ~/syncro-nfsshare-ops.sh << 'EOF' 
#!/bin/bash

# Script pour faire un snapshot en utilisant les liens physiques

set -o errexit
set -o nounset
set -o pipefail

readonly SOURCE_DIR="/data/ops/"
readonly BACKUP_DIR="/nfsshare/ops/"
LC_TIME="fr_FR.UTF-8" BACKUP_PATH="/nfsshare/backups/$(date -d yesterday +%d)/ops/"

rsync -av --delete ${SOURCE_DIR} ${BACKUP_DIR}>> /root/synchro-nfsshare-ops.log
LC_TIME="fr_FR.UTF-8" TIMEFORMAT="Sauvegarde ${SOURCE_DIR} de "$(date -d yesterday +%A)" en %R secondes ..."
{ time {
cd ${BACKUP_DIR}
for _rep in */ ;  do 
  echo "ammorce de ${BACKUP_PATH}${_rep%/}/"
  LATEST_LINK="${BACKUP_PATH}${_rep%/}/"
  if [ -d "${LATEST_LINK}" ]
    then
    rm -rf "${LATEST_LINK}"
  fi
  mkdir -p "${LATEST_LINK}"
# La commande cp ci-dessous equivaut à la commande rsync avec --link-dest
#  cp -al "${BACKUP_DIR}/${_rep}" "${LATEST_LINK}"
  rsync -a  --link-dest="${BACKUP_DIR}/${_rep}" "${BACKUP_DIR}/${_rep}" "${LATEST_LINK}"
  touch "${LATEST_LINK}/$(date -d yesterday +%A-%w-%d)"
done
"$@" 2>&3
}
} 3>&2 2>> /root/synchro-nfsshare-ops.log
tail -n40 /root/synchro-nfsshare-ops.log | mailx -s "synchro nfsshare ops $(date)" -S smtp=smtp://smtp.oc.dgfip:25 -S from="esi.marseille.snsreseau@dgfip.finances.gouv.fr" esi.marseille.snsreseau@dgfip.finances.gouv.fr
EOF
cat > ~/syncro-nfsshare-petra.sh << 'EOF' 
#!/bin/bash

# Script pour faire un snapshot en utilisant les liens physiques

set -o errexit
set -o nounset
set -o pipefail
 
readonly SOURCE_DIR="/data/petra/"
readonly BACKUP_DIR="/nfsshare/petra/"
LC_TIME="fr_FR.UTF-8" BACKUP_PATH="/nfsshare/backups/$(date -d yesterday +%d)/petra/"

rsync -av --delete ${SOURCE_DIR} ${BACKUP_DIR}>> /root/synchro-nfsshare-petra.log
LC_TIME="fr_FR.UTF-8" TIMEFORMAT="Sauvegarde ${SOURCE_DIR} de "$(date -d yesterday +%A)" en %R secondes ..."
{ time {
cd ${BACKUP_DIR}
for _rep in */ ;  do
  echo "ammorce de ${BACKUP_PATH}${_rep%/}/"
  LATEST_LINK="${BACKUP_PATH}${_rep%/}/"
  if [ -d "${LATEST_LINK}" ]
    then
    rm -rf "${LATEST_LINK}"
  fi
  mkdir -p "${LATEST_LINK}"
# La commande cp ci-dessous equivaut à la commande rsync avec --link-dest
#  cp -al "${BACKUP_DIR}/${_rep}" "${LATEST_LINK}"
  rsync -a  --link-dest="${BACKUP_DIR}/${_rep}" "${BACKUP_DIR}/${_rep}" "${LATEST_LINK}"
  touch "${LATEST_LINK}/$(date -d yesterday +%A-%w-%d)"
done
"$@" 2>&3
}
} 3>&2 2>> synchro-nfsshare-petra.log
tail -n40 /root/synchro-nfsshare-petra.log | mailx -s "synchro nfsshare petra $(date)" -S smtp=smtp://smtp.oc.dgfip:25 -S from="esi.marseille.snsreseau@dgfip.finances.gouv.fr" esi.marseille.snsreseau@dgfip.finances.gouv.fr
EOF

Les tests de synchronisation

Première synchronisation

source cible backup mercredi
chemin volumétrie chemin volumétrie chemin volumétrie
/data/petra 929G /data/petra 929G /data/backups/mercredi/petra 929G
/data/ops 254G /data/ops 254G /data/backups/merceredi/ops 254G
Total 1,2T 1,2T 1,2T
Sur Disque 1,2T 1,2T <1G

En regardant le fichier o51e/home/nagios/MegaSAS.log on observe que les deux versions du fichier sont identiques (même inode, même taille et même date)

 ls -ali /data/ops/o51e/home/nagios/MegaSAS.log
6232096771 -rw-r--r--. 1 root root 4827776011 28 déc.  20:40 /data/ops/o51e/home/nagios/MegaSAS.log
 ls -ali /data/backups/mercredi/ops/o51e/home/nagios/MegaSAS.log
6232096771 -rw-r--r--. 1 root root 4827776011 28 déc.  20:40 /data/backups/mercredi/ops/o51e/home/nagios/MegaSAS.log

Si on altère le contenu du clone de backup on s'aperçoit qu'on affecte aussi le fichier source, il s'agit bien d'un lien physique:

echo "ligne ajoutée">> /data/backups/mercredi/ops/o51e/home/nagios/MegaSAS.log
ls -ali /data/backups/mercredi/ops/o51e/home/nagios/MegaSAS.log
6232096771 -rw-r--r--. 2 root root 4829513818 30 déc.  07:27 /data/backups/mercredi/ops/o51e/home/nagios/MegaSAS.log
ls -ali /data/ops/o51e/home/nagios/MegaSAS.log
6232096771 -rw-r--r--. 2 root root 4829513818 30 déc.  07:27 /data/ops/o51e/home/nagios/MegaSAS.log

Deuxième synchronisation

source cible backup mercredi backup jeudi
chemin volumétrie chemin volumétrie chemin volumétrie chemin volumétrie
/data/petra 929G /data/petra 929G /data/backups/mercredi/petra 929G /data/backups/Thirsday/petra 929G
/data/ops 254G /data/ops 254G /data/backups/merceredi/ops 254G /data/backups/Thirsday/ops 254G
Total 1,2T 1,2T 1,2T 1,2T
Sur Disque 1,2T 1,2T <1G <1G

En regardant le fichier o51e/home/nagios/MegaSAS.log on observe:

 ls -ali /data/ops/o51e/home/nagios/MegaSAS.log
6175290448 -rw-r--r--. 2 root root 4829513803 29 déc.  20:40 /data/ops/o51e/home/nagios/MegaSAS.log
 ls -ali /data/backups/Thursday/ops/o51e/home/nagios/MegaSAS.log
6175290448 -rw-r--r--. 2 root root 4829513803 29 déc.  20:40 /data/backups/Thursday/ops/o51e/home/nagios/MegaSAS.log
 ls -ali /data/backups/mercredi/ops/o51e/home/nagios/MegaSAS.log
6232096771 -rw-r--r--. 1 root root 4827776011 28 déc.  20:40 /data/backups/mercredi/ops/o51e/home/nagios/MegaSAS.log

Autres synchronisations

On observe une augmentation de la taille sur le disque dur, mais pas autant que le cumul des sauvegardes quotidiennes

Sauvegarde Nombre5) Taille sur le disque
Mercredi 2 1,2T
Jeudi 3 1,3T
Vendredi 4 1,3T
Lundi 76) 1,4T

Programmation des sauvegardes

Configuration de crontab

Pour ajouter aou modifier crontab utiliser la commande crontab -e:

# minute heure jour-du-mois numero-du-mois jour-de-la-semaine(6=samedi)
#0 8 25 8 6 rsync -avP /data/ops/o13e /data/ops-o13e-25aout2018/ 2>&1 >> /data/sauveOPS.log

Chronogramme des travaux

0h00 24h00 24h00 J-1 J | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 12h00 li87a 20h00 t13a 21h30 t51a 21h40 t63a 21h50 t44a 21h55 t44c 1h10 t44v 1h20 st67a 3h00 t13a 5h30 t51a 5h40 t63a 5h50 t44a 5h55 syncro nfsshare 12h00
1) , 2) , 3)
le script est programmé avant la sauvegarde du jour c'est à dire après la sauvegarde de la veille
4)
Un fichier n'est totalement supprimé que lorsque tous les liens vers l'inode ont été supprimés, l'inode lui-même sera supprimé
5)
en comptant la sauvegarde source
6)
en comptant les sauvegardes de samedi et dimanche