Comment sauvegarder des millions de petits fichiers sur Linux ?
La sauvegarde de millions de petits fichiers peut s’avérer un véritable défi, surtout sous Linux. Les outils de sauvegarde populaires comme rsync ou restic, bien qu’efficaces pour d’autres types de cas d’usage, rencontrent souvent leurs limites dans cette situation spécifique. Dans cet article, nous allons analyser pourquoi ces outils ne sont pas toujours adaptés à la sauvegarde de petits fichiers et étudier les solutions existantes pour contourner ces problèmes.
Pourquoi les petits fichiers posent-ils problème ?
Les petits fichiers sollicitent différemment les systèmes de sauvegarde par rapport aux fichiers de grande taille. Chaque fichier étant traité individuellement, le système doit effectuer des opérations répétées d’ouverture, de lecture, d’écriture, puis de fermeture. Cela entraîne une surcharge de traitement et une consommation importante de ressources disque et CPU.
Voici quelques limites des outils traditionnels :
- Rsync : mono-threadé par défaut
Bien que puissant, rsync est historiquement mono-threadé. Cela signifie qu’il traite les fichiers un par un, ce qui devient très lent lorsque le nombre de fichiers est élevé. - Restic : approche basée sur les blocs
Restic divise les fichiers en petits blocs, qu’il stocke de manière dédupliquée. Si cette méthode est efficace pour réduire la taille des sauvegardes, elle pose un gros problème lors de la restauration : chaque bloc nécessite une requête HTTP ou disque, ce qui ralentit considérablement le processus.
Solutions pour optimiser la sauvegarde de petits fichiers
Heureusement, il existe des stratégies et outils qui permettent d’améliorer la performance de la sauvegarde dans ces cas d’usage.
1. Utiliser rsync en mode multi-threadé
Une solution consiste à exécuter plusieurs instances de rsync en parallèle pour traiter différents segments de fichiers simultanément. Plusieurs outils tiers et scripts permettent de partitionner les fichiers en lots pour les traiter via plusieurs threads. Par exemple :
- GNU Parallel : pour paralléliser les commandes rsync.
- Des scripts personnalisés pour diviser les fichiers selon des règles précises.
Exemple de commande rsync parallèle avec GNU Parallel :
find /source_directory -type f | parallel -j 4 rsync -av {} /destination_directory
Bien que cela améliore les performances, la complexité de mise en place augmente.
2. Choisir un système de sauvegarde adapté aux petits fichiers
Certains outils de sauvegarde sont spécialement conçus pour gérer un grand nombre de petits fichiers. Parmi eux :
- BorgBackup : cet outil déduplique les données de manière intelligente tout en regroupant plusieurs fichiers dans des segments, réduisant ainsi le nombre d’opérations disque.
- Zbackup : basé sur la déduplication et la compression, il est performant pour ce type de cas.
3. Regrouper les petits fichiers en archives
Une autre stratégie consiste à regrouper les petits fichiers dans des archives compressées (par exemple, avec tar ou zip) avant de les sauvegarder. Cela permet de réduire le nombre d’opérations et d’améliorer les performances. Toutefois, cette approche complique l’accès individuel aux fichiers.
Exemple de commande pour créer une archive :
tar -czf archive.tar.gz /source_directory
Notre approche chez Datashelter
Chez Datashelter, nous avons été confrontés à la sauvegarde d’un dataset contenant plus de 100 millions de fichiers, une tâche que les solutions existantes peinaient à gérer efficacement. Il s'agit d'une des raisons qui nous ont poussé à développer snaper, notre propre outil de sauvegarde. Snaper offre des fonctionnalités avancées telles que la déduplication au niveau des fichiers et le multithreading, optimisant ainsi les performances de sauvegarde et de restauration.
Déduplication au niveau des fichiers
Snaper identifie et élimine les doublons en ne stockant qu'une seule copie des fichiers identiques, ce qui réduit l'espace de stockage nécessaire. Cette approche est particulièrement bénéfique lorsque de nombreux petits fichiers présentent des similitudes ou des répétitions.
Multithreading
Pour accélérer le processus de sauvegarde, snaper utilise le multithreading, permettant le traitement simultané de plusieurs fichiers. Cette parallélisation améliore considérablement la vitesse de sauvegarde et de restauration, surtout lorsqu'il s'agit de vastes ensembles de petits fichiers.
Gestion des fichiers temporaires
Lors de la compression ou du chiffrement des données, snaper crée des fichiers temporaires. Par défaut, les fichiers de moins de 10 Mo sont traités en mémoire vive (RAM), tandis que les fichiers plus volumineux utilisent la partition temporaire du système.
Exemple de commande avec snaper
Pour créer une sauvegarde avec snaper, utilisez la commande suivante :
snaper backup files --path /chemin/vers/dossier_a_sauvegarder
Cette commande initie la sauvegarde du répertoire spécifié, en appliquant la déduplication, la compression et le multithreading pour optimiser le processus.
Conclusion
La sauvegarde de millions de petits fichiers n’est pas une tâche simple, mais il existe des stratégies pour surmonter les limitations des outils traditionnels. En choisissant la bonne approche, comme le multi-threading, l’archivage ou des outils adaptés, vous pouvez optimiser les performances et simplifier vos sauvegardes.
Si vous avez des cas d’usage particuliers ou des questions, n’hésitez pas à nous en faire part !