Salut, Habr !
Aujourd'hui, je souhaite parler de notre expĂ©rience d'automatisation de la sauvegarde des grandes quantitĂ©s de donnĂ©es dans Nextcloud, sous diffĂ©rentes configurations. Je travaille comme CTO chez « ĐĐŸĐ»ĐœĐžŃ ĐР», oĂč nous nous occupons de la gestion de configuration des systĂšmes IT, utilisant Nextcloud pour le stockage des donnĂ©es. Cela inclut Ă©galement des structures distribuĂ©es avec sauvegarde.
Les problÚmes découlant des spécificités des installations résident dans le fait qu'il y a beaucoup de données. Le versionnage que fournit Nextcloud, la sauvegarde, des raisons subjectives et d'autres facteurs créent de nombreux doublons.
Contexte
Lors de l'administration de Nextcloud, se pose la problĂ©matique de l'organisation d'une sauvegarde efficace, qui doit absolument ĂȘtre chiffrĂ©e car les donnĂ©es sont prĂ©cieuses.
Nous proposons des options de stockage des sauvegardes chez nous ou chez le client sur des machines séparées de Nextcloud, nécessitant une approche automatisée flexible en matiÚre d'administration.
Il y a beaucoup de clients, chacun ayant des configurations diffĂ©rentes, chacun sur leurs propres infrastructures et avec leurs propres spĂ©cificitĂ©s. Ici, la mĂ©thode standard oĂč l'ensemble de l'infrastructure vous appartient, et oĂč les sauvegardes sont faites via cron, ne s'applique pas bien.
Pour commencer, examinons les données d'entrée. Nous avons besoin de :
- ScalabilitĂ© en termes d'une ou plusieurs nĆuds. Pour des installations importantes, nous utilisons minio comme stockage.
- Ătre informĂ© des problĂšmes liĂ©s aux exĂ©cutions de sauvegarde.
- Il est nécessaire de stocker la sauvegarde chez les clients et/ou chez nous.
- Résoudre rapidement et facilement les problÚmes.
- Les clients et les installations diffÚrent grandement les uns des autres - il est impossible d'atteindre l'uniformité.
- La vitesse de restauration doit ĂȘtre minimale selon deux scĂ©narios : restauration complĂšte (dĂ©sastre) et une seule dossier - supprimĂ©e par erreur.
- La fonction de déduplication est obligatoire.

