Réduisez les sauvegardes de 99,5 % avec hashget

hashget — est un dĂ©dupliqueur gratuit et open source — un outil semblable Ă  un compresseur qui permet de rĂ©duire considĂ©rablement la taille des sauvegardes, ainsi que d'organiser des schĂ©mas de sauvegarde incrĂ©mentielle et diffĂ©rentielle, et bien plus encore. Cet article est une vue d'ensemble des possibilitĂ©s. L'utilisation de hashget (assez simple) est dĂ©crite dans

le projet et README la documentation wiki Selon les rĂšgles du genre, je commencerai par l'intrigue — la comparaison des rĂ©sultats :.

Comparaison

Échantillon de donnĂ©es

taille non compressée
hashget .tar.gz
.tar.gz
WordPress-5.1.1

43 Mo
11 Mo ( 26 % )
155 Ko (
Noyau Linux 5.0.4 0.3% )

934 Mo
161 Mo ( 20 % )
4,7 Mo (
Debian 9 (LAMP) LXC VM 0.5% )

724 Mo
165 Mo ( 23 % )
4,1 Mo (
Contexte, à quoi devrait ressembler une sauvegarde idéale et efficace 0.5% )

Chaque fois que je faisais une sauvegarde d'une nouvelle machine virtuelle, j'avais l'impression que je faisais quelque chose de travers. Pourquoi ai-je une sauvegarde lourde d'un systĂšme oĂč ma prĂ©cieuse crĂ©ation immortelle est un simple index.html avec le texte « Hello world » ?

Pourquoi ma sauvegarde contient-elle un fichier 16 Mo /usr/sbin/mysqld ? Est-ce moi qui ai l'honneur de conserver ce fichier crucial, et si je n'y parviens pas, il sera perdu pour l'humanitĂ© ? Probablement pas. Il est stockĂ© sur des serveurs Debian hautement fiables (la fiabilitĂ© et la disponibilitĂ© de ceux-ci ne peuvent en aucun cas ĂȘtre comparĂ©es Ă  ce que je peux offrir), ainsi que dans des sauvegardes (millions) d'autres administrateurs. Avons-nous vraiment besoin de crĂ©er 10 000 000 + 1 copies de ce fichier important pour augmenter la fiabilitĂ© ?

En gros

et rĂ©sout ce problĂšme. Lors de l'archivage — il crĂ©e une sauvegarde trĂšs petite. Lors de la restauration — un systĂšme complĂštement restaurĂ©, similaire Ă  celui qui aurait Ă©tĂ© obtenu avec hashget tar -c tar -x / . (En d'autres termes, c'est un archivage sans perte)Comment fonctionne hashget

Dans hashget, il y a des concepts de Package et HashPackage, avec lesquels il réalise la déduplication.

(package). Un fichier (gĂ©nĂ©ralement un archive .deb ou .tar.gz) qui peut ĂȘtre tĂ©lĂ©chargĂ© en toute sĂ©curitĂ© depuis le rĂ©seau, et dont il est possible d'extraire un ou plusieurs fichiers.

Package HashPackage

— un petit fichier JSON reprĂ©sentant le Package, contenant notamment l'URL du paquet et les sommes de contrĂŽle (sha256) des fichiers Ă  l'intĂ©rieur. Par exemple, pour le paquet mariadb-server-core de 5 mĂ©gaoctets, la taille de hashpackage est de seulement 6 Ko. Environ mille fois plus petit. La dĂ©duplication

— consiste Ă  crĂ©er une archive sans fichiers dupliquĂ©s (si le dĂ©dupliqueur sait oĂč le paquet d'origine peut ĂȘtre tĂ©lĂ©chargĂ©, il rĂ©duit les duplicatas de l'archive). Archivage

Compression

