Zkrátit zálohy o 99,5 % s hashget

hashget — je to bezplatný, open-source deduplikátor — nástroj podobný archivátoru, který umožňuje výrazně zmenšit velikost záloh a také organizovat schémata inkrementálních a diferencovaných záloh a nejen to.

Toto je přehledný článek k popisu možností. Samotné používání hashget (docela jednoduché) je popsáno v README projektu a wiki dokumentaci.

Porovnání

Podle zákona žánru začnu hned s intrikou — srovnáním výsledků:

Vzorek dat
rozbalená velikost
.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% )

Pozadí, jaký by měl být ideální a efektivní backup

Každýkrát, když jsem dělal zálohu čerstvě vytvořené virtuální mašiny, mě nepřestávalo trápit, že dělám něco špatně. Proč mám tak těžkou zálohu systému, kde moje cenné neměnné dílo — jednolinkový index.html s textem „Hello world“?

Proč je v mé záloze 16-megabajtový /usr/sbin/mysqld? Opravdu mi v tomto světě připadla čest uchovávat tento důležitý soubor, a pokud se mi to nepovede — bude ztracen pro lidstvo? Spíše ne. Je uchováván na vysoce spolehlivých serverech debian (spolehlivost a bezvýpadkovost, kterou nemohu zajistit já) a také v zálohách (milionech jich) od jiných administrátorů. Opravdu potřebujeme vytvořit pro zvýšení spolehlivosti 10 000 000 + 1. kopii tohoto důležitého souboru?

V podstatě hashget a řeší tento problém. Při balení — vytváří velmi malou zálohu. Při rozbalování — kompletně rozbalený systém, podobný tomu, který by byl při tar -c / tar -x. (Jinými slovy, to je bezztrátové balení)

Jak funguje hashget

V hashget existují pojmy Package a HashPackage, s jejichž pomocí provádí deduplikaci.

Package (balíček). Soubor (obvykle archiv .deb nebo .tar.gz), který lze bezpečně stáhnout z internetu, a ze kterého lze získat jeden nebo více souborů.

HashPackage — malý JSON soubor, představující Package, který obsahuje URL balíčku a hash hodnoty (sha256) souborů v něm. Například pro balíček mariadb-server-core o velikosti 5 megabajtů, velikost hashpackage je pouze 6 kilobajtů. Přibližně tisíckrát méně.

Deduplikace — vytvoření archivu bez duplikovaných souborů (pokud deduplikátor ví, odkud lze stáhnout originální balíček, zmenšuje duplicity v archivu).

Balení

Při balení se prohlížejí všechny soubory ze sbaleného adresáře, počítají se jejich hash součty, a pokud je součet nalezen v jednom z známých HashPackage, metadata o souboru (název, hash, oprávnění atd.) se ukládají do speciálního souboru .hashget-restore.json, který bude také zahrnut do archivu.

Samotné balení v nejjednodušším případě vypadá stejně jako tar:

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

Rozbalení

Rozbalení probíhá ve dvou krocích. Nejprve se provede běžné rozbalení tar:

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

poté obnovování ze sítě:

hashget -u /path/to/data

Při obnovování hashget čte soubor .hashget-restore.json, stahuje potřebné balíčky, rozbalí je a extrahuje potřebné soubory, přičemž je umisťuje na správné cesty se správnými majiteli/skupinami/oprávněními.

Složitější věci

To, co bylo popsáno výše, je již dostatečné pro ty, kteří si přejí 'chci jako tar, ale aby to zabalilo můj Debian do 4 megabajtů'. Dále se podíváme na složitější věci.

Indexování

Pokud by hashget neměl ani jeden HashPackage, nemohl by nic deduplikovat.

HashPackage lze také vytvořit ručně (jednoduše: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my), ale existuje pohodlnější cesta.

Abychom získali potřebné hashpackage, existuje etapa indexování (ta se automaticky provádí při příkazu --pack) a heuristiky. Při indexování hashget "krmí" každý nalezený soubor všemi dostupnými heuristikami, kterými je zajímavý. Heuristiky pak mohou indexovat jakýkoli balíček, aby vytvořily HashPackage.

