ā is een gratis, open-source deduplicator ā een utility die vergelijkbaar is met een archiver, die de omvang van back-ups aanzienlijk kan verkleinen en ook mogelijkheden voor incrementele en differentiĆ«le back-upschema's biedt, en meer.
Dit is een overzichtelijk artikel om de mogelijkheden te beschrijven. Het gebruik van hashget (vrij eenvoudig) wordt beschreven in project en .
Vergelijking
Bij genereel gebruik, begin ik direct met de intrige ā het vergelijken van resultaten:
Data sample
uitgepakt formaat
.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% )
Achtergrond, hoe een ideale en effectieve back-up eruit zou moeten zien
Telkens wanneer ik een back-up maakte van een net gecreĆ«erde virtuele machine, had ik het gevoel dat ik iets niet goed deed. Waarom krijg ik een omvangrijke back-up van een systeem, waar mijn onschatbare, onsterfelijke creatie ā een enkele index.html met de tekst 'Hello world' ā is?
Waarom zit er een 16-megabyte /usr/sbin/mysqld in mijn back-up? Is het werkelijk mijn lot om dit belangrijke bestand te bewaren, en als ik het niet goed doe, zal het voor de mensheid verloren gaan? Waarschijnlijk niet. Het wordt bewaard op betrouwbare Debian-servers (de betrouwbaarheid en continuĆÆteit daarvan zijn niet te vergelijken met wat ik kan bieden), en ook in back-ups (miljoenen daarvan) van andere beheerders. Hebben we echt behoefte aan een extra kopie van dit belangrijke bestand voor meer betrouwbaarheid?
Over het algemeen lost dit probleem op. Tijdens het verpakken ā maakt het een zeer kleine back-up. Tijdens het uitpakken ā een volledig uitgepakt systeem, vergelijkbaar met wat er zou zijn bij tar -c / tar -x. (Met andere woorden, dit is lossless verpakking)
Hoe hashget werkt
In hashget zijn er concepten zoals Package en HashPackage, waarmee het deduplicatie uitvoert.
Package (pakket). Een bestand (meestal een .deb of .tar.gz archive) dat betrouwbaar van het internet kan worden gedownload, en waaruit ƩƩn of meer bestanden kunnen worden verkregen.
HashPackage ā een klein JSON-bestand dat een Package vertegenwoordigt, inclusief de URL van het pakket en hashwaarden (sha256) van de bestanden daarin. Bijvoorbeeld, voor het pakket mariadb-server-core dat 5 megabyte groot is, is de grootte van de hashpackage slechts 6 kilobyte. Ongeveer duizend keer kleiner.
Deduplicatie ā het maken van een archief zonder gedupliceerde bestanden (als de deduplicator weet waar het origineel pakket gedownload kan worden, verwijdert het duplicaten uit het archief).
Verpakking
Tijdens het inpakken worden alle bestanden in de in te pakken map bekeken, worden hun hash-sommen berekend, en als de som in een van de bekende HashPackages wordt gevonden, worden de metadata over het bestand (naam, hash, toegangsrechten, etc.) opgeslagen in een speciaal bestand .hashget-restore.json, dat ook in het archief zal worden opgenomen.
Het inpakken zelf ziet er in de eenvoudigste vorm niet ingewikkelder uit dan tar:
hashget -zf /tmp/mybackup.tar.gz --pack /path/to/dataUitpakken
Uitpakken gebeurt in twee fasen. Eerst de gewone tar-uitpakfase:
tar -xf mybackup.tar.gz -C /path/to/datavervolgens herstel vanuit het netwerk:
hashget -u /path/to/dataBij herstel leest hashget het bestand .hashget-restore.json, downloadt de benodigde pakketten, pakt ze uit en haalt de benodigde bestanden eruit, waarbij ze op de juiste paden worden geplaatst, met de juiste eigenaar/groep/machtigingen.
Meer geavanceerde zaken
Wat hierboven is beschreven, is al voldoende voor degenen die zeggen: 'ik wil het zoals tar, maar om mijn Debian in 4 megabyte in te pakken'. Laten we verder naar meer geavanceerde zaken kijken.
Indexering
Als hashget helemaal geen HashPackage had, zou het gewoon niets kunnen dedupliceren.
Een HashPackage kan ook handmatig worden aangemaakt (eenvoudig: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my), maar er is een eenvoudigere manier.
Om de benodigde hashpackages te verkrijgen, is er een fase van indexering (deze wordt automatisch uitgevoerd bij het commando --pack) en heuristieken. Tijdens de indexering 'voert' hashget elk gevonden bestand aan alle beschikbare heuristieken die voor hem interessant zijn. De heuristieken kunnen vervolgens een Package indexeren om een HashPackage te creƫren.
Bijvoorbeeld, de Debian-heuristiek houdt van het bestand /var/lib/dpkg/status en detecteert de geĆÆnstalleerde Debian-pakketten; als ze niet zijn geĆÆndexeerd (er zijn geen HashPackages voor gemaakt), downloadt en indexeert het ze. Dit resulteert in een zeer prettig effect ā hashget zal altijd effectief dedupliceren in Debian-systemen, zelfs als ze de nieuwste pakketten hebben.
Hints-bestanden
Als er in uw netwerk een eigen propriƫtaire package of een openbaar pakket wordt gebruikt dat niet in de hashget-heuristieken is opgenomen, kunt u het eenvoudig toevoegen met een hints-bestand hashget-hint.json op basis van het volgende voorbeeld:
{
"project": "wordpress.org",
"url": "https://ru.wordpress.org/wordpress-5.1.1-ru_RU.zip"
}Elke keer dat er een archief wordt aangemaakt, zal het pakket worden geĆÆndexeerd (indien dit nog niet is gebeurd), en de bestanden van het pakket worden gededupliceerd vanuit het archief. Er is geen programmeren nodig; alles kan vanuit vim worden gedaan en bespaart ruimte in iedere back-up. Let op, dankzij de benadering via checksums, als enkele bestanden van het pakket lokaal zijn gewijzigd (bijvoorbeeld het configuratiebestand is aangepast), dan blijven de gewijzigde bestanden in het archief "zoals ze zijn" en worden ze niet verkort.
Als een van uw eigen pakketten regelmatig wordt bijgewerkt, maar de wijzigingen niet erg groot zijn, kan er alleen een hint worden gegeven voor de belangrijkste versies. Bijvoorbeeld, in versie 1.0 werd er een hint gemaakt naar mypackage-1.0.tar.gz, en deze zal volledig gededupliceerd worden, en dan is versie 1.1 uitgebracht, die iets anders is, maar de hint is niet bijgewerkt. Geen probleem. Alleen de bestanden die overeenkomen (en hersteld kunnen worden) met versie 1.0 worden gededupliceerd.
De heuristiek die het hint-bestand verwerkt ā is een goed voorbeeld om het interne mechanisme van heuristieken te begrijpen. Het verwerkt alleen bestanden hashget-hint.json (of .hashget-hint.json met een punt) en negeert alle andere. Aan de hand van dit bestand bepaalt het welke URL van het pakket geĆÆndexeerd moet worden, en hashget indexeert het (als dit nog niet eerder is gedaan).
HashServer
Het zou behoorlijk arbeidsintensief zijn om bij het maken van back-ups volledig te indexeren. Hiervoor moet elk pakket worden gedownload, uitgepakt en geĆÆndexeerd. Daarom gebruikt hashget een schema met . Bij de ontdekking van een geĆÆnstalleerd debian-pakket, als het niet in de lokale HashPackage te vinden is, wordt er eerst geprobeerd om simpelweg HashPackage van de hashserver te downloaden. En alleen als dit niet lukt, downloadt en hashget zelf het pakket (en uploadt het naar hashserver, zodat hashserver het later kan aanbieden).
HashServer is geen verplicht onderdeel van het schema, niet kritiek, en dient uitsluitend ter versnelling en vermindering van de belasting op de repositories. Het kan eenvoudig worden uitgeschakeld (met de optie --hashserver zonder parameters). Bovendien kan men eenvoudig .
Incrementele en differentiƫle back-ups, geplande veroudering
maakt het heel eenvoudig om een schema te maken voor . Waarom zouden we niet gewoon onze eigen back-up indexeren (met al onze unieke bestanden)? EƩn commando --submit en alles is klaar! De volgende backup die hashget aanmaakt, zal geen bestanden uit dit archief bevatten.
Maar dit is niet erg goed, omdat het kan gebeuren dat we bij het herstellen alle hashget-backups uit de hele geschiedenis moeten doorlopen (als er in elk ten minste ƩƩn uniek bestand zit). Hiervoor is er een mechanisme . Bij het indexeren kan een verouderingsdatum voor HashPackage worden opgegeven --expires 2019-06-01, en na deze datum (vanaf 00:00) zal het niet meer worden gebruikt. Het archief zelf kan na deze datum worden bewaard (hoewel hashget handig kan laten zien welke backups voor ons zijn verlopen/gaan verlopen op dit moment of op een andere datum).
Bijvoorbeeld, als we op de 1e dag een volledige backup maken en deze indexeren met een levensduur tot het einde van de maand ā dan verkrijgen we een schema van differentiĆ«le backups.
Als we ook nieuwe backups op dezelfde manier indexeren, krijgen we een schema van incrementele backups.
In tegenstelling tot traditionele schema's, maakt hashget het mogelijk om meerdere basisbronnen te gebruiken. De backup zal worden verkleind door het weglaten van bestanden uit eerdere backups (indien deze beschikbaar zijn) en door openbare bestanden (wat gedownload kan worden).
Als we om een of andere reden de betrouwbaarheid van Debian-bronnen niet vertrouwen () of een andere distributie gebruiken, kunnen we eenvoudig ƩƩn keer een volledige backup maken van alle pakketten en vervolgens daarop vertrouwen (). Nu, als alle servers van onze distributies niet meer toegankelijk voor ons zijn (in het souvenir-internet of tijdens de zombie-apocalyps), maar onze backups in orde zijn ā kunnen we herstellen vanuit elke korte diff-backup, die alleen op onze eerdere backups steunt.
Hashget vertrouwt uitsluitend op betrouwbare herstelbronnen naar uw keuze. Wat u betrouwbaar vindt, zal ook worden gebruikt.
FilePool en Glacier
Mechanisme maakt het mogelijk om niet voortdurend externe servers aan te roepen voor het downloaden van pakketten, maar om pakketten uit een lokale catalogus of een bedrijfsserver te gebruiken, bijvoorbeeld:
$ hashget -u . --pool /tmp/poolof
$ hashget -u . --pool http://myhashdb.example.com/Om een pool in een lokale map te maken, is het voldoende om gewoon een map te creƫren en daar bestanden in te plaatsen; hashget vindt zelf wat het nodig heeft aan de hand van de hashes. Om de pool toegankelijk te maken via HTTP, moeten er speciaal symlinks worden gemaakt, dit gebeurt met ƩƩn commando (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). De HTTP FilePool bestaat uit statische bestanden, dus elk eenvoudige webserver kan deze bedienen, met bijna geen belasting voor de server.
Dankzij FilePool kunnen niet alleen HTTP(S)-bronnen als basisbronnen worden gebruikt, maar ook, , Amazon Glacier.
Na het uploaden van de backup naar Glacier ontvangen we de Upload ID en gebruiken deze als URL. Bijvoorbeeld:
hashget --submit Glacier_Upload_ID --file /tmp/my-glacier-backup.tar.gz --project glacier --hashserver --expires 2019-09-01Nu zullen nieuwe (differentiƫle) backups gebaseerd zijn op deze backup en zullen korter zijn. Na het uitpakken van de diff-backup kunnen we zien op welke bronnen deze is gebaseerd:
hashget --info /tmp/unpacked/ listen met een simpele shell-script kunnen we al deze bestanden uit Glacier naar de pool downloaden en het normale herstel uitvoeren: hashget -u /tmp/unpacked --pool /tmp/pool
Is het de moeite waard?
In het eenvoudigste geval betaalt u gewoon minder voor backups (als u deze ergens in de cloud opslaat en betaalt). Misschien wel veel minder.
Maar dat is niet alles. Hoeveelheid verandert in kwaliteit. U kunt dit gebruiken om een kwaliteitsupgrade van uw backup-schema te krijgen. Bijvoorbeeld, aangezien de backups nu korter zijn, kunt u dagelijkse backups maken in plaats van maandelijkse. Ze niet zes maanden bewaren zoals voorheen, maar vijf jaar. Voorheen werden ze in een langzame maar goedkope 'koude' opslag (Glacier) bewaard, nu kunt u ze in een warme opslag bewaren, waar u de backup snel kunt downloaden en binnen enkele minuten kunt herstellen in plaats van een hele dag.
U kunt de betrouwbaarheid van de backupopslag verhogen. Als we ze nu in ƩƩn opslag bewaren, kunnen we door de hoeveelheid backups te verminderen, in 2-3 opslagplaatsen bewaren en zonder problemen overleven als er ƩƩn beschadigd raakt.
Hoe kun je het uitproberen en beginnen met gebruiken?
Ga naar de GitLab-pagina , installeer met ƩƩn commando (pip3 install hashget[plugins]) en gewoon de quick-start lezen en uitvoeren. Ik denk dat het ongeveer 10-15 minuten zal duren om de eenvoudige dingen te doen. Dan kun je proberen je virtuele machines te comprimeren, hint-bestanden te maken als dat nodig is voor meer compressie, te experimenteren met pools, een lokale hash-database en een hashserver als je dat interessant vindt, en de volgende dag kijken wat de grootte van de incrementele backup over die van gisteren is.
Bron: habr.com
