{"id":86904,"date":"2020-07-01T07:42:30","date_gmt":"2020-07-01T05:42:30","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud"},"modified":"2020-07-01T07:42:30","modified_gmt":"2020-07-01T05:42:30","slug":"kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud","title":{"rendered":"Comment GitLab aide \u00e0 faire des sauvegardes de grands r\u00e9pertoires NextCloud","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Salut, Habr !<\/p>\n<p><\/p>\n<p>Aujourd'hui, je souhaite parler de notre exp\u00e9rience d'automatisation de la sauvegarde des grandes quantit\u00e9s de donn\u00e9es dans Nextcloud, sous diff\u00e9rentes configurations. Je travaille comme CTO chez \u00ab \u041c\u043e\u043b\u043d\u0438\u044f \u0410\u041a \u00bb, o\u00f9 nous nous occupons de la gestion de configuration des syst\u00e8mes IT, utilisant Nextcloud pour le stockage des donn\u00e9es. Cela inclut \u00e9galement des structures distribu\u00e9es avec sauvegarde.<\/p>\n<p><\/p>\n<p>Les probl\u00e8mes d\u00e9coulant des sp\u00e9cificit\u00e9s des installations r\u00e9sident dans le fait qu'il y a beaucoup de donn\u00e9es. Le versionnage que fournit Nextcloud, la sauvegarde, des raisons subjectives et d'autres facteurs cr\u00e9ent de nombreux doublons.<\/p>\n<p><\/p>\n<h2 id=\"predystoriya\">Contexte<\/h2>\n<p><\/p>\n<p>Lors de l'administration de Nextcloud, se pose la probl\u00e9matique de l'organisation d'une sauvegarde efficace, qui doit absolument \u00eatre chiffr\u00e9e car les donn\u00e9es sont pr\u00e9cieuses.<\/p>\n<p><\/p>\n<p>Nous proposons des options de stockage des sauvegardes chez nous ou chez le client sur des machines s\u00e9par\u00e9es de Nextcloud, n\u00e9cessitant une approche automatis\u00e9e flexible en mati\u00e8re d'administration.<\/p>\n<p><\/p>\n<p>Il y a beaucoup de clients, chacun ayant des configurations diff\u00e9rentes, chacun sur leurs propres infrastructures et avec leurs propres sp\u00e9cificit\u00e9s. Ici, la m\u00e9thode standard o\u00f9 l'ensemble de l'infrastructure vous appartient, et o\u00f9 les sauvegardes sont faites via cron, ne s'applique pas bien.<\/p>\n<p><\/p>\n<p>Pour commencer, examinons les donn\u00e9es d'entr\u00e9e. Nous avons besoin de :<\/p>\n<p><\/p>\n<ul>\n<li>Scalabilit\u00e9 en termes d'une ou plusieurs n\u0153uds. Pour des installations importantes, nous utilisons minio comme stockage.<\/li>\n<li>\u00catre inform\u00e9 des probl\u00e8mes li\u00e9s aux ex\u00e9cutions de sauvegarde.<\/li>\n<li>Il est n\u00e9cessaire de stocker la sauvegarde chez les clients et\/ou chez nous.<\/li>\n<li>R\u00e9soudre rapidement et facilement les probl\u00e8mes.<\/li>\n<li>Les clients et les installations diff\u00e8rent grandement les uns des autres - il est impossible d'atteindre l'uniformit\u00e9.<\/li>\n<li>La vitesse de restauration doit \u00eatre minimale selon deux sc\u00e9narios : restauration compl\u00e8te (d\u00e9sastre) et une seule dossier - supprim\u00e9e par erreur.<\/li>\n<li>La fonction de d\u00e9duplication est obligatoire.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Comment GitLab aide \u00e0 faire des sauvegardes de grands r\u00e9pertoires NextCloud\" src=\"\/wp-content\/uploads\/2020\/07\/1a0048e3295fef94ddca28e50612e3cb.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pour r\u00e9soudre la gestion des sauvegardes, nous avons int\u00e9gr\u00e9 GitLab. Plus de d\u00e9tails dans la suite. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Bien s\u00fbr, nous ne sommes pas les premiers \u00e0 r\u00e9soudre une telle t\u00e2che, mais nous pensons que notre exp\u00e9rience pratique \u00e9prouv\u00e9e pourrait \u00eatre int\u00e9ressante et nous sommes pr\u00eats \u00e0 la partager.<\/p>\n<p><\/p>\n<p>\u00c9tant donn\u00e9 que dans notre entreprise, la politique est open source, nous avons cherch\u00e9 une solution avec un code source ouvert. En retour, nous partageons nos d\u00e9veloppements et les publions. Par exemple, sur GitHub, il y a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/molnia-com\/nextcloud-safe-trash\">notre plugin pour Nextcloud<\/a><\/noindex>, que nous installons chez nos clients, renfor\u00e7ant la protection des donn\u00e9es en cas de suppression accidentelle ou intentionnelle.<\/p>\n<p><\/p>\n<h2 id=\"sredstva-bekapirovaniya\">Outils de sauvegarde<\/h2>\n<p><\/p>\n<p>Nous avons commenc\u00e9 notre recherche de m\u00e9thodes de solution en choisissant un outil de sauvegarde.<\/p>\n<p><\/p>\n<p>Le tar + gzip traditionnel fonctionne mal - les donn\u00e9es sont dupliqu\u00e9es. En r\u00e9alit\u00e9, l'incr\u00e9ment contient souvent tr\u00e8s peu de modifications, et une grande partie des donn\u00e9es au sein d'un m\u00eame fichier se r\u00e9p\u00e8te.<br \/>\nIl y a aussi un autre probl\u00e8me - la redondance du stockage de donn\u00e9es distribu\u00e9. Nous utilisons MinIO et ses donn\u00e9es sont fondamentalement redondantes. Soit il fallait faire une sauvegarde via MinIO lui-m\u00eame - ce qui le chargerait et utiliserait tous les interm\u00e9diaires entre le syst\u00e8me de fichiers, et ce qui n'est pas moins important, il existe un risque d'oublier une partie des buckets et des m\u00e9tadonn\u00e9es. Soit utiliser la d\u00e9duplication.<\/p>\n<p><\/p>\n<p>Il existe des outils de sauvegarde avec d\u00e9duplication en open source (sur Habr, il y avait <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/449282\/\">article<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/420055\/\">\u00e0 ce sujet<\/a><\/noindex>) et nos finalistes sont <noindex><a rel=\"nofollow\" href=\"https:\/\/borgbackup.readthedocs.io\/en\/stable\/\">Borg<\/a><\/noindex> et <noindex><a rel=\"nofollow\" href=\"https:\/\/restic.net\/\">Restic<\/a><\/noindex>. Nous parlerons ci-dessous de notre comparaison entre les deux applications, mais d'abord, nous allons expliquer comment nous avons organis\u00e9 tout le syst\u00e8me.<\/p>\n<p><\/p>\n<h2 id=\"upravlenie-sozdaniem-rezervnyh-kopiy\">Gestion de la cr\u00e9ation de sauvegardes<\/h2>\n<p><\/p>\n<p>Borg et Restic sont bons, mais aucun des deux produits n'a de m\u00e9canisme de gestion centralis\u00e9. Pour la gestion et le contr\u00f4le, nous avons choisi un outil qui est d\u00e9j\u00e0 implant\u00e9 chez nous, sans lequel nous ne pouvons imaginer notre travail, y compris l'automatisation - il s'agit du c\u00e9l\u00e8bre CI\/CD - GitLab.<\/p>\n<p><\/p>\n<p>L'id\u00e9e est la suivante : un gitlab-runner est install\u00e9 sur chaque n\u0153ud stockant des donn\u00e9es Nextcloud. Le runner ex\u00e9cute selon un calendrier un script surveillant le processus de sauvegarde, et celui-ci lance Borg ou Restic.<\/p>\n<p><\/p>\n<p>Qu'avons-nous obtenu ? Un retour d'information sur l'ex\u00e9cution, un contr\u00f4le facile des changements, et des d\u00e9tails en cas d'erreur.<\/p>\n<p><\/p>\n<p>Voici <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/molnia-com\/backup-by-runner\">ici sur GitHub<\/a><\/noindex> nous avons mis des exemples de script pour diff\u00e9rentes t\u00e2ches, et nous l'avons finalement int\u00e9gr\u00e9 \u00e0 la sauvegarde non seulement de Nextcloud, mais aussi de nombreux autres services. Un planificateur y est \u00e9galement inclus, si vous ne voulez pas le configurer manuellement (et nous ne voulons pas), ainsi que le .gitlab-ci.yml<\/p>\n<p><\/p>\n<p>Dans l'API de GitLab, il n'est pas encore possible de changer le timeout CI\/CD, et il est assez court. Il doit \u00eatre augment\u00e9, disons \u00e0 <code>1d<\/code>.<\/p>\n<p><\/p>\n<p>Heureusement, GitLab sait lancer non seulement au moment du commit, mais aussi selon un calendrier, c'est exactement ce dont nous avons besoin.<\/p>\n<p><\/p>\n<p>Maintenant, concernant le script d-wrapper.<\/p>\n<p><\/p>\n<p>Nous avons impos\u00e9 les conditions suivantes pour ce script :<\/p>\n<p><\/p>\n<ul>\n<li>Il doit \u00eatre ex\u00e9cut\u00e9 \u00e0 la fois par un runner et manuellement depuis la console, avec les m\u00eames fonctionnalit\u00e9s.<\/li>\n<li>Des gestionnaires d'erreurs doivent obligatoirement \u00eatre pr\u00e9sents :<\/li>\n<li>code de retour.<\/li>\n<li>recherche de cha\u00eene dans le journal. Par exemple, pour nous, un message qui n'est pas consid\u00e9r\u00e9 comme critique par le programme peut \u00eatre une erreur.<\/li>\n<li>Gestion du timeout. La dur\u00e9e d'ex\u00e9cution doit \u00eatre raisonnable.<\/li>\n<li>Nous avons besoin d'un journal d\u00e9taill\u00e9. Mais seulement en cas d'erreur.<\/li>\n<li>Une s\u00e9rie de tests est \u00e9galement effectu\u00e9e avant le d\u00e9but.<\/li>\n<li>Quelques petits avantages pour le confort que nous avons trouv\u00e9s utiles pendant le support :<\/li>\n<li>Le d\u00e9marrage et la fin sont enregistr\u00e9s dans le journal syst\u00e8me de la machine locale. Cela aide \u00e0 relier les erreurs syst\u00e8me au fonctionnement de la sauvegarde.<\/li>\n<li>Une partie du journal d'erreurs, lorsqu'il y en a, est affich\u00e9e dans stdout, tout le journal est \u00e9crit dans un fichier s\u00e9par\u00e9. Il est pratique de jeter un \u0153il dans CI et d'\u00e9valuer l'erreur si elle est triviale.<\/li>\n<li>Modes pour le d\u00e9bogage.<\/li>\n<\/ul>\n<p><\/p>\n<p>Le journal complet est sauvegard\u00e9 en tant qu'art\u00e9fact dans GitLab, s'il n'y a pas d'erreurs, alors le journal est supprim\u00e9. Le script est \u00e9crit en bash.<\/p>\n<p><\/p>\n<p>Nous serons ravis d'examiner toute proposition ou commentaire concernant l'open source - bienvenue.<\/p>\n<p><\/p>\n<h2 id=\"kak-eto-rabotaet\">Comment cela fonctionne<\/h2>\n<p><\/p>\n<p>Un runner avec un ex\u00e9cuteur bash est lanc\u00e9 sur le n\u0153ud \u00e0 sauvegarder. Un job CI\/CD est lanc\u00e9 dans un d\u00e9p\u00f4t sp\u00e9cial selon le planificateur. Le runner ex\u00e9cute un script enveloppe universelle pour de telles t\u00e2ches, o\u00f9 des v\u00e9rifications de la validit\u00e9 du d\u00e9p\u00f4t de sauvegarde, des points de montage et de tout ce que nous voulons sont effectu\u00e9es, puis la sauvegarde est ex\u00e9cut\u00e9e et la suppression des anciennes est faite. La sauvegarde pr\u00eate est envoy\u00e9e sur S3.<\/p>\n<p><\/p>\n<p>Nous travaillons selon ce sch\u00e9ma - c'est un fournisseur externe AWS ou un analogue russe (c'est plus rapide et les donn\u00e9es ne quittent pas la Russie). Ou nous installons un cluster minio s\u00e9par\u00e9 sur le site du client pour ces objectifs. C'est g\u00e9n\u00e9ralement fait pour des raisons de s\u00e9curit\u00e9, lorsque le client ne veut pas du tout que les donn\u00e9es quittent son p\u00e9rim\u00e8tre.<\/p>\n<p><\/p>\n<p>Nous n'avons pas utilis\u00e9 la fonction d'envoi de la sauvegarde par ssh. Cela n'ajoute pas de s\u00e9curit\u00e9, et les capacit\u00e9s r\u00e9seau du fournisseur S3 sont bien sup\u00e9rieures \u00e0 celles de notre seule machine ssh.<\/p>\n<p><\/p>\n<p>Pour se prot\u00e9ger contre un hacker sur la machine locale - car il peut effacer des donn\u00e9es sur S3, il est imp\u00e9ratif d'activer le versionnage.<br \/>\nLe sauvegardeur chiffre toujours la sauvegarde.<\/p>\n<p><\/p>\n<p>Borg a un mode sans chiffrement <code>aucun<\/code>, 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\u00f4le de ce qui est enregistr\u00e9 n'est pas calcul\u00e9e, donc l'int\u00e9grit\u00e9 ne peut \u00eatre v\u00e9rifi\u00e9e qu'indirectement, par les index.<\/p>\n<p><\/p>\n<p>Un v\u00e9rificateur distinct teste l'int\u00e9grit\u00e9 des sauvegardes concernant les index et le contenu. La v\u00e9rification est lente et prend du temps, c'est pourquoi nous la lan\u00e7ons s\u00e9par\u00e9ment une fois par mois. Cela peut durer plusieurs jours.<\/p>\n<p><\/p>\n<h2 id=\"ridmi-na-russkom\">Readme en russe<\/h2>\n<p><\/p>\n<h3 id=\"osnovnye-funkcii\">Fonctions principales<\/h3>\n<p><\/p>\n<ul>\n<li><code>prepare<\/code> pr\u00e9paration<\/li>\n<li><code>testcheck<\/code> v\u00e9rification de la pr\u00e9paration<\/li>\n<li><code>maincommand<\/code> commande principale<\/li>\n<li><code>forcepostscript<\/code> une fonction qui s'ex\u00e9cute \u00e0 la fin ou en cas d'erreur. Utilis\u00e9 pour d\u00e9monter la partition.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"service-functions\">Fonctions de service<\/h3>\n<p><\/p>\n<ul>\n<li><code>cleanup<\/code> nous enregistrons les erreurs ou supprimons le fichier journal.<\/li>\n<li><code>checklog<\/code> nous analysons le journal pour d\u00e9tecter la pr\u00e9sence d'une cha\u00eene d'erreur.<\/li>\n<li><code>, et la valeur de retour est prise dans la constante<\/code> gestionnaire de sortie.<\/li>\n<li><code>checktimeout<\/code> v\u00e9rification du d\u00e9lai d'attente.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"environment\">Environnement<\/h3>\n<p><\/p>\n<ul>\n<li><code>VERBOSE=1<\/code> nous affichons imm\u00e9diatement les erreurs \u00e0 l'\u00e9cran (stdout).<\/li>\n<li><code>SAVELOGSONSUCCES=1<\/code> nous sauvegardons le journal en cas de succ\u00e8s.<\/li>\n<li><code>INIT_REPO_IF_NOT_EXIST=1<\/code> Nous cr\u00e9ons le d\u00e9p\u00f4t s'il n'existe pas. Par d\u00e9faut d\u00e9sactiv\u00e9.<\/li>\n<li><code>TIMEOUT<\/code> temps maximal pour l'op\u00e9ration principale. Vous pouvez le d\u00e9finir sur &#8216;m&#8217;, &#8216;h&#8217; ou &#8216;d&#8217; \u00e0 la fin.<\/li>\n<\/ul>\n<p><\/p>\n<p>Mode de conservation des anciennes copies. Par d\u00e9faut :<\/p>\n<p><\/p>\n<ul>\n<li><code>KEEP_DAILY=7<\/code><\/li>\n<li><code>KEEP_WEEKLY=4<\/code><\/li>\n<li><code>KEEP_MONTHLY=6<\/code><\/li>\n<\/ul>\n<p><\/p>\n<h2 id=\"peremennye-vnutri-skripta\">Variables \u00e0 l'int\u00e9rieur du script<\/h2>\n<p><\/p>\n<ul>\n<li><code>ERROR_STRING<\/code> \u2014 cha\u00eene \u00e0 v\u00e9rifier dans le journal pour une erreur.<\/li>\n<li><code>EXTRACT_ERROR_STRING<\/code> \u2014 expression \u00e0 montrer en cas d'erreur.<\/li>\n<li><code>KILL_TIMEOUT_SIGNAL<\/code> \u2014 signal pour tuer si d\u00e9lai d\u00e9pass\u00e9.<\/li>\n<li><code>TAIL<\/code> \u2014 combien de cha\u00eenes avec des erreurs \u00e0 afficher \u00e0 l'\u00e9cran.<\/li>\n<li><code>COLORMSG<\/code> \u2014 couleur du message (jaune par d\u00e9faut).<\/li>\n<\/ul>\n<p><\/p>\n<p>Ce script, connu sous le nom de wordpress, a pour caract\u00e9ristique d'effectuer \u00e9galement des sauvegardes de la base mysql. Cela signifie qu'il peut \u00eatre utilis\u00e9 pour des installations \u00e0 usage unique de Nexcloud, o\u00f9 il est possible de sauvegarder la base en m\u00eame temps. L'avantage r\u00e9side non seulement dans le fait que tout se trouve au m\u00eame endroit, mais aussi que le contenu de la base est proche du contenu des fichiers, car la diff\u00e9rence de temps est minimale.<\/p>\n<p><\/p>\n<h2 id=\"restic-vs-borg\">Restic vs Borg<\/h2>\n<p><\/p>\n<p>Les comparaisons entre Borg et Restic se trouvent \u00e9galement <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/southbridge\/blog\/454734\/\">ici sur Habr\u00e9<\/a><\/noindex>, et nous n'avions pas pour objectif de cr\u00e9er simplement une autre comparaison, mais la n\u00f4tre. Il \u00e9tait important pour nous de voir comment cela s'applique \u00e0 nos donn\u00e9es, avec notre sp\u00e9cificit\u00e9. Nous les fournissons.<\/p>\n<p><\/p>\n<p>Nos crit\u00e8res de s\u00e9lection, en plus de ceux d\u00e9j\u00e0 mentionn\u00e9s (d\u00e9duplication, restauration rapide, etc.) :<\/p>\n<p><\/p>\n<ul>\n<li>R\u00e9sistance au travail non termin\u00e9. V\u00e9rification sur kill -9.<\/li>\n<li>Taille sur le disque.<\/li>\n<li>Exigences en ressources (CPU, m\u00e9moire).<\/li>\n<li>Taille des blobs stock\u00e9s.<\/li>\n<li>Travail avec S3.<\/li>\n<li>V\u00e9rification d'int\u00e9grit\u00e9.<\/li>\n<\/ul>\n<p><\/p>\n<p>Pour les tests, nous avons pris un client avec des donn\u00e9es r\u00e9elles et une taille totale de 1,6 To.<br \/>\nConditions.<\/p>\n<p><\/p>\n<p>Borg ne peut pas travailler directement avec S3, et nous avons mont\u00e9 un disque comme un fuse via <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kahing\/goofys\">goofys<\/a><\/noindex>. Restic envoyait directement vers S3.<\/p>\n<p><\/p>\n<p>Goofys fonctionne tr\u00e8s rapidement et bien, et il dispose de <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kahing\/catfs\">un module de cache disque<\/a><\/noindex>, ce qui acc\u00e9l\u00e8re encore le processus. Il est en phase beta, et, il faut l'admettre, nous avons eu des pannes avec perte de donn\u00e9es lors des tests (d'autres). Mais l'avantage est que la proc\u00e9dure de sauvegarde ne n\u00e9cessite pas beaucoup de lectures, mais principalement des \u00e9critures, donc nous n'utilisons le cache que lors de la v\u00e9rification d'int\u00e9grit\u00e9.<\/p>\n<p><\/p>\n<p>Pour r\u00e9duire l'impact du r\u00e9seau, nous avons utilis\u00e9 un fournisseur local \u2014 Yandex Cloud.<\/p>\n<p><\/p>\n<p>R\u00e9sultats des tests de comparaison.<\/p>\n<p><\/p>\n<ul>\n<li>Kill -9 avec un red\u00e9marrage ult\u00e9rieur, les deux ont r\u00e9ussi.<\/li>\n<li>Taille sur le disque. Borg sait compresser donc les r\u00e9sultats sont attendus.<\/li>\n<\/ul>\n<p><\/p>\n<p>Sauvegarde<br \/>\nTaille<\/p>\n<p>Borg<br \/>\n562Go<\/p>\n<p>Restic<br \/>\n628Go<\/p>\n<p><\/p>\n<ul>\n<li>Concernant le CPU<br \/>\nBorg utilise peu de ressources par lui-m\u00eame, avec la compression par d\u00e9faut, mais il faut \u00e9valuer cela en conjonction avec le processus goofys. En somme, ils sont comparables et utilisent environ 1,2 c\u0153ur sur la m\u00eame machine virtuelle de test.<\/li>\n<li>M\u00e9moire. Restic utilise environ 0,5 Go, Borg environ 200 Mo. Mais cela reste insignifiant compar\u00e9 au cache de fichiers du syst\u00e8me. Donc, il est pr\u00e9f\u00e9rable de pr\u00e9voir plus de m\u00e9moire.<\/li>\n<li>La diff\u00e9rence de taille des blobs s'est av\u00e9r\u00e9e frappante.<\/li>\n<\/ul>\n<p><\/p>\n<p>Sauvegarde<br \/>\nTaille<\/p>\n<p>Borg<br \/>\nenviron 500Mo<\/p>\n<p>Restic<br \/>\nenviron 5Mo<\/p>\n<p><\/p>\n<ul>\n<li>Le travail avec S3 de Restic est excellent. Le travail de Borg via goofys ne pose pas de probl\u00e8mes, mais il a \u00e9t\u00e9 remarqu\u00e9 qu'il est conseill\u00e9 de faire umount apr\u00e8s la sauvegarde pour vider compl\u00e8tement le cache. Une particularit\u00e9 du travail avec S3 est que les chunks non t\u00e9l\u00e9charg\u00e9s ne seront jamais envoy\u00e9s dans le bucket, ce qui signifie que des donn\u00e9es non enti\u00e8rement t\u00e9l\u00e9charg\u00e9es entra\u00eenent de grands dommages.<\/li>\n<li>La v\u00e9rification d'int\u00e9grit\u00e9 fonctionne bien dans les deux cas, mais la vitesse diff\u00e8re consid\u00e9rablement.<br \/>\nRestic \u2013 <strong>3,5 heures<\/strong>.<br \/>\nBorg, avec un cache de fichiers de 100 Go SSD \u2013 <strong>5 heures<\/strong>. Un r\u00e9sultat de vitesse \u00e0 peu pr\u00e8s \u00e9quivalent si les donn\u00e9es sont sur un disque local.<br \/>\nBorg lit directement depuis S3 sans cache <strong>33 heures<\/strong>. Terriblement long.<\/li>\n<\/ul>\n<p><\/p>\n<p>En r\u00e9sum\u00e9, Borg sait compresser et a de plus grands blobs \u2014 ce qui rend le stockage et les op\u00e9rations GET\/PUT dans S3 moins co\u00fbteux. Mais cela implique une v\u00e9rification plus complexe et plus lente. En ce qui concerne la vitesse de restauration \u2014 nous n'avons remarqu\u00e9 aucune diff\u00e9rence. Les sauvegardes ult\u00e9rieures (apr\u00e8s la premi\u00e8re) que fait Restic prennent un peu plus de temps, mais pas de mani\u00e8re significative.<\/p>\n<p><\/p>\n<p>La taille de la communaut\u00e9 n'\u00e9tait pas en dernier lieu dans notre choix.<\/p>\n<p><\/p>\n<p>Et nous avons choisi Borg.<\/p>\n<p><\/p>\n<h2 id=\"paru-slov-o-szhatii\">Quelques mots sur la compression<\/h2>\n<p><\/p>\n<p>Borg dispose d'un excellent nouvel algorithme de compression \u2014 zstd. En termes de qualit\u00e9 de compression, il n'est pas inf\u00e9rieur \u00e0 gzip, mais il est beaucoup plus rapide. Et il est comparable en rapidit\u00e9 \u00e0 l'algorithme par d\u00e9faut lz4.<\/p>\n<p><\/p>\n<p>Par exemple, un dump de base de donn\u00e9es MySQL se compresse deux fois mieux que lz4 \u00e0 la m\u00eame vitesse. Cependant, l'exp\u00e9rience avec des donn\u00e9es r\u00e9elles montre qu'il y a une tr\u00e8s petite diff\u00e9rence dans le taux de compression des n\u0153uds Nextcloud.<\/p>\n<p><\/p>\n<p>Borg propose en fait un mode de compression bonus \u2014 si un fichier a une grande entropie, alors la compression n'est pas appliqu\u00e9e, ce qui augmente la vitesse de fonctionnement. Cela s'active avec une option lors de la cr\u00e9ation<br \/>\n<code>-C auto,zstd<\/code><br \/>\npour l'algorithme zstd<br \/>\nEh bien, avec cette option, par rapport \u00e0 la compression par d\u00e9faut, nous avons obtenu<br \/>\n560 Go et 562 Go respectivement. Les donn\u00e9es de l'exemple ci-dessus, je le rappelle, sans compression, donnent un r\u00e9sultat de 628 Go. Le r\u00e9sultat avec 2 Go d'\u00e9cart nous a quelque peu surpris, mais nous avons d\u00e9cid\u00e9 de choisir finalement. <code>auto,zstd<\/code>.<\/p>\n<p><\/p>\n<h2 id=\"metodika-proverki-bekapa\">M\u00e9thode de v\u00e9rification de la sauvegarde<\/h2>\n<p><\/p>\n<p>La machine virtuelle est lanc\u00e9e directement chez le fournisseur ou chez le client via le planificateur, ce qui r\u00e9duit consid\u00e9rablement la charge r\u00e9seau. Au moins, cela co\u00fbte moins cher que de le faire chez soi et de transf\u00e9rer le trafic.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">goofys --cache \"--free:5%:\\\/mnt\\\/cache\" -o allow_other --endpoint https:\\\/\\\/storage.yandexcloud.net --file-mode=0666 --dir-mode=0777 xxxxxxx.com \\\/mnt\\\/goofys\nexport BORG_PASSCOMMAND=\"cat \\\/home\\\/borg\\\/.borg-passphrase\"\nborg list \\\/mnt\\\/goofys\\\/borg1\\\/\nborg check --debug -p --verify-data \\\/mnt\\\/goofys\\\/borg1\\\/<\/code><\/pre>\n<p><\/p>\n<p>Nous v\u00e9rifions \u00e9galement les fichiers avec un antivirus (a posteriori) selon le m\u00eame sch\u00e9ma. En effet, les utilisateurs t\u00e9l\u00e9chargent diverses choses dans Nextcloud et tous n'ont pas d'antivirus. Effectuer la v\u00e9rification au moment de l'upload prend trop de temps et nuit aux affaires.<\/p>\n<p><\/p>\n<p>L'\u00e9volutivit\u00e9 est atteinte par le lancement de runners sur diff\u00e9rentes n\u0153uds avec des tags vari\u00e9s.<br \/>\nDans notre monitoring, nous collectons les \u00e9tats de sauvegarde via l'API GitLab dans une seule fen\u00eatre, et en cas de probl\u00e8me, ceux-ci sont facilement remarquables et tout aussi facilement localisables.<\/p>\n<p><\/p>\n<h2 id=\"zaklyuchenie\">Conclusion<\/h2>\n<p><\/p>\n<p>En fin de compte, nous savons exactement que nous faisons des sauvegardes, que nos sauvegardes sont valides, et que les probl\u00e8mes qui surviennent avec elles prennent peu de temps et sont r\u00e9solus par l'administrateur de service. Les sauvegardes occupent r\u00e9ellement peu d'espace par rapport \u00e0 tar.gz ou Bacula.<\/p>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/508758\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 Nextcloud \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0421\u0422\u041e \u0432 \u00ab\u041c\u043e\u043b\u043d\u0438\u044f \u0410\u041a\u00bb, \u0433\u0434\u0435 \u043c\u044b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u0441\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c IT \u0441\u0438\u0441\u0442\u0435\u043c, \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Nextcloud. \u0412 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u0441 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439, \u0441 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432\u044b\u0442\u0435\u043a\u0430\u044e\u0449\u0438\u0435 \u0438\u0437 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0438\u043d\u0441\u0442\u0430\u043b\u043b\u044f\u0446\u0438\u0439 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043d\u043e\u0433\u043e. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":86905,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-86904","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 Nextcloud \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a GitLab \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u044d\u043a\u0430\u043f\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 NextCloud | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 Nextcloud \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-01T05:42:30+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-01T05:42:30+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Comment GitLab aide \u00e0 r\u00e9aliser des sauvegardes de grands stockages NextCloud | ProHoster","description":"Bonjour, Habr! Aujourd'hui, je veux partager notre exp\u00e9rience sur l'automatisation des sauvegardes de grandes donn\u00e9es dans Nextcloud dans diff\u00e9rentes configurations.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a GitLab \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u044d\u043a\u0430\u043f\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 NextCloud | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0445\u043e\u0447\u0443 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e \u043d\u0430\u0448\u0435\u043c \u043e\u043f\u044b\u0442\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 Nextcloud \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u0445.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/kak-gitlab-pomogaet-delat-bekapy-bolshih-hranilishh-nextcloud","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-01T05:42:30+00:00","article:modified_time":"2020-07-01T05:42:30+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"86904","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 14:03:54","updated":"2022-10-06 09:05:46","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/86904","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=86904"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/86904\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/86905"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=86904"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=86904"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=86904"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}