Pour résoudre la gestion des sauvegardes, nous avons intégré GitLab. Plus de détails dans la suite.
Bien sĂ»r, nous ne sommes pas les premiers Ă rĂ©soudre une telle tĂąche, mais nous pensons que notre expĂ©rience pratique Ă©prouvĂ©e pourrait ĂȘtre intĂ©ressante et nous sommes prĂȘts Ă la partager.
Ătant donnĂ© que dans notre entreprise, la politique est open source, nous avons cherchĂ© une solution avec un code source ouvert. En retour, nous partageons nos dĂ©veloppements et les publions. Par exemple, sur GitHub, il y a , que nous installons chez nos clients, renforçant la protection des donnĂ©es en cas de suppression accidentelle ou intentionnelle.
Outils de sauvegarde
Nous avons commencé notre recherche de méthodes de solution en choisissant un outil de sauvegarde.
Le tar + gzip traditionnel fonctionne mal - les donnĂ©es sont dupliquĂ©es. En rĂ©alitĂ©, l'incrĂ©ment contient souvent trĂšs peu de modifications, et une grande partie des donnĂ©es au sein d'un mĂȘme fichier se rĂ©pĂšte.
Il y a aussi un autre problĂšme - la redondance du stockage de donnĂ©es distribuĂ©. Nous utilisons MinIO et ses donnĂ©es sont fondamentalement redondantes. Soit il fallait faire une sauvegarde via MinIO lui-mĂȘme - ce qui le chargerait et utiliserait tous les intermĂ©diaires entre le systĂšme de fichiers, et ce qui n'est pas moins important, il existe un risque d'oublier une partie des buckets et des mĂ©tadonnĂ©es. Soit utiliser la dĂ©duplication.
Il existe des outils de sauvegarde avec déduplication en open source (sur Habr, il y avait ) et nos finalistes sont et . Nous parlerons ci-dessous de notre comparaison entre les deux applications, mais d'abord, nous allons expliquer comment nous avons organisé tout le systÚme.
Gestion de la création de sauvegardes
Borg et Restic sont bons, mais aucun des deux produits n'a de mécanisme de gestion centralisé. Pour la gestion et le contrÎle, nous avons choisi un outil qui est déjà implanté chez nous, sans lequel nous ne pouvons imaginer notre travail, y compris l'automatisation - il s'agit du célÚbre CI/CD - GitLab.
L'idĂ©e est la suivante : un gitlab-runner est installĂ© sur chaque nĆud stockant des donnĂ©es Nextcloud. Le runner exĂ©cute selon un calendrier un script surveillant le processus de sauvegarde, et celui-ci lance Borg ou Restic.
Qu'avons-nous obtenu ? Un retour d'information sur l'exécution, un contrÎle facile des changements, et des détails en cas d'erreur.
Voici nous avons mis des exemples de script pour différentes tùches, et nous l'avons finalement intégré à la sauvegarde non seulement de Nextcloud, mais aussi de nombreux autres services. Un planificateur y est également inclus, si vous ne voulez pas le configurer manuellement (et nous ne voulons pas), ainsi que le .gitlab-ci.yml
Dans l'API de GitLab, il n'est pas encore possible de changer le timeout CI/CD, et il est assez court. Il doit ĂȘtre augmentĂ©, disons Ă 1d.
Heureusement, GitLab sait lancer non seulement au moment du commit, mais aussi selon un calendrier, c'est exactement ce dont nous avons besoin.
Maintenant, concernant le script d-wrapper.
Nous avons imposé les conditions suivantes pour ce script :
- Il doit ĂȘtre exĂ©cutĂ© Ă la fois par un runner et manuellement depuis la console, avec les mĂȘmes fonctionnalitĂ©s.
- Des gestionnaires d'erreurs doivent obligatoirement ĂȘtre prĂ©sents :
- code de retour.
- recherche de chaĂźne dans le journal. Par exemple, pour nous, un message qui n'est pas considĂ©rĂ© comme critique par le programme peut ĂȘtre une erreur.
- Gestion du timeout. La durĂ©e d'exĂ©cution doit ĂȘtre raisonnable.
- Nous avons besoin d'un journal détaillé. Mais seulement en cas d'erreur.
- Une série de tests est également effectuée avant le début.
- Quelques petits avantages pour le confort que nous avons trouvés utiles pendant le support :
- Le démarrage et la fin sont enregistrés dans le journal systÚme de la machine locale. Cela aide à relier les erreurs systÚme au fonctionnement de la sauvegarde.
- Une partie du journal d'erreurs, lorsqu'il y en a, est affichĂ©e dans stdout, tout le journal est Ă©crit dans un fichier sĂ©parĂ©. Il est pratique de jeter un Ćil dans CI et d'Ă©valuer l'erreur si elle est triviale.
- Modes pour le débogage.
Le journal complet est sauvegardé en tant qu'artéfact dans GitLab, s'il n'y a pas d'erreurs, alors le journal est supprimé. Le script est écrit en bash.
Nous serons ravis d'examiner toute proposition ou commentaire concernant l'open source - bienvenue.
Comment cela fonctionne
Un runner avec un exĂ©cuteur bash est lancĂ© sur le nĆud Ă sauvegarder. Un job CI/CD est lancĂ© dans un dĂ©pĂŽt spĂ©cial selon le planificateur. Le runner exĂ©cute un script enveloppe universelle pour de telles tĂąches, oĂč des vĂ©rifications de la validitĂ© du dĂ©pĂŽt de sauvegarde, des points de montage et de tout ce que nous voulons sont effectuĂ©es, puis la sauvegarde est exĂ©cutĂ©e et la suppression des anciennes est faite. La sauvegarde prĂȘte est envoyĂ©e sur S3.
Nous travaillons selon ce schéma - c'est un fournisseur externe AWS ou un analogue russe (c'est plus rapide et les données ne quittent pas la Russie). Ou nous installons un cluster minio séparé sur le site du client pour ces objectifs. C'est généralement fait pour des raisons de sécurité, lorsque le client ne veut pas du tout que les données quittent son périmÚtre.
Nous n'avons pas utilisé la fonction d'envoi de la sauvegarde par ssh. Cela n'ajoute pas de sécurité, et les capacités réseau du fournisseur S3 sont bien supérieures à celles de notre seule machine ssh.
Pour se protéger contre un hacker sur la machine locale - car il peut effacer des données sur S3, il est impératif d'activer le versionnage.
Le sauvegardeur chiffre toujours la sauvegarde.
Borg a un mode sans chiffrement aucun, mais nous ne recommandons absolument pas de l'activer. Dans ce mode, il n'y a non seulement pas de chiffrement, mais la somme de contrĂŽle de ce qui est enregistrĂ© n'est pas calculĂ©e, donc l'intĂ©gritĂ© ne peut ĂȘtre vĂ©rifiĂ©e qu'indirectement, par les index.
Un vérificateur distinct teste l'intégrité des sauvegardes concernant les index et le contenu. La vérification est lente et prend du temps, c'est pourquoi nous la lançons séparément une fois par mois. Cela peut durer plusieurs jours.
Readme en russe
Fonctions principales
preparepréparationtestcheckvérification de la préparationmaincommandcommande principaleforcepostscriptune fonction qui s'exécute à la fin ou en cas d'erreur. Utilisé pour démonter la partition.
Fonctions de service
cleanupnous enregistrons les erreurs ou supprimons le fichier journal.checklognous analysons le journal pour détecter la présence d'une chaßne d'erreur., et la valeur de retour est prise dans la constantegestionnaire de sortie.checktimeoutvérification du délai d'attente.
Environnement
VERBOSE=1nous affichons immĂ©diatement les erreurs Ă l'Ă©cran (stdout).SAVELOGSONSUCCES=1nous sauvegardons le journal en cas de succĂšs.INIT_REPO_IF_NOT_EXIST=1Nous crĂ©ons le dĂ©pĂŽt s'il n'existe pas. Par dĂ©faut dĂ©sactivĂ©.TIMEOUTtemps maximal pour l'opĂ©ration principale. Vous pouvez le spĂ©cifier en ajoutant âmâ, âhâ ou âdâ Ă la fin.
Mode de conservation des anciennes copies. Par défaut :
KEEP_DAILY=7KEEP_WEEKLY=4KEEP_MONTHLY=6
Variables à l'intérieur du script
ERROR_STRINGâ chaĂźne Ă vĂ©rifier dans le journal pour une erreur.EXTRACT_ERROR_STRINGâ expression Ă montrer en cas d'erreur.KILL_TIMEOUT_SIGNALâ signal pour tuer si dĂ©lai dĂ©passĂ©.TAILâ combien de chaĂźnes avec des erreurs Ă afficher Ă l'Ă©cran.COLORMSGâ couleur du message (jaune par dĂ©faut).
Ce script, connu sous le nom de wordpress, a pour caractĂ©ristique d'effectuer Ă©galement des sauvegardes de la base mysql. Cela signifie qu'il peut ĂȘtre utilisĂ© pour des installations Ă usage unique de Nexcloud, oĂč il est possible de sauvegarder la base en mĂȘme temps. L'avantage rĂ©side non seulement dans le fait que tout se trouve au mĂȘme endroit, mais aussi que le contenu de la base est proche du contenu des fichiers, car la diffĂ©rence de temps est minimale.
Restic vs Borg
Les comparaisons entre Borg et Restic se trouvent également , et nous n'avions pas pour objectif de créer simplement une autre comparaison, mais la nÎtre. Il était important pour nous de voir comment cela s'applique à nos données, avec notre spécificité. Nous les fournissons.
Nos critÚres de sélection, en plus de ceux déjà mentionnés (déduplication, restauration rapide, etc.) :
- Résistance au travail non terminé. Vérification sur kill -9.
- Taille sur le disque.
- Exigences en ressources (CPU, mémoire).
- Taille des blobs stockés.
- Travail avec S3.
- Vérification d'intégrité.
Pour les tests, nous avons pris un client avec des données réelles et une taille totale de 1,6 To.
Conditions.
Borg ne peut pas travailler directement avec S3, et nous avons monté un disque comme un fuse via . Restic envoyait directement vers S3.
Goofys fonctionne trÚs rapidement et bien, et il dispose de , ce qui accélÚre encore le processus. Il est en phase beta, et, il faut l'admettre, nous avons eu des pannes avec perte de données lors des tests (d'autres). Mais l'avantage est que la procédure de sauvegarde ne nécessite pas beaucoup de lectures, mais principalement des écritures, donc nous n'utilisons le cache que lors de la vérification d'intégrité.
Pour rĂ©duire l'impact du rĂ©seau, nous avons utilisĂ© un fournisseur local â Yandex Cloud.
Résultats des tests de comparaison.
- Kill -9 avec un redémarrage ultérieur, les deux ont réussi.
- Taille sur le disque. Borg sait compresser donc les résultats sont attendus.
Sauvegarde
Taille
Borg
562Go
Restic
628Go
- Concernant le CPU
Borg utilise peu de ressources par lui-mĂȘme, avec la compression par dĂ©faut, mais il faut Ă©valuer cela en conjonction avec le processus goofys. En somme, ils sont comparables et utilisent environ 1,2 cĆur sur la mĂȘme machine virtuelle de test. - MĂ©moire. Restic utilise environ 0,5 Go, Borg environ 200 Mo. Mais cela reste insignifiant comparĂ© au cache de fichiers du systĂšme. Donc, il est prĂ©fĂ©rable de prĂ©voir plus de mĂ©moire.
- La différence de taille des blobs s'est avérée frappante.
Sauvegarde
Taille
Borg
environ 500Mo
Restic
environ 5Mo
- Le travail avec S3 de Restic est excellent. Le travail de Borg via goofys ne pose pas de problÚmes, mais il a été remarqué qu'il est conseillé de faire umount aprÚs la sauvegarde pour vider complÚtement le cache. Une particularité du travail avec S3 est que les chunks non téléchargés ne seront jamais envoyés dans le bucket, ce qui signifie que des données non entiÚrement téléchargées entraßnent de grands dommages.
- La vérification d'intégrité fonctionne bien dans les deux cas, mais la vitesse diffÚre considérablement.
Restic â 3,5 heures.
Borg, avec un cache de fichiers de 100 Go SSD â 5 heures. Un rĂ©sultat de vitesse Ă peu prĂšs Ă©quivalent si les donnĂ©es sont sur un disque local.
Borg lit directement depuis S3 sans cache 33 heures. Terriblement long.
En rĂ©sumĂ©, Borg sait compresser et a de plus grands blobs â ce qui rend le stockage et les opĂ©rations GET/PUT dans S3 moins coĂ»teux. Mais cela implique une vĂ©rification plus complexe et plus lente. En ce qui concerne la vitesse de restauration â nous n'avons remarquĂ© aucune diffĂ©rence. Les sauvegardes ultĂ©rieures (aprĂšs la premiĂšre) que fait Restic prennent un peu plus de temps, mais pas de maniĂšre significative.
La taille de la communauté n'était pas en dernier lieu dans notre choix.
Et nous avons choisi Borg.
Quelques mots sur la compression
Borg dispose d'un excellent nouvel algorithme de compression â zstd. En termes de qualitĂ© de compression, il n'est pas infĂ©rieur Ă gzip, mais il est beaucoup plus rapide. Et il est comparable en rapiditĂ© Ă l'algorithme par dĂ©faut lz4.
Par exemple, un dump de base de donnĂ©es MySQL se compresse deux fois mieux que lz4 Ă la mĂȘme vitesse. Cependant, l'expĂ©rience avec des donnĂ©es rĂ©elles montre qu'il y a une trĂšs petite diffĂ©rence dans le taux de compression des nĆuds Nextcloud.
Borg propose en fait un mode de compression bonus â si un fichier a une grande entropie, alors la compression n'est pas appliquĂ©e, ce qui augmente la vitesse de fonctionnement. Cela s'active avec une option lors de la crĂ©ation
-C auto,zstd
pour l'algorithme zstd
Eh bien, avec cette option, par rapport à la compression par défaut, nous avons obtenu
560 Go et 562 Go respectivement. Les données de l'exemple ci-dessus, je le rappelle, sans compression, donnent un résultat de 628 Go. Le résultat avec 2 Go d'écart nous a quelque peu surpris, mais nous avons décidé de choisir finalement. auto,zstd.
Méthode de vérification de la sauvegarde
La machine virtuelle est lancée directement chez le fournisseur ou chez le client via le planificateur, ce qui réduit considérablement la charge réseau. Au moins, cela coûte moins cher que de le faire chez soi et de transférer le trafic.
goofys --cache "--free:5%:\/mnt\/cache" -o allow_other --endpoint https:\/\/storage.yandexcloud.net --file-mode=0666 --dir-mode=0777 xxxxxxx.com \/mnt\/goofys
export BORG_PASSCOMMAND="cat \/home\/borg\/.borg-passphrase"
borg list \/mnt\/goofys\/borg1\/\nborg check --debug -p --verify-data \/mnt\/goofys\/borg1\/Nous vĂ©rifions Ă©galement les fichiers avec un antivirus (a posteriori) selon le mĂȘme schĂ©ma. En effet, les utilisateurs tĂ©lĂ©chargent diverses choses dans Nextcloud et tous n'ont pas d'antivirus. Effectuer la vĂ©rification au moment de l'upload prend trop de temps et nuit aux affaires.
L'Ă©volutivitĂ© est atteinte par le lancement de runners sur diffĂ©rentes nĆuds avec des tags variĂ©s.
Dans notre monitoring, nous collectons les Ă©tats de sauvegarde via l'API GitLab dans une seule fenĂȘtre, et en cas de problĂšme, ceux-ci sont facilement remarquables et tout aussi facilement localisables.
Conclusion
En fin de compte, nous savons exactement que nous faisons des sauvegardes, que nos sauvegardes sont valides, et que les problÚmes qui surviennent avec elles prennent peu de temps et sont résolus par l'administrateur de service. Les sauvegardes occupent réellement peu d'espace par rapport à tar.gz ou Bacula.
Source : habr.com
