Reduzieren Sie Backups mit Hashget um 99,5%

hashget ist ein kostenloser, opernbasierter Deduplizierer - ein Dienstprogramm ähnlich einem Archivierer, mit dem die Größe von Sicherungen erheblich reduziert sowie inkrementelle und differenzielle Sicherungsschemata und mehr organisiert werden können.


Dies ist ein Übersichtsartikel zur Beschreibung der Funktionen. Die Verwendung von Hashget selbst (recht einfach) wird in der README- und Wiki-Dokumentation des Projekts beschrieben.


Vergleich


Nach dem Gesetz des Genres beginne ich sofort mit Intrigen - vergleiche die Ergebnisse:


Datenprobeausgepackte Größe.tar.gzHashget .tar.gz
Wordpress-5.1.143 Mb11 Mb (26%)155 Kb ( 0,3% )
Linux-Kernel 5.0.4934 Mb161 Mb (20%)4,7 Mb ( 0,5% )
Debian 9 (LAMP) LXC VM724 Mb165 Mb (23%)4,1 Mb ( 0,5% )

Hintergrund, was ein ideales und effektives Backup sein sollte


Jedes Mal, wenn ich ein Backup einer frisch erstellten virtuellen Maschine erstellte, wurde ich von dem Gefühl heimgesucht, dass ich etwas falsch gemacht habe. Warum erhalte ich ein gewichtiges Backup von einem System, in dem meine unbezahlbare Kreativität eine einzeilige index.html mit dem Text "Hallo Welt" ist?


Warum enthält mein Backup 16 Megabyte / usr / sbin / mysqld? Ist es wirklich auf dieser Welt, dass ich die Ehre habe, diese wichtige Datei zu speichern, und wenn ich es nicht kann, wird sie für die Menschheit verloren gehen? Höchstwahrscheinlich nicht. Es wird auf hochzuverlässigen Debian-Servern (deren Zuverlässigkeit und Kontinuität nicht mit dem verglichen werden kann, was ich bereitstellen kann) sowie in Sicherungskopien (Millionen von ihnen) anderer Administratoren gespeichert. Müssen wir wirklich 10.000.000 + 1. Kopie dieser wichtigen Datei erstellen, um die Zuverlässigkeit zu erhöhen?


Im Allgemeinen löst Hashget dieses Problem. Beim Verpacken wird ein sehr kleines Backup erstellt. Beim Auspacken - ein vollständig entpacktes System, ähnlich dem mit tar -c / tar -x . (Mit anderen Worten, dies ist eine verlustfreie Verpackung)


Wie Hashget funktioniert


Hashget hat die Konzepte von Package und HashPackage und führt mit ihrer Hilfe eine Deduplizierung durch.


Paket Eine Datei (normalerweise ein .deb- oder .tar.gz-Archiv), die zuverlässig aus dem Netzwerk heruntergeladen werden kann und aus der eine oder mehrere Dateien abgerufen werden können.


HashPackage ist eine kleine JSON-Datei, die das Paket darstellt, einschließlich der Paket-URL und der Hash-Summe (sha256) der Dateien daraus. Für das Mariadb-Server-Core-Paket mit einer Größe von 5 Megabyte beträgt die Hashpackage-Größe beispielsweise nur 6 Kilobyte. Etwa tausendmal kleiner.


Deduplizierung - Erstellen eines Archivs ohne doppelte Dateien (wenn der Deduplizierer weiß, wo das Originalpaket heruntergeladen werden kann, werden doppelte Kopien aus dem Archiv reduziert).


Verpackung


Beim Packen werden alle Dateien aus dem gepackten Verzeichnis angezeigt, ihre Hash-Summen werden berücksichtigt, und wenn die Summe in einem der bekannten HashPackage gefunden wird, werden die Dateimetadaten (Name, Hash, Berechtigungen usw.) in einer speziellen Datei .hashget-restore.json gespeichert wird auch in das Archiv aufgenommen.


Die Verpackung selbst sieht im einfachsten Fall nicht komplizierter aus als Teer:


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

Auspacken


Das Auspacken erfolgt in zwei Schritten. Zunächst das übliche Auspacken des Teers:


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

dann aus dem Netzwerk wiederherstellen:


 hashget -u /path/to/data 

