Depuis quelques temps, nous cherchions une solution de sauvegarde incrémentale des données de nos hébergés.
Après avoir testé de nombreux scripts basiques, des sauvegardes « brutes » directement sur ftp, nous avons conclu que cela s’avérait relativement peu fiable, et souple.

Mais depuis le 28 septembre, un nouveau script est en place et répond parfaitement à la tâche !

Dans nos recherches, nous sommes tombé sur ce site qui proposait un petit script écrit en BASH permettant de créer une ou plusieurs sauvegardes par jour, le tout en minimisant l’espace grâce à l’utilisation des inodes, plutôt que de copier bêtement les fichiers.
Pour simplifier, plutôt que de copier simplement le fichier, il fait un « lien » hard vers celui-ci. Si le fichier venait à être supprimé depuis la première sauvegarde, il ne le serait pas réellement car un autre lien l’utilise.
Ainsi, on se retrouve avec plusieurs liens pour le même fichier.

Nous avons adapté celui-ci afin qu’il ne puisse fonctionner une seule fois simultanément par l’ajout d’un .lock.
Ce .lock est créé au début de l’exécution du script et supprimé à la fin.
Si une autre instance tombe dessus, cela veut dire que le premier script n’a pas terminé son exécution.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
#!/bin/sh
# Source du backup
# Notez ici, qu'il est possible de faire un backup distant, il suffit simplement de faire de la manière suivante :
# SRV=utilisateur@serveur:/dossier/a/copier
SRC=/vz/private/103/var/www/web
# Destination du backup
DST=/var/backups/103/web
# Date de la forme année-mois-jour-timestamp
# (le timestamp %s sert si on veut faire plusieurs sauvegardes dans la même journée)
DATE=`date +%Y-%m-%d_%H-%M-%S_%s`
 
if [ -e $DST/web.lock ]; then
	echo "Sauvegarde deja lancée"
	exit 0;
fi
 
touch $DST/web.lock
 
# Création du répertoire temporaire
mkdir $DST/tmp
 
echo "Backup commencé le "`date "+%d/%m/%Y à %T"`
echo "Starting : "`date "+%Y-%m-%d %T"` >> $DST/log
echo "Copie de la dernière sauvegarde..."
 
# Si une sauvegarde a déjà été faite précédemment
if test -d $DST/today ; then
    # Et si le fichier contenant la date de la dernière sauvegarde existe
    if test -f $DST/last_date ; then
 
        LASTDATE=`cat $DST/last_date`
        # Alors on fait un copie en hardlinks de la sauvegarde d'hier
        cp -al $DST/today $DST/tmp/
        # Puis on renomme la copie pour qu'elle devienne la sauvegarde d'hier
        mv $DST/tmp/today $DST/$LASTDATE
 
    fi
 
# Sinon, on crée le premier dossier
else
    mkdir $DST/today
fi
 
rm -rf $DST/tmp
# On sauvegarde la date actuelle pour le prochain backup
echo $DATE > $DST/last_date
 
echo "Synchronisation de la sauvegarde du jour..."
 
# Synchronisation de la source avec le dossier du jour
rsync -az --delete --size-only $SRC/ $DST/today/
 
rm $DST/web.lock
 
echo "Backup terminé le "`date "+%d/%m/%Y à %T"`
echo "Done : "`date "+%Y-%m-%d %T"` >> $DST/log

Le script ci-dessus génère le résultat suivant :

lisa:/var/backups/103/web# l
total 752
drwxr-xr-x 2794 9500 9500 94208 sep 17 12:05 2009-09-28_20-52-59_1254163979
drwxr-xr-x 2794 9500 9500 94208 sep 17 12:05 2009-09-28_22-12-40_1254168760
drwxr-xr-x 2794 9500 9500 94208 sep 17 12:05 2009-09-28_23-30-02_1254173402
drwxr-xr-x 2794 9500 9500 94208 sep 17 12:05 2009-09-29_00-01-01_1254175261
drwxr-xr-x 2794 9500 9500 94208 sep 17 12:05 2009-09-29_06-01-01_1254196861
drwxr-xr-x 2794 9500 9500 94208 sep 17 12:05 2009-09-29_12-01-01_1254218461
drwxr-xr-x 2794 9500 9500 94208 sep 17 12:05 2009-09-29_18-01-01_1254240061
-rw-r--r--    1 root root    31 sep 30 00:17 last_date
-rw-r--r--    1 root root   464 sep 30 00:24 log
drwxr-xr-x 2794 9500 9500 69632 sep 17 12:05 today

Vous pouvez voir le dossier « today », qui contient la dernière sauvegarde ainsi que la date exacte et le timestamp pour les sauvegardes précédentes.

Attention, toutefois ce script ne supprime pas les anciennes sauvegardes, il faut le faire à la main (ou coder la fonction, ce que je ferai prochainement :D )
Cependant, le fait de faire des liens hard vous économisera au final une place non négligeable.
Exemple : Actuellement, nos données web pèsent 70Go, et pour 8 sauvegardes nous utilisons 75Go d’espace.

Au niveau du temps de copie, la première sauvegarde est longue, mais les suivantes sont plus rapide. Nous avons besoin de 14 minutes (pour les 70Go), le temps de créer l’ensemble des liens hard, et de rapatrier les nouvelles données.

En espérant que ce script puisse vous servir à vous aussi :)
Merci à Skreo pour le script original.

Étiquettes: , , , , , , ,