Quelle est l’importance d’un système de sauvegardes ? Tout.
Il n’existe pas de système infaillible, le fournisseur du datacenter peut faire défaut (vous souvenez-vous de l’incendie d’OVH ?), le matériel de votre serveur dédié, une manipulation désastreuse de données par un utilisateur dans le back-office, un processus de synchronisation incontrôlé, une mise à jour Magento échouée… tant et tant de causes possibles avec une fin désastreuse que celui qui n’a pas un système de sauvegardes efficace et aussi proche du moment actuel que possible se retrouvera tôt ou tard dans de sérieux problèmes.
Étant tous d’accord sur ce point, je vous explique mon système actuel de sauvegardes au cas où il serait utile à un autre sysadmin. Avant de découvrir ZFS, j’avais l’habitude d’utiliser des outils comme BackupPC, rsync + divers scripts et d’autres solutions ingénieuses de différents outils open source mais tous s’avérèrent bien inférieurs à la simplicité et l’efficacité de ZFS + snapshots + compression automatique + rsync.
Comme exemple, le système de sauvegardes que j’ai implémenté pour un fournisseur d’hébergement/cloud Magento en France qui est en production depuis plus de 2 ans. Il effectue actuellement quotidiennement la sauvegarde de plus de 250 serveurs (entre VPS, internes et dédiés du monde entier) qui se réalise simultanément sur deux serveurs de sauvegardes dans des emplacements différents (Pologne et Finlande). Contenant 7 sauvegardes « complètes » une pour chaque jour de la semaine plus une aux jours 1 et 15 de chaque mois qui sont conservées et les mois les plus anciens sont supprimés tant qu’il y a de l’espace sur le serveur de sauvegardes, la taille du pool ZFS est d’environ 12T (compression zstd-5) pour une copie complète de toutes les données de tous les serveurs, à partir de là additionner la copie différentielle réalisée chaque jour. La sauvegarde se complète quotidiennement en moins de 7 heures pour tous les serveurs avec pour résultat une copie « complète » dans chaque sauvegarde réalisée.
La base de ce système de sauvegardes sont les snapshots de ZFS et la compression automatique dans le système de fichiers lui-même (celui qui ne connaît pas ce système de fichiers devrait l’étudier immédiatement). ZFS n’est pas le meilleur système de fichiers pour tous les usages et je ne le défends pas comme tel mais pour le but d’un système de sauvegardes il me semble excellent.
Il est préférable d’avoir un serveur dédié pour les tâches de sauvegardes et également avec suffisamment de RAM, ZFS en a besoin de beaucoup pour fonctionner de manière optimale surtout avec de grands volumes de données. Je préfère également que le système d’exploitation soit FreeBSD, c’est le système qui s’intègre le mieux avec ZFS, avec Linux j’ai également eu des problèmes de gestion de la mémoire, quelque chose qui ne m’est pas encore arrivé avec FreeBSD dans son intégration avec ZFS.
Une fois votre système FreeBSD installé et le pool ZFS configuré (il existe de nombreux paramètres à optimiser) le système de sauvegardes est assez simple. Il consiste essentiellement à :
- Faire un snapshot du dataset où est stockée la copie du serveur dont on effectue la sauvegarde. En utilisant une nomenclature simple pour le nom des snapshots il est facile d’obtenir par exemple une rotation hebdomadaire et avoir ainsi une semaine complète de snapshots. Chaque jour (où X est le jour de la semaine) :
- zfs destroy vpsdataset@dowX
- zfs snapshot vpsdataset@dowX
- Faire un rsync (-a –numeric-ids -H –delete) du serveur distant vers le vpsdataset.
Et voilà. Naturellement il y a plus de variables à prendre en compte comme optimiser une liste « d’exclusions » pour le rsync, avoir localement sur chaque serveur un processus qui effectue une copie de la base de données en local ou optimiser le protocole de chiffrement SSH pour rsync. Mais c’est essentiellement l’idée.
Le grand avantage des snapshots est que leur accès en cas de besoin est ultra-rapide et disponible instantanément avec une compression transparente de facto. Vous pouvez aller dans le répertoire vpsdataset/.zfs/snapshot/ et là avoir accès à tous les snapshots réalisés et accéder à n’importe quel fichier dont vous avez besoin ou faire un rsync complet vers le serveur et le restaurer.
# cd /vpsdataset/.zfs
# ls
snapshot/
# cd snapshot/
# ls -la
total 128
dr-xr-xr-x+ 17 root wheel 17B 20 jun. 02:36 ./
dr-xr-xr-x+ 3 root wheel 3B 28 ene. 2021 ../
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dom0201/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dom0301/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dom0401/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dom0416/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dom0501/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dom0516/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dom0601/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dom0616/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dow1/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dow2/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dow3/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dow4/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dow5/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dow6/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dow7/
# ls -la dow1/
total 75
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 ./
dr-xr-xr-x+ 17 root wheel 17B 20 jun. 02:36 ../
# zfs get all vpsdataset|grep compress
vpsdataset compressratio 3.55x -
vpsdataset compression zstd-5 inherited from backup
vpsdataset refcompressratio 2.27x -
* vpsdataset est utilisé comme nom d’exemple sans utilité réelle