â 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