Bei der Wiederherstellung liest Hashget die Datei .hashget-restore.json, lädt die erforderlichen Pakete herunter, entpackt sie und extrahiert die erforderlichen Dateien, wobei die richtigen Pfade mit den erforderlichen Eigentümern / Gruppen / Berechtigungen festgelegt werden.


Kompliziertere Dinge


Was oben beschrieben wurde, reicht bereits für diejenigen, die "als Teer wollen, aber mein Debian in 4 Megabyte packen". Weiter werden wir uns schwierigere Dinge ansehen.


Indizierung


Wenn ein Hashget überhaupt kein einziges HashPackage hatte, konnte es einfach nichts deduplizieren.


Sie können ein HashPackage auch manuell erstellen (einfach: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my ), aber es gibt einen bequemeren Weg.


Um das benötigte Hashpackage zu erhalten, gibt es einen Indizierungsschritt (der automatisch ausgeführt wird, wenn der Befehl --pack ) und Heuristiken . Bei der Indizierung "füttert" das Hashget jede gefundene Datei mit allen vorhandenen Heuristiken, an denen es interessiert ist. Heuristics kann dann jedes Paket indizieren, um ein HashPackage zu erstellen.


Beispielsweise liebt eine Debian-Heuristik die Datei / var / lib / dpkg / status und erkennt installierte Debian-Pakete. Wenn sie nicht indiziert sind (HashPackage wurde nicht für sie erstellt), werden sie heruntergeladen und indiziert. Das Ergebnis ist ein sehr angenehmer Effekt - Hashget dedupliziert Debian-Betriebssysteme immer effektiv, selbst wenn sie die neuesten Pakete haben.


Hinweisdateien


Wenn Ihr Netzwerk eine Art proprietäres Paket oder ein öffentliches Paket verwendet, das nicht in der Hashget-Heuristik enthalten ist, können Sie eine einfache Hash-Hinweis.json-Hinweisdatei wie folgt hinzufügen:


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

Außerdem wird jedes Mal, wenn das Archiv erstellt wird, das Paket indiziert (falls nicht zuvor), und die Paketdateien werden aus dem Archiv dedupliziert. Es ist keine Programmierung erforderlich, alles kann von vim aus durchgeführt und in jedem Backup gespeichert werden. Beachten Sie, dass dank des Ansatzes über Hashes, wenn einige Dateien aus dem Paket lokal geändert werden (z. B. die Konfigurationsdatei geändert wird), die geänderten Dateien "wie sie sind" im Archiv gespeichert und nicht reduziert werden.


Wenn einige Ihrer eigenen Pakete regelmäßig aktualisiert werden, die Änderungen jedoch nicht sehr umfangreich sind, können Sie nur auf Hauptversionen hinweisen. In Version 1.0 haben sie beispielsweise einen Hinweis auf mypackage-1.0.tar.gz erstellt, der vollständig dedupliziert wird. Anschließend haben sie Version 1.1 veröffentlicht, die sich geringfügig unterscheidet, aber der Hinweis wurde nicht aktualisiert. Nichts Schlimmes. Es werden nur Dateien dedupliziert, die mit Version 1.0 übereinstimmen (die wiederhergestellt werden können).


Eine Heuristik, die eine Hinweisdatei verarbeitet, ist ein gutes Beispiel für das Verständnis des internen Mechanismus der Heuristik. Es werden nur hashget-poin.json-Dateien (oder .hashget-poin.json mit einem Punkt) verarbeitet und alle anderen ignoriert. Mithilfe dieser Datei wird festgelegt, welche Paket-URL indiziert werden soll, und das Hashget indiziert sie (falls dies noch nicht geschehen ist).


Hashver


Es wäre ziemlich zeitaufwändig, die Indizierung beim Erstellen von Sicherungen vollständig durchzuführen. Dazu müssen Sie jedes Paket herunterladen, entpacken, indexieren. Daher verwendet Hashget ein Schema mit einem HashServer . Wenn ein Debian-Paket installiert ist und es nicht im lokalen HashPackage gefunden wird, wird zunächst versucht, das HashPackage einfach vom Hash-Server herunterzuladen. Und nur wenn dies nicht funktioniert - Hashget selbst lädt das Paket herunter und hascht es (und lädt es auf den Hashserver hoch, damit der Hashserver es später bereitstellt).


