Reduzieren Sie Backups mit Hashget um 99.5 %

Hashget - Es ist kostenlos und Open Source Deduplizierer ist ein einem Archivierungsprogramm ähnliches Dienstprogramm, mit dem Sie die Größe von Backups erheblich reduzieren sowie inkrementelle und differenzielle Backup-Schemata organisieren und vieles mehr können.

Dies ist ein Übersichtsartikel zur Beschreibung der Funktionen. Die tatsächliche Verwendung von Hashget (ganz einfach) wird in beschrieben README Projekt und Wiki-Dokumentation.

Vergleich

Nach dem Gesetz des Genres beginne ich gleich mit der Intrige und vergleiche die Ergebnisse:

Datenprobe
ausgepackte 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% )

Hintergrundinformationen darüber, was ein ideales und effektives Backup sein sollte

Jedes Mal, wenn ich ein Backup einer frisch erstellten virtuellen Maschine erstellte, verfolgte mich das Gefühl, etwas falsch zu machen. Warum erhalte ich ein umfangreiches Backup vom System, wo meine unbezahlbare, unvergängliche Kreativität eine einzeilige index.html mit dem Text „Hallo Welt“ ist?

Warum befinden sich in meinem Backup 16 MB /usr/sbin/mysqld? Ist es wirklich möglich, dass ich in dieser Welt die Ehre habe, diese wichtige Akte zu führen, und wenn ich versage, geht sie für die Menschheit verloren? Höchstwahrscheinlich nein. Es wird auf äußerst zuverlässigen Debian-Servern (deren Zuverlässigkeit und Betriebszeit nicht mit dem verglichen werden kann, was ich bieten kann) sowie in Backups (Millionen davon) anderer Administratoren gespeichert. Müssen wir wirklich mehr als 10 erste Kopien dieser wichtigen Datei erstellen, um die Zuverlässigkeit zu verbessern?

Allgemein Hashget und löst dieses Problem. Beim Packen wird ein sehr kleines Backup erstellt. Beim Auspacken - ein komplett ausgepacktes System, ähnlich wie es wäre, wenn tar -c / tar -x. (Mit anderen Worten, dies ist eine verlustfreie Verpackung)

Wie Hashget funktioniert

hashget verfügt über die Konzepte Package und HashPackage und führt mit ihrer Hilfe die Deduplizierung durch.

Paket (Plastiktüte). Eine Datei (normalerweise ein .deb- oder .tar.gz-Archiv), die sicher aus dem Internet heruntergeladen werden kann und von der eine oder mehrere Dateien abgerufen werden können.

HashPackage – eine kleine JSON-Datei, die ein Paket darstellt, einschließlich der Paket-URL und Hash-Summen (sha256) der Dateien daraus. Beispielsweise beträgt die Hashpaketgröße für ein 5-Megabyte-Paket „mariadb-server-core“ nur 6 Kilobyte. Ungefähr tausendmal weniger.

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

Verpackung

Beim Packen werden alle Dateien aus dem zu packenden Verzeichnis gescannt, ihre Hash-Summen berechnet und wenn die Summe in einem der bekannten HashPackages gefunden wird, werden Metadaten über die Datei (Name, Hash, Zugriffsrechte usw.) gespeichert in einer speziellen Datei .hashget-restore.json, die ebenfalls in das Archiv aufgenommen wird.

Im einfachsten Fall sieht die Verpackung selbst nicht komplizierter aus als Teer:

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

Auspacken

Das Auspacken erfolgt in zwei Schritten. Zuerst das übliche Teer-Auspacken:

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

dann aus dem Netzwerk wiederherstellen:

hashget -u /path/to/data

Beim Wiederherstellen liest Hashget die Datei .hashget-restore.json, lädt die erforderlichen Pakete herunter, entpackt sie, extrahiert die erforderlichen Dateien und installiert sie in den erforderlichen Pfaden mit den erforderlichen Eigentümern/Gruppen/Berechtigungen.

Schwierigere Dinge

Was oben beschrieben wird, reicht bereits für diejenigen aus, die „es wie Tar wollen, aber mein Debian in 4 Megabyte packen“. Schauen wir uns später komplexere Dinge an.

Indizierung

Wenn hashget überhaupt kein einziges HashPackage hätte, wäre es einfach nicht in der Lage, irgendetwas zu 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 notwendige Hashpaket zu erhalten, gibt es eine Stufe Indizierung (Es wird automatisch mit dem Befehl ausgeführt --pack) Und Heuristiken. Bei der Indizierung „füttert“ Hashget jede gefundene Datei an alle verfügbaren Heuristiken, die daran interessiert sind. Heuristiken können dann jedes Paket indizieren, um ein HashPackage zu erstellen.

