— ist ein kostenloser, Open-Source Deduplicator — eine Utility, die ähnlich wie ein Archivator funktioniert und es ermöglicht, die Größe von Backups erheblich zu reduzieren sowie inkrementelle und differenzielle Backup-Schemata zu organisieren und mehr.
Dies ist ein Überblicksartikel, der die Möglichkeiten beschreibt. Die Anwendung von hashget (ziemlich einfach) wird erläutert in Projekt und .
Der Vergleich
Wie es sich gehört, beginne ich gleich mit der Spannung — dem Vergleich der Ergebnisse:
Datenprobe
Entpackte Größe
.tar.gz
hashget .tar.gz
WordPress-5.1.1
43 Mb
11 Mb (26 %)
155 Kb ( 0.3% )
Linux-Kernel 5.0.4
934 Mb
161 Mb (20 %)
4.7 Mb ( 0.5% )
Debian 9 (LAMP) LXC VM
724 Mb
165 Mb (23 %)
4.1 Mb ( 0.5% )
Die Vorgeschichte, wie ein ideales und effektives Backup aussehen sollte
Jedes Mal, wenn ich ein Backup der neu erstellten virtuellen Maschine machte, hatte ich das nagende Gefühl, dass ich etwas falsch mache. Warum erhalte ich ein schweres Backup von einem System, in dem mein unbezahlbarer, unvergänglicher Kreativbeitrag — eine einzeilige index.html mit dem Text „Hello world“ — steckt?
Warum ist in meinem Backup eine 16-Megabyte große /usr/sbin/mysqld-Datei? Ist es wirklich mein Schicksal, diese wichtige Datei zu speichern, und wird sie für die Menschheit verloren gehen, wenn ich es nicht schaffe? Wahrscheinlich nicht. Sie wird auf hochverfügbaren Debian-Servern gespeichert (deren Zuverlässigkeit und Stabilität sind unübertroffen im Vergleich zu dem, was ich bieten kann), sowie in den Backup-Kopien (Millionen davon) anderer Administratoren. Müssen wir wirklich eine 10.000.001. Kopie dieser wichtigen Datei zur Erhöhung der Zuverlässigkeit erstellen?
Im Grunde genommen und löst dieses Problem. Beim Verpacken - erstellt es ein sehr kleines Backup. Beim Entpacken - eine vollständig entpackte Systemumgebung, die derjenigen ähnlich ist, die bei tar -c / tar -x. (Mit anderen Worten, es handelt sich um verlustfreies Packaging)
Wie hashget funktioniert
In hashget gibt es die Konzepte Package und HashPackage, mit deren Hilfe es die Deduplikation durchführt.
Package (Paket). Eine Datei (normalerweise ein .deb- oder .tar.gz-Archiv), die aus dem Internet zuverlässig heruntergeladen werden kann und aus der eine oder mehrere Dateien extrahiert werden können.
HashPackage — eine kleine JSON-Datei, die das Paket beschreibt und die URL des Pakets sowie die Hash-Werte (sha256) der enthaltenen Dateien enthält. Zum Beispiel hat das Paket mariadb-server-core mit einer Größe von 5 Megabyte insgesamt ein HashPackage von nur 6 Kilobyte. Das ist ungefähr tausendmal kleiner.
Deduplication — Erstellung eines Archivs ohne doppelte Dateien (wenn der Deduplikator weiß, wo das Originalpaket heruntergeladen werden kann, reduziert er die Duplikate im Archiv).
Paketierung
Bei der Paketierung werden alle Dateien aus dem zu paketierenden Verzeichnis durchgesehen, ihre Hash-Werte erfasst, und wenn der Hash in einem der bekannten HashPackages gefunden wird, werden die Metadaten der Datei (Name, Hash, Zugriffsrechte usw.) in einer speziellen Datei .hashget-restore.json gespeichert, die ebenfalls ins Archiv aufgenommen wird.
Die eigentliche Paketierung sieht im einfachsten Fall nicht komplizierter aus als bei tar:
hashget -zf /tmp/mybackup.tar.gz --pack /path/to/dataEntpacken
Die Entpackung erfolgt in zwei Schritten. Zuerst die normale tar-Entpackung:
tar -xf mybackup.tar.gz -C /path/to/dataanschließend die Wiederherstellung aus dem Netzwerk:
hashget -u /path/to/dataBei der Wiederherstellung liest hashget die Datei .hashget-restore.json, lädt die erforderlichen Pakete herunter, entpackt sie und extrahiert die benötigten Dateien, wobei sie an die entsprechenden Pfade mit den gewünschten Owner/Group/Rechten installiert werden.
Komplexere Dinge
Was oben beschrieben wurde, reicht aus für alle, die denken: „Ich möchte etwas wie tar, aber damit ich mein Debian in 4 Megabyte verpacken kann.“ Im Folgenden betrachten wir komplexere Dinge.
Indizierung
Falls hashget gar kein HashPackage hätte, könnte es nichts deduplizieren.
Ein HashPackage kann auch manuell erstellt werden (einfach: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my), aber es gibt einen bequemeren Weg.
Um die benötigten HashPackages zu erhalten, gibt es den Schritt Indizierung (dies wird automatisch bei dem Befehl --pack) und Heuristiken). Bei der Indizierung "füttert" hashget jede gefundene Datei allen verfügbaren interessanten Heuristiken. Diese Heuristiken können dann ein Package indizieren, um ein HashPackage zu erstellen.
Zum Beispiel liebt die Debian-Heuristik die Datei /var/lib/dpkg/status und entdeckt installierte Debian-Pakete. Wenn sie noch nicht indiziert sind (keine HashPackages erstellt wurden), lädt sie diese herunter und indiziert sie. Das führt zu einem sehr angenehmen Effekt – hashget wird immer effektiv Debian-basierte Betriebssysteme deduplizieren, selbst wenn sie die neuesten Pakete enthalten.
Hinweisdateien
Falls in Ihrem Netzwerk ein proprietäres oder öffentliches Paket verwendet wird, das nicht in die Hashget-Heuristiken aufgenommen wurde, können Sie eine einfache Hint-Datei namens hashget-hint.json im folgenden Format hinzufügen:
{
"project": "wordpress.org",
"url": "https://de.wordpress.org/wordpress-5.1.1-de_DE.zip"
}Jedes Mal, wenn ein Archiv erstellt wird, wird das Paket indexiert (sofern dies nicht bereits geschehen ist), und die Paketdateien werden aus dem Archiv dedupliziert. Es ist keine Programmierung erforderlich, alles kann aus Vim erledigt werden, wodurch bei jedem Backup gespart wird. Beachten Sie, dass durch den Ansatz über Hashsummen, falls einige Dateien des Pakets lokal geändert werden (z. B. die Konfigurationsdatei verändert wird) - die geänderten Dateien im Archiv "so wie sie sind" erhalten bleiben und nicht reduziert werden.
Wenn ein eigenes Paket regelmäßig aktualisiert wird, die Änderungen jedoch nicht sehr groß sind, kann der Hinweis nur für Hauptversionen erfolgen. Zum Beispiel wurde in Version 1.0 ein Hinweis auf mypackage-1.0.tar.gz erstellt, und diese wird vollständig dedupliziert. Dann wurde die Version 1.1 veröffentlicht, die sich geringfügig unterscheidet, aber der Hinweis wurde nicht aktualisiert. Das ist kein Problem. Es werden nur die Dateien dedupliziert, die mit Version 1.0 übereinstimmen (die wiederhergestellt werden können).
Die Heuristik, die die Hinweisdatei verarbeitet, ist ein gutes Beispiel, um den internen Mechanismus der Heuristiken zu verstehen. Sie verarbeitet nur Dateien hashget-hint.json (oder .hashget-hint.json mit einem Punkt) und ignoriert alle anderen. Anhand dieser Datei wird bestimmt, welche URL des Pakets indiziert werden soll, und hashget indiziert sie (falls dies nicht bereits geschehen ist).
HashServer
Es wäre ziemlich aufwendig, bei der Erstellung von Backups eine vollständige Indizierung durchzuführen. Dazu müsste jedes Paket heruntergeladen, entpackt und indiziert werden. Daher verwendet hashget ein Schema mit . Bei der Erkennung eines installierten Debian-Pakets, das nicht in den lokalen HashPackage zu finden ist, wird zunächst versucht, HashPackage einfach von einem Hash-Server herunterzuladen. Nur wenn dies nicht gelingt, wird hashget das Paket selbst herunterladen und hashen (und auf den Hashserver hochladen, damit er es später bereitstellen kann).
HashServer ist kein obligatorisches Element des Schemas, spielt keine kritische Rolle und dient ausschließlich dazu, die Geschwindigkeit zu erhöhen und die Last auf die Repositories zu verringern. Kann leicht deaktiviert werden (mit der Option --hashserver ohne Parameter). Darüber hinaus kann problemlos .
Inkrementelle und differentielle Backups sowie geplante Abläufe
ermöglichen ein sehr einfaches Schema Warum sollten wir nicht unser eigenes Backup (mit all unseren einzigartigen Dateien) indizieren? Ein einziger Befehl --submit und alles ist bereit! Das nächste Backup, das hashget erstellt, wird keine Dateien aus diesem Archiv enthalten.
Aber das ist nicht der beste Ansatz, denn es könnte sein, dass wir beim Wiederherstellen alle hashget-Backups aus der gesamten Historie durchsehen müssen (wenn in jedem mindestens eine einzigartige Datei enthalten ist). Dafür gibt es einen Mechanismus. . Bei der Indizierung kann ein Ablaufdatum für HashPackage angegeben werden --expires 2019-06-01, und nach diesem Datum (ab 00:00) wird es nicht mehr verwendet. Das Archiv selbst kann nach diesem Datum nicht gelöscht werden (obwohl hashget die URLs aller Backups, die wir haben oder zu einem bestimmten Zeitpunkt ablaufen, bequem anzeigen kann).
Wenn wir am 1. des Monats ein vollständiges Backup erstellen und es bis zum Ende des Monats indexieren — erhalten wir ein Schema für das differentielle Backup.
Wenn wir auch neue Backups indexieren — haben wir ein Schema für inkrementelle Backups.
Im Gegensatz zu traditionellen Schemen ermöglicht hashget die Verwendung mehrerer Basisquellen. Das Backup wird sowohl durch die Reduzierung von Dateien aus vorherigen Backups (sofern vorhanden) als auch durch öffentliche Dateien (was heruntergeladen werden kann) verkürzt.
Wenn wir aus irgendeinem Grund der Zuverlässigkeit der Debian-Ressourcen nicht vertrauen () oder eine andere Distribution verwenden, können wir einmal ein vollständiges Backup mit allen Paketen erstellen und uns dann darauf stützen (). Wenn alle Server unserer Distributionen nicht verfügbar sind (im nostalgischen Internet oder während einer Zombie-Apokalypse), aber unsere Backups intakt sind, können wir uns aus einem kürzeren Diff-Backup, das sich nur auf unsere früheren Backups stützt, wiederherstellen.
Hashget vertraut ausschließlich auf zuverlässige Wiederherstellungsmöglichkeiten nach IHREM Ermessen. Was Sie für vertrauenswürdig erachten, wird verwendet.
FilePool und Glacier
Mechanismus ermöglicht es, nicht ständig auf externe Server zuzugreifen, um Pakete herunterzuladen, sondern Pakete aus einem lokalen Verzeichnis oder einem Unternehmensserver zu verwenden, zum Beispiel:
$ hashget -u . --pool /tmp/pooloder
$ hashget -u . --pool http://myhashdb.example.com/Um einen Pool im lokalen Verzeichnis zu erstellen, genügt es, einfach ein Verzeichnis zu erstellen und Dateien hineinzuwerfen; hashget findet anhand der Hashes, was es benötigt. Um den Pool über HTTP zugänglich zu machen, müssen spezielle symbolische Links erstellt werden, dies erfolgt mit einem Befehl (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). Der HTTP FilePool besteht aus statischen Dateien, sodass er von jedem einfachen Webserver bereitgestellt werden kann, die Serverlast ist nahezu null.
Dank FilePool können als Basisressourcen nicht nur http(s)-Ressourcen genutzt werden, sondern auch, , Amazon Glacier.
Nach dem Hochladen des Backups auf den Glacier erhalten wir die Upload-ID und verwenden sie als URL. Zum Beispiel:
hashget --submit Glacier_Upload_ID --file /tmp/my-glacier-backup.tar.gz --project glacier --hashserver --expires 2019-09-01Jetzt basieren die neuen (inkrementellen) Backups auf diesem Backup und sind kürzer. Nach der Entpackung des inkrementellen Backups können wir sehen, auf welche Ressourcen es sich stützt:
hashget --info /tmp/unpacked/listund einfach mit einem Shell-Skript alle diese Dateien aus dem Glacier in den Pool herunterladen und die normale Wiederherstellung starten: hashget -u /tmp/unpacked --pool /tmp/pool
Ist der Aufwand die Mühe wert?
Im einfachsten Fall zahlen Sie einfach weniger für Backups (wenn Sie diese irgendwo in der Cloud gegen Gebühr speichern). Vielleicht sogar viel weniger.
Aber das ist nicht alles. Quantität wird zu Qualität. Sie können dies nutzen, um ein qualitatives Upgrade Ihres Backup-Schemas zu erhalten. Zum Beispiel, da unsere Backups jetzt kürzer sind – können wir anstelle von monatlichen Backups tägliche Backups durchführen. Statt sie ein halbes Jahr wie zuvor zu speichern, können wir sie nun fünf Jahre lang aufbewahren. Früher wurden sie in langsamen, aber günstigen "kalten" Speichern (Glacier) aufbewahrt, jetzt können Sie sie in einem schnellen, heißen Speicher lagern, von dem aus Sie jederzeit schnell ein Backup herunterladen und sich innerhalb von Minuten und nicht innerhalb eines Tages wiederherstellen können.
Die Zuverlässigkeit der Backup-Speicherung kann erhöht werden. Wenn wir sie derzeit in einem einzigen Speicher aufbewahren, können wir durch die Reduzierung des Backup-Volumens in 2-3 Speichern lagern und ohne Probleme überstehen, falls einer davon beschädigt wird.
Wie kann ich es ausprobieren und anfangen, es zu nutzen?
Wir besuchen die GitLab-Seite , installieren mit einem Befehl (pip3 install hashget[plugins]) und einfach das Schnellstart-Handbuch lesen und umsetzen. Ich denke, diese einfachen Dinge erledigen sich in etwa 10-15 Minuten. Danach kann man versuchen, seine Virtuellen Maschinen zu optimieren, gegebenenfalls Hint-Dateien erstellen, um die Komprimierung zu verstärken, mit Pools, einer lokalen Hash-Datenbank und dem Hash-Server zu experimentieren, wenn es interessant ist. Am nächsten Tag kann man dann sehen, wie groß das inkrementelle Backup im Vergleich zum gestrigen sein wird.
Quelle: habr.com