Například debiánská heuristika má ráda soubor /var/lib/dpkg/status a objevuje nainstalované debian balíčky, a pokud nejsou indexovány (pro ně nebyly vytvořeny HashPackage), stáhne je a indexuje. Výsledkem je velmi příjemný efekt — hashget vždy efektivně deduplikuje debianské OS, i když na nich jsou nejnovější balíčky.

Soubory-nápovědy (hinty)

Pokud ve vaší síti používáte nějaký váš proprietární balíček nebo veřejný balíček, který není zahrnut v heuristikách hashget, můžete do něj přidat jednoduchý hint-soubor hashget-hint.json podle vzoru:

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

Poté, pokaždé, když vytvoříte archiv, bude balíček indexován (pokud již nebyl), a soubory balíčku budou deduplikovány z archivu. Není potřeba žádné programování, vše lze udělat z vim a ušetřit tak při každé záloze. Všimněte si, že díky přístupu přes hash součty, pokud se některé soubory z balíčku změní lokálně (například byl změněn konfigurační soubor) — změněné soubory budou v archivu uloženy „tak, jak jsou“, nebudou zkráceny.

Pokud se váš vlastní balíček periodicky aktualizuje, ale změny nejsou příliš velké, lze provádět hint pouze pro hlavní verze. Například v verzi 1.0 byl vytvořen hint s odkazem na mypackage-1.0.tar.gz, a ten bude úplně deduplikován, poté byla vydána verze 1.1, která se mírně liší, ale hint nebyl aktualizován. Nic hrozného. Deduplikovány jsou pouze soubory, které se shodují (které lze obnovit) s verzí 1.0.

Heuristika, která zpracovává hint soubor — je dobrým příkladem pro pochopení vnitřního mechanismu fungování heuristik. Zpracovává pouze soubory hashget-hint.json (nebo .hashget-hint.json s tečkou) a ignoruje všechny ostatní. Podle tohoto souboru určuje, který URL balíček by měl být indexován, a hashget ho indexuje (pokud nebyl indexován dříve).

HashServer

Bylo by poměrně pracné při vytváření záloh kompletně vykonávat indexaci. K tomu by bylo třeba stáhnout každý balíček, rozbalit ho a indexovat. Proto hashget používá schéma s HashServer. Při zjištění nainstalovaného debianovského balíčku, pokud se nenajde v lokálních HashPackage, se nejprve pokusí jednoduše stáhnout HashPackage z hash serveru. A teprve pokud to nevyjde — hashget sám stáhne a hashne balíček (a nahraje na hashserver, aby ho v budoucnu hashserver mohl poskytovat).

HashServer není povinnou součástí schématu, není kritický, slouží výhradně k urychlení a snížení zátěže na repozitáře. Snadno se vypíná (volbou --hashserver bez parametrů). Kromě toho je také snadné vytvořit svůj vlastní hashserver.

Inkrementální a diferenciální zálohy, naplánované zastarávání

hashget umožňuje velmi jednoduše vytvořit schéma inkrementálních a diferenciálních záloh. Proč bychom neměli indexovat naši zálohu (se všemi našimi jedinečnými soubory)? Jediný příkaz --submit a je to hotovo! Další zálohu, kterou vytvoří hashget, nebudou zahrnuty soubory z tohoto archivu.

Ale to není příliš dobrý přístup, protože se může stát, že při obnově budeme muset táhnout všechny hashget zálohy z celé historie (pokud v každé bude alespoň jeden unikátní soubor). K tomu existuje mechanismus plánovaného zastarávání záloh. Při indexaci lze uvést datum zastarávání HashPackage --expires 2019-06-01, a po uplynutí tohoto data (od 00:00) nebude použit. Samotný archiv po tomto datu není nutné odstranit (i když hashget může pohodlně ukázat URL všech záloh, které nám vypršely/vyprší k danému okamžiku nebo k jakémukoli datu).

Například, pokud 1. den provedeme plnou zálohu a indexujeme ji s dobou platnosti do konce měsíce — získáme schéma diferenciální zálohy.

Pokud budeme stejně indexovat i nové zálohy — bude to schéma inkrementálních záloh.

