Sauvegardes extensives
Effraie.org héberge pas mal de sites, et la question des sauvegardes est devenue cruciale.
Bien sur, je pourrais renvoyer les utilisateur-ices à leur responsabilités, et leur demander de faire leurs propres sauvegardes. Cela dit, rien ne dit qu'elles/ils les fassent régulièrement, ni qu'ils sachent comment sauvegarder une base de données.
Je me suis donc penché sur la question, et j'ai amélioré mon rsync quotidien pour obtenir un système qui me convient mieux,
Pour assurer que les données seront à l'abri en cas de crash des disques durs internes, mon répertoire backups/ est situé sur un disque usb externe. Prochainement, je cherche également à automatiser une sauvegarde de ce répertoire sur un serveur distant
Sauvegardes des bases de données
J'utilise, suivant les conseils avisé d'un copain, le script autoMYSQLBackup.sh qu'on trouve ici. Après configuration de quelques variables, le script est opérationnel, et il ne vous reste qu'a le lier dans /etc/cron.daily/ pour obtenir une sauvegarde automatisée de chacune de vos bases. Le script conserve les backups des derniers 7 jours, une par semaine pendant un mois, et une par mois indéfiniment.
Au final, cela me permet de conserver une trace des données sur le long terme, sans pour autant user une espace disque démesuré, dans backups/sql.
Sauvegardes des données:
Pendant longtemps, je me suis contenté d'utiliser rsync pour sauvegarder les données du serveur. Cependant, je souhaitais bénéficier, comme pour les bases de données, de la possibilité de restaurer une sauvegarde plus ancienne.
Pour cela, j'ai utilisé des outils standards, rsync, cp, rm, date, find et crontab.
Le fonctionnement est simple:
sauvegarde principale:
Chaque nuit, à 2h30, je sauvegarde l'ensemble des données que je veux pouvoir restaurer dans un répertoire backups/main, avec le "mini script" suivant, qui synchronise la racine du serveur avec ma sauvegarde:
#!/bin/sh rsync -azh --exclude=/pattern/à/ne/pas/sauver --exclude=/dev --exclude=/proc --exclude=/tmp --exclude=/sys --delete-after --delete-excluded --stats / /chemin/vers/backups/main
et cette ligne dans la crontab de root:
30 02 * * * /chemin/vers/le/script/main_backup 2>&1 | mail votre@email.tld -s "[Rsync] rapport du `date +%A\ %d\ %B\ %Y`"
Je reçois ainsi chaque jour un rapport statistique sur la synchronisation, de cette forme:
Number of files: 208552 Number of files transferred: 1038 Total file size: 8.23G bytes Total transferred file size: 354.84M bytes Literal data: 354.86M bytes Matched data: 0 bytes File list size: 6230145 File list generation time: 98.647 seconds File list transfer time: 0.000 seconds Total bytes sent: 70.71M Total bytes received: 24.00K sent 70.71M bytes received 24.00K bytes 344.18K bytes/sec total size is 8.23G speedup is 116.42
En cas de problème, le mail contient la sortie d'erreur de la commande.
Journalisation des sauvegardes
Pour pouvoir restaurer des sauvegardes plus anciennes, ou des fichiers effacés il y a plusieurs jours sur le serveur (et donc absent de backups/main), j'utilise trois petits scripts simplistes, qui, associés à une ligne adéquate dans la crontab de root, me permettent de conserver l'ensemble des sauvegardes des 7 derniers jours, une sauvegarde par semaine pendant un mois, et une sauvegarde par mois pendant 6 mois.
Note ajoutée à la suite de quiproquo dans les commentaires
Le systéme de journalisation/rotation des backups utilise l'option -l de cp, pour créer des hardlinks au lieu de recopier les fichiers, dans tt les cas ou le fichier n'a pas été modifié. C'est le moyen de n'utiliser que l'espace disque minimum requis. Compresser les données dans une archive ferait perdre cet avantage, et utiliserait, finalement, plus d'espace disque.
Voici les scripts et les entrées dans la crontab qui vont avec:
daily_backup
le script:
#!/bin/sh find /chemin/vers/backups/timed/daily/* -ctime +7 -exec rm -rf {} \; cp -al /chemin/vers/backups/main /chemin/vers/backups/timed/daily/`date +%F` 2> /dev/null;
L'entrée dans la crontab:
30 03 * * * /home/effraie/scripts/daily_backup
weekly_backup
le script:
#!/bin/sh find /chemin/vers/backups/timed/weekly/* -ctime +33 -exec rm -rf {} \; cp -al /chemin/vers/backups/main /chemin/vers/backups/timed/weekly/`date +%U_%F` 2> /dev/null;
L'entrée dans la crontab:
40 03 * * 0 /home/effraie/scripts/weekly_backup
monthly_backup
Le script:
#!/bin/sh find /chemin/vers/backups/timed/monthly/* -ctime +183 -exec rm -rf {} \; cp -al /chemin/vers/backups/main /mnt/usb-data/backups/timed/monthly/`date +%m-%Y` 2> /dev/null;
L'entrée dans la crontab:
50 03 1 * * /home/effraie/scripts/monthly_backup
Avec ça, je pense être habillé pour l'hiver! Cela dit, toute suggestion d'amélioration est la bienvenue.