Beispielsweise liebt die Debian-Heuristik die Datei /var/lib/dpkg/status und erkennt installierte Debian-Pakete. Wenn sie nicht indiziert sind (es wurde kein HashPackage für sie erstellt), lädt sie sie herunter und indiziert sie. Das Ergebnis ist ein sehr schöner Effekt – Hashget dedupliziert Debian-Betriebssysteme immer effektiv, selbst wenn sie über die neuesten Pakete verfügen.

Hinweisdateien

Wenn Ihr Netzwerk einige Ihrer proprietären Pakete oder ein öffentliches Paket verwendet, das nicht in der Hashget-Heuristik enthalten ist, können Sie wie folgt eine einfache Hinweisdatei hashget-hint.json hinzufügen:

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

Als nächstes wird jedes Mal, wenn ein Archiv erstellt wird, das Paket indiziert (sofern dies noch nicht geschehen ist) und die Paketdateien werden aus dem Archiv dedupliziert. Es ist keine Programmierung erforderlich, alles kann von vim aus erledigt und in jedem Backup gespeichert werden. Bitte beachten Sie, dass dank des Hash-Summen-Ansatzes, wenn einige Dateien aus dem Paket lokal geändert werden (z. B. eine Konfigurationsdatei geändert wird), die geänderten Dateien „wie sie sind“ im Archiv gespeichert und nicht abgeschnitten werden.

Wenn einige Ihrer eigenen Pakete regelmäßig aktualisiert werden, die Änderungen jedoch nicht sehr groß sind, können Sie nur auf Hauptversionen hinweisen. In Version 1.0 haben sie beispielsweise einen Hinweis gemacht, der auf mypackage-1.0.tar.gz verweist, und dieser wird vollständig dedupliziert. Dann haben sie Version 1.1 veröffentlicht, die etwas anders ist, aber der Hinweis wurde nicht aktualisiert. Macht nichts. Nur Dateien, die mit Version 1.0 übereinstimmen (wiederhergestellt werden können), werden dedupliziert.

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

HashServer

Es wäre ziemlich arbeitsintensiv, beim Erstellen von Backups eine vollständige Indizierung durchzuführen. Dazu müssen Sie jedes Paket herunterladen, entpacken und indizieren. Daher verwendet Hashget ein Schema mit HashServer. Wenn ein installiertes Debian-Paket erkannt wird 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, lädt Hashget selbst das Paket herunter, hasht es (und lädt es auf Hashserver hoch, damit Hashserver es in Zukunft bereitstellt).

HashServer ist ein optionales Element des Schemas, nicht kritisch, es dient ausschließlich der Beschleunigung und Reduzierung der Belastung der Repositorys. Leicht deaktiviert (optional). --hashserver ohne Parameter). Darüber hinaus können Sie problemlos Erstellen Sie Ihren eigenen Hashserver.

Inkrementelle und differenzielle Backups, geplante Obsoleszenz

Hashget macht es sehr einfach, ein Diagramm zu erstellen inkrementelle und differenzielle Backups. Warum indizieren wir nicht unser Backup selbst (mit all unseren einzigartigen Dateien)? Eine Mannschaft --submit und du bist fertig! Das nächste Backup, das Hashget erstellt, enthält keine Dateien aus diesem Archiv.

Dies ist jedoch kein sehr guter Ansatz, da sich herausstellen kann, dass wir beim Wiederherstellen alle Hashget-Backups im gesamten Verlauf abrufen müssen (sofern jede mindestens eine eindeutige Datei enthält). Dafür gibt es einen Mechanismus geplante Veralterung von Backups. Bei der Indizierung können Sie das Ablaufdatum von HashPackage angeben --expires 2019-06-01, und nach diesem Datum (ab 00:00 Uhr) wird es nicht mehr verwendet. Das Archiv selbst kann nach diesem Datum nicht mehr gelöscht werden (obwohl Hashget bequem die URLs aller Backups anzeigen kann, die derzeit oder an einem beliebigen Datum fehlerhaft sind/werden).

Wenn wir beispielsweise am 1. ein vollständiges Backup erstellen und es mit einer Lebensdauer bis zum Monatsende indizieren, erhalten wir ein differenzielles Backup-Schema.

Wenn wir neue Backups auf die gleiche Weise indizieren, entsteht ein Schema inkrementeller Backups.

Im Gegensatz zu herkömmlichen Schemata können Sie mit Hashget mehrere zugrunde liegende Quellen verwenden. Die Sicherung wird sowohl durch die Reduzierung von Dateien aus früheren Sicherungen (falls vorhanden) als auch durch öffentliche Dateien (was heruntergeladen werden kann) reduziert.

Wenn wir aus irgendeinem Grund der Zuverlässigkeit der Debian-Ressourcen nicht vertrauen (https://snapshot.debian.org/) oder eine andere Distribution verwendet, können wir einfach einmal ein vollständiges Backup mit allen Paketen erstellen und uns dann darauf verlassen (durch Deaktivierung der Heuristik). Wenn sich nun herausstellt, dass alle Server unserer Distributionen für uns nicht verfügbar sind (im Souvenir-Internet oder während einer Zombie-Apokalypse), unsere Backups aber in Ordnung sind, können wir von jedem kurzen Diff-Backup wiederherstellen, das nur auf unseren früheren Backups basiert .

Hashget verlässt sich nach IHREM Ermessen nur auf vertrauenswürdige Wiederherstellungsquellen. Es werden diejenigen verwendet, die Sie für zuverlässig halten.

FilePool und Glacier

Mechanismus FilePool ermöglicht es Ihnen, nicht ständig externe Server zu kontaktieren, um Pakete herunterzuladen, sondern Pakete aus einem lokalen Verzeichnis oder einem Unternehmensserver zu verwenden, zum Beispiel:

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

oder

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

Um einen Pool in einem lokalen Verzeichnis zu erstellen, müssen Sie lediglich ein Verzeichnis erstellen und Dateien hineinwerfen. Hashget selbst findet mithilfe der Hashes, was es benötigt. Um den Pool über HTTP zugänglich zu machen, müssen Sie auf besondere Weise Symlinks erstellen; dies geschieht mit einem Befehl (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). HTTP FilePool selbst besteht aus statischen Dateien, sodass jeder einfache Webserver sie bereitstellen kann und die Belastung des Servers nahezu Null ist.

Dank FilePool können Sie nicht nur http(s)-Ressourcen als Basisressourcen nutzen, sondern auch z.B,Amazonas-Gletscher.

Nachdem wir das Backup auf den Gletscher hochgeladen haben, erhalten wir seine 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 basieren neue (differenzielle) Backups auf diesem Backup und sind kürzer. Nachdem tar das Diffbackup entpackt hat, können wir sehen, auf welche Ressourcen es angewiesen ist:

hashget --info /tmp/unpacked/ list

und verwenden Sie einfach ein Shell-Skript, um alle diese Dateien von Glacier 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 diese gegen Geld irgendwo in der Cloud speichern). Vielleicht viel, viel weniger.

Aber das ist nicht das Einzige. Aus Quantität wird Qualität. Damit können Sie ein hochwertiges Upgrade Ihres Backup-Schemas erhalten. Da unsere Backups jetzt beispielsweise kürzer sind, können wir nicht mehr monatlich, sondern täglich Backups erstellen. Lagern Sie sie nicht wie bisher sechs Monate, sondern fünf Jahre. Früher haben Sie es im langsamen, aber günstigen „kalten“ Speicher (Glacier) gespeichert, jetzt können Sie es im Hot-Speicher speichern, von wo aus Sie jederzeit schnell ein Backup herunterladen und es innerhalb von Minuten und nicht an einem Tag wiederherstellen können.

Sie können die Zuverlässigkeit des Backup-Speichers erhöhen. Wenn wir sie derzeit in einer Speichereinrichtung speichern, können wir sie durch die Reduzierung des Backup-Volumens in 2-3 Speichereinrichtungen speichern und schmerzlos überleben, wenn einer von ihnen beschädigt wird.

Wie kann man es ausprobieren und mit der Anwendung beginnen?

Gehen Sie zur Gitlab-Seite https://gitlab.com/yaroslaff/hashget, mit einem Befehl installieren (pip3 install hashget[plugins]) und lesen Sie einfach den Schnellstart und führen Sie ihn aus. Ich denke, dass es 10-15 Minuten dauern wird, alle einfachen Dinge zu erledigen. Dann können Sie versuchen, Ihre virtuellen Maschinen zu komprimieren, bei Bedarf Hinweisdateien zu erstellen, um die Komprimierung zu verstärken, mit Pools, einer lokalen Hash-Datenbank und einem Hash-Server experimentieren, wenn Sie interessiert sind, und am nächsten Tag sehen, wie groß die inkrementelle Sicherung ist wird über dem von gestern liegen.

Source: habr.com

Kommentar hinzufügen