HashServer - ein optionales Element des Schemas, das nicht kritisch ist, wird ausschließlich zum Beschleunigen und Reduzieren der Belastung der Repositorys verwendet. Es kann leicht getrennt werden (mit der Option --hashserver ohne Parameter). Darüber hinaus können Sie ganz einfach Ihren eigenen Hashserver erstellen .


Inkrementelle und differenzielle Backups, geplante Veralterung


Mit Hashget ist es sehr einfach, inkrementelle und differenzielle Sicherungen durchzuführen . Warum indizieren wir unser Backup nicht selbst (mit all unseren eindeutigen Dateien)? Ein Team - --submit und fertig! Die nächste Sicherung, die das Hashget erstellt, enthält keine Dateien aus diesem Archiv.


Dies ist jedoch kein sehr guter Ansatz, da sich herausstellen kann, dass wir während der Wiederherstellung alle Hashget-Sicherungen für den gesamten Verlauf abreißen müssen (wenn jede mindestens eine eindeutige Datei enthält). Hierfür gibt es einen Mechanismus für die geplante Veralterung von Backups . Bei der Indizierung können Sie das Ablaufdatum von HashPackage --expires 2019-06-01 am --expires 2019-06-01 diesem Datum (ab 00:00 Uhr) wird es nicht verwendet. Das Archiv selbst kann nach diesem Datum nicht mehr gelöscht werden (obwohl Hashget bequem die URLs aller Backups anzeigen kann, die wir momentan oder an einem beliebigen Datum verfault haben).


Wenn Sie beispielsweise am ersten Tag eine vollständige Sicherung erstellen und diese mit einer Lebensdauer vor Monatsende indizieren, erhalten wir ein differenzielles Sicherungsschema.


Wenn wir auch neue Sicherungen indizieren, gibt es ein Schema für inkrementelle Sicherungen.


Im Gegensatz zu herkömmlichen Schemata können Sie mit Hashget mehrere grundlegende Quellen verwenden. Die Sicherung wird aufgrund der Reduzierung von Dateien aus früheren Sicherungen (falls vorhanden) und aufgrund öffentlicher Dateien (was heruntergeladen werden kann) reduziert.