Na rozdíl od tradičních schémat, hashget umožňuje používat několik základních zdrojů. Záloha bude zkrácena jak díky zkrácení souborů z předchozích záloh (pokud nějaké existují), tak díky veřejným souborům (to, co lze stáhnout).

Pokud z nějakého důvodu nevěříme spolehlivosti debianských zdrojů (https://snapshot.debian.org/) nebo používáme jinou distribuci, můžeme jednou provést plnou zálohu se všemi balíčky a poté se již na něj spolehnout (vypnutím heuristiky). Nyní, pokud se všechny servery našich distribucí ukáží jako nedostupné (v suvenýrovém internetu nebo během zombie apokalypsy), ale naše zálohy budou v pořádku — budeme moci obnovit jakoukoli krátkou dif zálohu, opírající se pouze o naše dřívější zálohy.

Hashget se opírá pouze o spolehlivé zdroje obnovy podle VAŠEHO uvážení. Jaké považujete za spolehlivé — ty budou použity.

FilePool a Glacier

Mechanismus FilePool umožňuje se neobracet stále na externí servery pro stahování balíčků, ale použít balíčky z místního adresáře nebo firemního serveru, například:

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

nebo

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

Chcete-li vytvořit pool v místním adresáři, stačí jednoduše vytvořit adresář a nahrnout do něj soubory, hashget si sám podle hashů najde to, co potřebuje. Aby byl pool dostupný přes HTTP, je potřeba vytvořit symbolické odkazy, což se dělá jedním příkazem (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). Samotný HTTP FilePool jsou statické soubory, takže je může obsluhovat jakýkoliv nejjednodušší webový server, zátěž na server je téměř nulová.

Díky FilePool jako základní zdroje můžete používat nejen zdroje na http(s), ale i, například, Amazon Glacier.

Po nahrání zálohy na glacier získáme její Upload ID a použijeme ho jako URL. Například:

hashget --submit Glacier_Upload_ID --file /tmp/my-glacier-backup.tar.gz --project glacier --hashserver --expires 2019-09-01

Nyní nové (diferenciální) zálohy budou vycházet z této zálohy a budou kratší. Po rozbalení diff zálohy si můžeme prohlédnout, na jaké zdroje se spoléhá:

hashget --info /tmp/unpacked/ list

a jednoduše shell skriptem stáhnout z glacier všechny tyto soubory do poolu a spustit běžnou obnovení: hashget -u /tmp/unpacked --pool /tmp/pool

Stojí to za tu námahu

V nejjednodušším případě platíte jednoduše méně za zálohy (pokud je uchováváte někde v cloudu za peníze). Možná – mnohem mnohem méně.

Ale to není jediná výhoda. Množství se mění na kvalitu. Můžete to využít k získání kvalitní aktualizace systému záloh. Například, když jsou naše zálohy nyní kratší – můžeme dělat ne měsíční zálohu, ale denní. Uchovávat je ne půl roku, jak dříve, ale 5 let. Dříve byly uchovávány v pomalém ale levném „chladném“ úložišti (Glacier), nyní je můžete uchovávat v horkém, odkud si můžete vždy rychle stáhnout zálohu a obnovit se za minuty, a ne za den.

Můžete zvýšit spolehlivost uchovávání záloh. Pokud je nyní uchováváme v jednom úložišti, pak zmenšením objemu záloh – budeme moci uchovávat v 2-3 úložištích a bezbolestně přežít, pokud nějaké z nich selže.

Jak to vyzkoušet a začít používat?

Přejděte na gitlab stránku https://gitlab.com/yaroslaff/hashget, nainstalujeme jedním příkazem (pip3 install hashget[plugins]) a prostě si přečíst a provést quick-start. Myslím, že všechny jednoduché věci udělat — zabere to 10-15 minut. Pak můžete zkusit zkomprimovat své virtuální stroje, pokud je potřeba, vytvořit hints soubory pro silnější kompresi, pohrát si s pooly, místní databází hashů a hashes serverem, pokud vás to zajímá, a druhý den se podívat, jaká bude velikost inkrementálního zálohování na včerejších datech.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster