— ist ein kostenloses, Open-Source Deduplicator — ein ähnliches Tool wie ein Archivierungsprogramm, das 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 zur Beschreibung der Möglichkeiten. Die eigentliche Nutzung von hashget (recht einfach) ist beschrieben in dem Projekt und .
Vergleich
Nach dem Gesetz des Genres beginne ich gleich mit der Neugier — den Vergleich der Ergebnisse:
Datensatzprobe
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 das ideale und effektive Backup sein sollte
Jedes Mal, wenn ich ein Backup einer neu erstellten virtuellen Maschine gemacht habe, hatte ich das Gefühl, dass ich etwas falsch mache. Warum erhalte ich ein schweres Backup von dem System, in dem mein unbezahlbares immaterielles Werk — eine einzeilige index.html mit dem Text „Hello world“ — zu finden ist?
Warum enthält mein Backup eine 16-Megabyte-Datei /usr/sbin/mysqld? Sollte ich wirklich der Glückliche sein, der die Ehre hat, diese wichtige Datei zu speichern, und wenn ich es nicht schaffe — wird sie für die Menschheit verloren sein? Wahrscheinlich nicht. Sie wird auf hochzuverlässigen Debian-Servern gespeichert (deren Zuverlässigkeit und Betriebszeit mit dem, was ich bieten kann, nicht zu vergleichen ist), sowie in Backups (Millionen davon) anderer Admins. Müssen wir wirklich zur Erhöhung der Zuverlässigkeit eine 10.000.000 + 1. Kopie dieser wichtigen Datei erstellen?
Im Grunde genommen wird dieses Problem gelöst. Beim Packen — erstellt es ein sehr kleines Backup. Beim Entpacken — ein vollständig entpacktes System, das dem ähnlich ist, das durch tar -c / tar -x. (Mit anderen Worten, es handelt sich um verlustfreies Packen)
Wie hashget funktioniert
In hashget gibt es die Begriffe Package und HashPackage, mit deren Hilfe die Deduplication durchgeführt wird.
Package (Paket). Eine Datei (normalerweise ein .deb oder .tar.gz Archiv), die zuverlässig aus dem Internet heruntergeladen werden kann, und aus der eine oder mehrere Dateien extrahiert werden können.
HashPackage — eine kleine JSON-Datei, die ein Package repräsentiert, einschließlich der URL des Pakets und der Hash-Werte (sha256) der darin enthaltenen Dateien. Zum Beispiel hat das Paket mariadb-server-core mit einer Größe von 5 Megabyte eine HashPackage-Größe von nur 6 Kilobyte. Etwa tausend Mal kleiner.
Deduplication — Erstellung eines Archivs ohne doppelte Dateien (wenn der Deduplicator weiß, wo das Originalpaket heruntergeladen werden kann, reduziert er die Duplikate im Archiv).
Packen
Beim Verpacken werden alle Dateien aus dem zu verpackenden Verzeichnis überprüft, ihre Hashsummen berechnet, und wenn die Summe in einem der bekannten HashPackage gefunden wird, werden die Metadaten zur Datei (Name, Hash, Zugriffsrechte usw.) in eine spezielle Datei .hashget-restore.json gespeichert, die ebenfalls im Archiv enthalten sein wird.
Das eigentliche Verpacken sieht im einfachsten Fall nicht komplizierter aus als tar:
hashget -zf /tmp/mybackup.tar.gz --pack /path/to/dataEntpacken
Das Entpacken erfolgt in zwei Phasen. Zuerst das normale tar-Entpacken:
tar -xf mybackup.tar.gz -C /path/to/datadann das Wiederherstellen aus dem Netz:
hashget -u /path/to/dataBeim Wiederherstellen liest hashget die Datei .hashget-restore.json, lädt die benötigten Pakete herunter, entpackt sie und extrahiert die benötigten Dateien, wobei es sie an die erforderlichen Pfade mit den entsprechenden Owner/Group/Rechten installiert.
Komplexere Dinge
Das, was oben beschrieben ist, ist bereits ausreichend für diejenigen, die sagen: „Ich möchte es wie tar, aber so, dass mein Debian in 4 Megabyte verpackt wird“. Schauen wir uns nun komplexere Dinge an.
Indizierung
Wenn hashget überhaupt keine 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 einfacheren Weg.
Um die erforderlichen HashPackages zu erhalten, gibt es den Schritt der Indizierung (dies wird automatisch ausgeführt, wenn der Befehl --pack) und heuristischer). Bei der Indizierung "füttert" hashget jede gefundene Datei allen vorhandenen Heuristiken, die ihn interessieren. Heuristiken können dann ein Package indizieren, um ein HashPackage zu erstellen.
Zum Beispiel mag die Debian-Heuristik die Datei /var/lib/dpkg/status und entdeckt installierte Debian-Pakete. Wenn diese nicht indiziert sind (für sie wurden keine HashPackage erstellt), werden sie heruntergeladen und indiziert. Es ergibt sich ein sehr erfreulicher Effekt — hashget wird immer effektiv Debian-Betriebssysteme deduplizieren, selbst wenn die neuesten Pakete darauf sind.
Hinweisdateien (Hints)
Wenn in Ihrem Netzwerk ein proprietäres Paket oder ein öffentliches Paket verwendet wird, das nicht in den Heuristiken von hashget enthalten ist, können Sie ihm eine einfache Hint-Datei hashget-hint.json nach dem Muster hinzufügen:
{
"project": "wordpress.org",
"url": "https://ru.wordpress.org/wordpress-5.1.1-ru_RU.zip"
}Jedes Mal, wenn ein Archiv erstellt wird, wird das Paket indiziert (falls es nicht zuvor war), und die Dateien des Pakets werden aus dem Archiv dedupliziert. Es ist keine Programmierung erforderlich, alles kann aus vim erledigt werden, was bei jedem Backup Zeit spart. Beachten Sie, dass dank der Verwendung von Hashwerten, wenn einige Dateien im Paket lokal verändert werden (zum Beispiel eine Konfigurationsdatei geändert wird) — die geänderten Dateien im Archiv "wie sie sind" gespeichert werden und nicht reduziert werden.
Wenn ein eigenes Paket regelmäßig aktualisiert wird, aber die Änderungen nicht sehr groß sind, kann der Hinweis nur für Hauptversionen gemacht werden. Zum Beispiel in Version 1.0 wurde ein Hinweis auf mypackage-1.0.tar.gz gesetzt, und es wird vollständig dedupliziert, dann wurde Version 1.1 veröffentlicht, die sich geringfügig unterscheidet, aber der Hinweis wurde nicht aktualisiert. Das ist nicht schlimm. 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 zum Verständnis des internen Mechanismus von Heuristiken. Sie verarbeitet nur die Dateien hashget-hint.json (oder .hashget-hint.json mit Punkt) und ignoriert alle anderen. Anhand dieser Datei wird entschieden, welcher URL des Pakets indiziert werden soll, und hashget indiziert ihn (falls dies vorher nicht 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 . Wenn ein installiertes Debian-Paket erkannt wird und es nicht in den lokalen HashPackage gefunden wird, wird zunächst versucht, einfach HashPackage vom Hash-Server herunterzuladen. Und nur wenn das nicht gelingt, lädt hashget das Paket selbst herunter und hasht es (und lädt es auf den Hashserver, damit dieser es später bereitstellt).
HashServer ist kein zwingendes Element des Schemas, sondern dient ausschließlich der Beschleunigung und Entlastung der Repositories. Es kann leicht deaktiviert werden (mit der Option --hashserver ohne Parameter). Außerdem kann man leicht .
Inkrementelle und differenzielle Backups, geplante Veralterung
ermöglichen eine sehr einfache Umsetzung des Schemas . Warum sollten wir unser Backup nicht selbst indizieren (mit all unseren einzigartigen Dateien)? Ein Befehl --submit und alles ist bereit! Das nächste Backup, das hashget erstellt, wird die Dateien aus diesem Archiv nicht einschließen.
Aber das ist nicht sehr sinnvoll, denn es könnte sein, dass wir beim Wiederherstellen jeden hashget-Backup aus der gesamten Historie ziehen müssen (wenn in jedem mindestens eine einzigartige Datei vorhanden ist). Dafür gibt es einen Mechanismus . Beim Indizieren kann man das Ablaufdatum des HashPackage angeben --expires 2019-06-01, und nach Ablauf dieses Datums (ab 00:00) wird es nicht verwendet. Das Archiv selbst kann nach diesem Datum gelöscht werden (obwohl hashget bequem die URLs aller Backups anzeigen kann, die derzeit abgelaufen sind oder an einem bestimmten Datum ablaufen werden).
Wenn wir beispielsweise am 1. einen vollständigen Backup machen und ihn mit einer Lebensdauer bis zum Ende des Monats indizieren, erhalten wir ein Schema des differenziellen Backups.
Wenn wir auch die neuen Backups indizieren, wird es ein Schema der inkrementellen Backups sein.
Im Gegensatz zu traditionellen Schemas ermöglicht hashget die Verwendung mehrerer Basisquellen. Das Backup wird sowohl durch das Reduzieren von Dateien aus vorherigen Backups (falls vorhanden) als auch durch öffentliche Dateien (was heruntergeladen werden kann) verkürzt.
Wenn wir aus irgendwelchen Gründen den Debian-Ressourcen () nicht vertrauen oder eine andere Distrubution verwenden, können wir einmal ein vollständiges Backup mit allen Paketen erstellen und uns dann darauf stützen (). Nun, falls alle Server unserer Distributionen für uns nicht erreichbar sind (im souvenirhaften Internet oder bei einer Zombie-Apokalypse), aber unsere Backups in Ordnung sind – können wir uns aus jedem kurzen Differenz-Backup, das nur auf unseren früheren Backups basiert, wiederherstellen.
Hashget stützt sich nur auf zuverlässige Wiederherstellungsquellen nach IHREM Ermessen. Was Sie für zuverlässig halten, wird verwendet.
FilePool und Glacier
Mechanismus ermöglicht es, nicht ständig auf externe Server für den Download von Paketen zuzugreifen, 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 ein Pool im lokalen Verzeichnis zu erstellen, genügt es, einfach ein Verzeichnis zu erstellen und einige Dateien hineinzulegen, hashget findet selbst anhand der Hashes, was es braucht. Um den Pool über HTTP verfügbar zu machen, müssen spezielle Symlinks erstellt werden, dies geschieht mit einem einzigen Befehl (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). Der HTTP FilePool besteht aus statischen Dateien, sodass er von jedem einfachen Webserver bedient werden kann, die Serverlast ist fast null.
Dank des FilePools können als Basisressourcen nicht nur Ressourcen über http(s) verwendet werden, sondern auch, , Amazon Glacier.
Nach dem Hochladen des Backups in 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 werden neue (differenzielle) Backups auf diesem Backup basieren und kürzer sein. Nach der Entpackung des diff-Backups können wir sehen, auf welche Ressourcen es sich stützt:
hashget --info /tmp/unpacked/ listund mit einem einfachen Shell-Skript zum Pool alle diese Dateien aus dem Glacier herunterladen und eine reguläre Wiederherstellung starten: hashget -u /tmp/unpacked --pool /tmp/pool
Ist der Aufwand diesen Aufwand wert?
Im einfachsten Fall zahlen Sie einfach weniger für Backups (wenn Sie diese irgendwo in der Cloud kostenpflichtig speichern). Vielleicht sogar viel weniger.
Aber das ist nicht alles. Quantität wandelt sich in Qualität um. Sie können dies nutzen, um ein qualitatives Upgrade für Ihr Backup-Schema zu erhalten. Zum Beispiel, da unsere Backups jetzt kürzer sind, können wir anstelle eines monatlichen Backups ein tägliches Backup erstellen. Diese nicht sechs Monate lang, wie früher, sondern fünf Jahre lang speichern. Früher wurden sie in langsamem, aber billigem „kaltem“ Speicher (Glacier) aufbewahrt, jetzt können Sie sie in warmem Speicher aufbewahren, von dem aus Backups schnell heruntergeladen werden können und die Wiederherstellung in Minuten, nicht in Tagen, erfolgt.
Die Zuverlässigkeit der Speicherung von Backups kann erhöht werden. Wenn wir sie jetzt in einem einzigen Speicher aufbewahren, können wir, indem wir das Volumen der Backups reduzieren, in 2-3 Speichern aufbewahren und problemlos überstehen, wenn einer davon beschädigt wird.
Wie kann man ausprobieren und anfangen, es zu benutzen?
Gehen Sie zur GitLab-Seite , installieren Sie es mit einem einzigen Befehl (pip3 install hashget[plugins]) und einfach das Quickstart lesen und ausführen. Ich denke, es wird etwa 10-15 Minuten dauern, alles Einfache zu erledigen. Danach kann man versuchen, seine virtuellen Maschinen zu komprimieren, Tooltip-Dateien zu erstellen, wenn nötig, um die Kompression zu verstärken, mit Pools, einer lokalen Hash-Datenbank und einem Hash-Server zu experimentieren, falls es interessant wird, und am nächsten Tag zu sehen, wie groß das inkrementelle Backup im Vergleich zu gestern ist.
Quelle: habr.com