Wenn wir aus irgendeinem Grund der Zuverlässigkeit der Debian-Ressourcen ( https://snapshot.debian.org/ ) nicht vertrauen oder eine andere Distribution verwenden, können wir nur einmal eine vollständige Sicherung mit allen Paketen erstellen und uns dann bereits darauf verlassen ( Deaktivierung der Heuristik) ) Wenn sich herausstellt, dass alle Server unserer Distributionen für uns nicht zugänglich sind (im Souvenir-Internet oder während der Zombie-Apokalypse), unsere Backups jedoch in Ordnung sind, können wir uns von allen kurzen Diff-Backups erholen, die nur auf unseren früheren Backups beruhen.


Hashget stützt sich nach eigenem Ermessen nur auf zuverlässige Wiederherstellungsquellen. Was Sie für zuverlässig halten - diese werden verwendet.

FilePool und Gletscher


Mit dem FilePool- Mechanismus können Sie nicht ständig auf externe Server zugreifen, um Pakete herunterzuladen, sondern Pakete aus einem lokalen Verzeichnis oder einem Unternehmensserver verwenden, z. B.:


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

oder


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

Um einen Pool in einem lokalen Verzeichnis zu erstellen, erstellen Sie einfach ein Verzeichnis und laden Sie Dateien hoch. Hashget selbst findet durch Hashes, was es benötigt. Um den Pool über HTTP zugänglich zu machen, müssen Sie auf besondere Weise Symlinks erstellen. Dies erfolgt mit einem Befehl ( hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool ). HTTP FilePool selbst ist eine statische Datei, sodass jeder einfache Webserver sie bedienen kann. Die Belastung des Servers ist nahezu Null.


Dank FilePool können nicht nur http (s) -Ressourcen als Basisressourcen verwendet werden, sondern auch beispielsweise Amazon Glacier.


Nach dem Backup-Upload auf den Gletscher 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-01 

Jetzt werden neue (differenzielle) Sicherungen auf dieser Sicherung basieren und kürzer sein. Nach dem Auspacken des Diffbacks können wir sehen, auf welche Ressourcen es angewiesen ist:


 hashget --info /tmp/unpacked/ list 

Verwenden Sie einfach das Shell-Skript, um alle diese Dateien vom Gletscher in den Pool herunterzuladen und die übliche Wiederherstellung auszuführen: Hashget -u / tmp / unpacked --pool / tmp / pool


Ist das Spiel die Kerze wert?


Im einfachsten Fall zahlen Sie einfach weniger für Backups (wenn Sie sie für Geld irgendwo in der Cloud speichern). Vielleicht - viel, viel weniger.


Dies ist jedoch nicht der einzige. Quantität geht in Qualität. Sie können dies verwenden, um ein qualitativ hochwertiges Upgrade des Sicherungsschemas zu erhalten. Da unsere Sicherungen jetzt kürzer sind, können Sie keine monatliche, sondern eine tägliche Sicherung durchführen. Bewahren Sie sie nicht wie zuvor sechs Monate, sondern fünf Jahre auf. Früher wurden sie in einem langsamen, aber billigen "kalten" Speicher (Glacier) gespeichert. Jetzt können Sie sie in einem heißen Speicher speichern, von wo aus Sie immer schnell ein Backup herunterladen und in Minuten und nicht in einem Tag wiederherstellen können.


Sie können die Zuverlässigkeit des Sicherungsspeichers erhöhen. Wenn wir sie jetzt in einem Geschäft speichern, können wir durch Reduzieren des Sicherungsvolumens in 2-3 Geschäften speichern und sicher überleben, wenn eines von ihnen beschädigt wird.


Wie versuche ich mit der Verwendung?


Wir gehen zur gitlab-Seite https://gitlab.com/yaroslaff/hashget , installieren sie mit einem Befehl ( pip3 install hashget[plugins] ) und lesen einfach den Schnellstart und führen ihn aus. Ich denke all die einfachen Dinge zu tun - es wird 10-15 Minuten dauern. Dann können Sie versuchen, Ihre virtuellen Maschinen zu schütteln, bei Bedarf Hinweisdateien zu erstellen, härter zu quetschen, mit Pools, einer lokalen Hash-Datenbank und einem Hash-Server zu spielen, wenn es interessant ist, und am nächsten Tag sehen, wie groß die inkrementelle Sicherung gestern sein wird.


Restic + HashGet


(Dieses Kapitel wurde später hinzugefügt. Vielen Dank an die Kommentatoren für ihre Kritik und Motivation.)


Es gibt ein gutes praktisches Tool für Backups - Restic . Es kann auch eine Deduplizierung durchführen, jedoch nur innerhalb des Repositorys, keine externe Deduplizierung, was mit dem Hashget problemlos möglich ist . In Kombination mit Restic + Hashget schaffen wir es jedoch, die Vorteile beider Ansätze zu nutzen!


Vorbereitung (WordPress auspacken und indizieren):


 # wget -q https://wordpress.org/wordpress-5.2.2.tar.gz # hashget --submit https://wordpress.org/wordpress-5.2.2.tar.gz -p my --file wordpress-5.2.2.tar.gz --hashserver # tar -xf wordpress-5.2.2.tar.gz # du -sh wordpress 46M wordpress 

Hinzufügen eines Schnappschusses zum Restic via


 # hashget -X exclude-list --prepack wordpress --hashserver Saved: 1468 files, 1 pkgs, size: 40.5M. Download: 10.7M # restic --exclude-file exclude-list backup wordpress password is correct scan [/tmp/wp/wordpress] scanned 193 directories, 367 files in 0:02 [0:04] 100.00% 700.829 KiB / 700.829 KiB 560 / 560 items 0 errors ETA 0:00 duration: 0:04 snapshot 76b54230 saved # du -sh /tmp/restic-repo/ 2,1M /tmp/restic-repo/ 

Zu diesem Zeitpunkt haben wir einen Katalog-Snapshot (über 40 MB) hinzugefügt und die Repository-Größe um nur 1 MB erhöht.


Die Wiederherstellung erfolgt mit zwei Befehlen:


 # restic restore 76b54230 -t unpacked password is correct restoring <Snapshot 76b54230 of [/tmp/wp/wordpress] at 2019-06-19 04:30:55.760618336 +0700 +07 by root@braconnier> to unpacked # hashget -u unpacked/wordpress/ --hashserver Recovered 1468/1468 files 40.5M bytes (0 downloaded, 0 from pool, 10.7M cached) in 1.56s 

Source: https://habr.com/ru/post/de454826/


All Articles