Lors de l'archivage, tous les fichiers du répertoire à archiver sont examinés, leurs sommes de contrÎle sont calculées et si la somme est trouvée dans l'un des HashPackages connus, les métadonnées du fichier (nom, hachage, droits d'accÚs, etc.) sont enregistrées dans un fichier spécial .hashget-restore.json, qui sera également inclus dans l'archive.

L'archivage lui-mĂȘme ressemble, dans son cas le plus simple, Ă  un tar :

hashget -zf /tmp/mybackup.tar.gz --pack /path/to/data

Extraction

L'extraction se fait en deux étapes. D'abord, l'extraction tar classique :

tar -xf mybackup.tar.gz -C /path/to/data

puis la restauration depuis le réseau :

hashget -u /path/to/data

Lors de la restauration, hashget lit le fichier .hashget-restore.json, télécharge les paquets nécessaires, les extrait et place les fichiers requis aux emplacements appropriés, en définissant les propriétaires, groupes et permissions nécessaires.

Des choses plus complexes

Ce qui est décrit ci-dessus est suffisant pour ceux qui veulent « comme tar, mais qui emballe mon Debian en 4 mégaoctets». Passons maintenant à des choses plus complexes.

Indexation

Si hashget n'avait pas eu un seul HashPackage, il n'aurait tout simplement pas pu dédupliquer quoi que ce soit.

On peut créer un HashPackage manuellement (simplement : hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my), mais il y a une méthode plus pratique.

Pour obtenir les HashPackages nécessaires, il y a une étape d'indexation (elle s'exécute automatiquement lors de la commande --packDeep Speech d'heuristique. Lors de l'indexation, hashget «présente» chaque fichier trouvé à toutes les heuristiques disponibles qui l'intéressent. Les heuristiques peuvent ensuite indexer un Package afin de créer un HashPackage.

Par exemple, l'heuristique Debian aime le fichier /var/lib/dpkg/status et dĂ©tecte les paquets Debian installĂ©s, et s'ils ne sont pas indexĂ©s (si aucun HashPackage n'a Ă©tĂ© créé pour eux), elle les tĂ©lĂ©charge et les indexe. Cela a un effet trĂšs agrĂ©able : hashget dĂ©dupliquera toujours efficacement les systĂšmes d'exploitation Debian, mĂȘme s'ils contiennent les paquets les plus rĂ©cents.

Fichiers d'indice (hints)

Si votre réseau utilise un paquet propriétaire ou un paquet public qui n'est pas inclus dans les heuristiques de hashget, vous pouvez ajouter un simple fichier de hints hashget-hint.json au format suivant :

{
    "project": "wordpress.org",
    "url": "https://ru.wordpress.org/wordpress-5.1.1-ru_RU.zip"
}

Ensuite, chaque fois qu'une archive est créée, le paquet sera indexĂ© (s'il ne l'a pas Ă©tĂ© auparavant), et les fichiers du paquet seront dĂ©dupliquĂ©s de l'archive. Il n'est pas nĂ©cessaire de programmer, tout peut ĂȘtre fait depuis vim et Ă©conomiser Ă  chaque sauvegarde. Notez qu'en raison de l'approche par hachage, si des fichiers du paquet sont modifiĂ©s localement (par exemple, un fichier de configuration a Ă©tĂ© modifiĂ©) — les fichiers modifiĂ©s seront conservĂ©s dans l'archive « tels quels » et ne seront pas rĂ©duits.

Si un de vos propres paquets est mis Ă  jour rĂ©guliĂšrement, mais que les changements ne sont pas trĂšs importants, vous pouvez faire un hint uniquement pour les versions principales. Par exemple, dans la version 1.0, un hint a Ă©tĂ© fait pointant vers mypackage-1.0.tar.gz, et il sera complĂštement dĂ©dupliquĂ©, puis la version 1.1 a Ă©tĂ© publiĂ©e, qui est lĂ©gĂšrement diffĂ©rente, sans mettre Ă  jour le hint. Ce n'est pas grave. Seuls les fichiers qui correspondent (qui peuvent ĂȘtre restaurĂ©s) Ă  la version 1.0 seront dĂ©dupliquĂ©s.

L'heuristique qui traite le fichier hint — est un bon exemple pour comprendre le mĂ©canisme interne de fonctionnement des heuristiques. Elle traite uniquement les fichiers hashget-hint.json (ou .hashget-hint.json avec un point) et ignore tous les autres. À partir de ce fichier, elle dĂ©termine quelle URL de paquet doit ĂȘtre indexĂ©e, et hashget l'indexe (s'il ne l'a pas fait auparavant).

HashServer

Il serait assez laborieux de procĂ©der Ă  l'indexation complĂšte lors de la crĂ©ation de sauvegardes. Pour cela, il faudrait tĂ©lĂ©charger chaque paquet, le dĂ©compresser, l'indexer. C'est pourquoi hashget utilise un schĂ©ma avec HashServer. Lorsqu'un paquet debian installĂ© est dĂ©tectĂ©, s'il ne se trouve pas dans les HashPackage locaux, une tentative est d'abord faite pour simplement tĂ©lĂ©charger HashPackage depuis le serveur de hachage. Et seulement si cela Ă©choue — hashget tĂ©lĂ©charge et hachĂšte le paquet lui-mĂȘme (et le tĂ©lĂ©charge sur hashserver, afin que, par la suite, hashserver puisse le fournir).

HashServer n'est pas un Ă©lĂ©ment obligatoire du schĂ©ma, il n'est pas critique, il sert uniquement Ă  accĂ©lĂ©rer et Ă  rĂ©duire la charge sur les dĂ©pĂŽts. Il peut ĂȘtre facilement dĂ©sactivĂ© (avec l'option --hashserver sans paramĂštres). De plus, il est facile de crĂ©er votre propre hashserver..

Sauvegardes incrémentales et différentielles, expiration planifiée

hashget permettent de crĂ©er trĂšs facilement un schĂ©ma de sauvegardes incrĂ©mentales et diffĂ©rentielles.Pourquoi ne pas indexer notre propre sauvegarde (avec tous nos fichiers uniques) ? Une commande --submit Et c'est prĂȘt ! La prochaine sauvegarde que crĂ©era hashget n'inclura pas les fichiers de cette archive.

Mais ce n'est pas une bonne approche, car il peut arriver qu'en cas de restauration, nous devions solliciter toutes les sauvegardes hashget de l'historique (si chacune contient au moins un fichier unique). Pour cela, il existe un mĂ©canisme de pĂ©remption planifiĂ©e des sauvegardes. Lors de l'indexation, vous pouvez spĂ©cifier la date d'expiration de HashPackage --expires 2019-06-01, et Ă  l'arrivĂ©e de cette date (Ă  00:00), il ne sera pas utilisĂ©. L'archive elle-mĂȘme peut ĂȘtre conservĂ©e aprĂšs cette date (bien que hashget puisse facilement montrer les URL de toutes les sauvegardes qui ont expirĂ© ou expireront Ă  ce moment-lĂ  ou Ă  toute date donnĂ©e).

Par exemple, si nous faisons une sauvegarde complÚte le 1er et que nous l'indexons avec une durée de vie jusqu'à la fin du mois, nous obtiendrons un schéma de sauvegarde différentielle.

Si nous indexons également les nouvelles sauvegardes de cette maniÚre, nous aurons un schéma de sauvegardes incrémentales.

Contrairement aux schĂ©mas traditionnels, hashget permet d'utiliser plusieurs sources de base. La sauvegarde sera rĂ©duite Ă  la fois par la rĂ©duction des fichiers des sauvegardes prĂ©cĂ©dentes (s'ils existent) et par les fichiers publics (ce qui peut ĂȘtre tĂ©lĂ©chargĂ©).

Si, pour une raison quelconque, nous ne faisons pas confiance à la fiabilité des ressources Debian (https://snapshot.debian.org/) ou utilisons une autre distribution, nous pouvons simplement effectuer une sauvegarde complÚte avec tous les paquets une fois, et nous appuyer sur elle par la suite (désactivant l'heuristique). Maintenant, si tous nos serveurs de distribution deviennent inaccessibles (dans un Internet souvenir ou lors d'un apocalypse zombie), mais que nos sauvegardes sont en ordre, nous pourrons nous restaurer à partir de n'importe quelle sauvegarde différentielle courte, en nous appuyant uniquement sur nos sauvegardes antérieures.

Hashget s'appuie uniquement sur des sources de restauration fiables à votre convenance. Celles que vous jugez fiables seront utilisées.

FilePool et Glacier

Le mécanisme FilePool permet de ne pas avoir à se connecter en permanence à des serveurs externes pour télécharger des paquets, mais d'utiliser des paquets à partir d'un répertoire local ou d'un serveur d'entreprise, par exemple :

$ hashget -u . --pool /tmp/pool

ou

$ hashget -u . --pool http://myhashdb.example.com/

Pour créer un pool dans un répertoire local, il suffit de créer un répertoire et d'y ajouter des fichiers, hashget trouvera ce dont il a besoin par hachage. Pour rendre le pool accessible via HTTP, il faut créer des liens symboliques d'une maniÚre spéciale, cela se fait avec une seule commande (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). Le HTTP FilePool concerne des fichiers statiques, donc n'importe quel serveur web simple peut le gérer, la charge sur le serveur est presque nulle.

GrĂące Ă  FilePool, il est possible d'utiliser non seulement des ressources http(s) comme ressources de base, mais aussi, par exemple,, Amazon Glacier.

AprÚs avoir téléchargé la sauvegarde sur Glacier, nous obtenons son ID de téléchargement et l'utilisons comme URL. Par exemple :

hashget --submit Glacier_Upload_ID --file /tmp/my-glacier-backup.tar.gz --project glacier --hashserver --expires 2019-09-01

Maintenant, les nouvelles sauvegardes (différentielles) se baseront sur cette sauvegarde et seront plus courtes. AprÚs déballage tar de la sauvegarde différentielle, nous pouvons voir sur quelles ressources elle s'appuie :

hashget --info /tmp/unpacked/ list

et simplement avec un script shell, télécharger tous ces fichiers depuis Glacier dans le pool et lancer la restauration normale : hashget -u /tmp/unpacked --pool /tmp/pool

Est-ce que ça vaut vraiment le coup

Dans le plus simple des cas, vous paierez simplement moins pour les sauvegardes (si vous les stockez quelque part dans le cloud Ă  des frais). Peut-ĂȘtre beaucoup moins.

Mais ce n'est pas tout. La quantitĂ© se transforme en qualitĂ©. Vous pouvez utiliser cela pour obtenir une amĂ©lioration significative de votre schĂ©ma de sauvegarde. Par exemple, puisque nos sauvegardes sont maintenant plus courtes, nous pouvons effectuer des sauvegardes non plus mensuelles, mais quotidiennes. Les conserver pendant 5 ans au lieu de 6 mois, comme auparavant. Auparavant, elles Ă©taient stockĂ©es dans un « entrepĂŽt froid » lent mais bon marchĂ© (Glacier), maintenant vous pouvez les stocker dans un entrepĂŽt chaud, d'oĂč vous pouvez toujours rapidement tĂ©lĂ©charger la sauvegarde et vous restaurer en quelques minutes, au lieu d'un jour.

Vous pouvez augmenter la fiabilité du stockage des sauvegardes. Si nous les stockons actuellement dans un seul entrepÎt, en réduisant le volume des sauvegardes, nous pourrons les conserver dans 2-3 entrepÎts et survivre sans problÚme si l'un d'eux est endommagé.

Comment essayer et commencer Ă  utiliser ?

Rendez-vous sur la page GitLab https://gitlab.com/yaroslaff/hashget, installez avec une seule commande (pip3 install hashget[plugins]) et il suffit de lire et d'exécuter le quick-start. Je pense que tout ce qui est simple à faire prendra environ 10-15 minutes. Ensuite, on peut essayer de compresser nos machines virtuelles, créer des fichiers hint si nécessaire pour une compression plus efficace, jouer avec les pools, la base de données de hachages locale et le hachage serveur, si cela vous intéresse, et le lendemain, voir quelle sera la taille de la sauvegarde incrémentielle par rapport à celle d'hier.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster