Zmanjšajte varnostne kopije za 99.5 % s hashgetom

hashget - je brezplačen, odprtokoden deduplikator je pripomoček, podoben arhivarju, ki vam omogoča znatno zmanjšanje velikosti varnostnih kopij, pa tudi organiziranje inkrementalnih in diferencialnih shem varnostnega kopiranja in več.

To je pregledni članek za opis funkcij. Dejanska uporaba hashgeta (precej preprosta) je opisana v README projekt in wiki dokumentacijo.

Primerjava

Po zakonu žanra bom takoj začel z intrigo - primerjavo rezultatov:

Vzorec podatkov
nepakirana 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% )

Ozadje o tem, kakšna bi morala biti idealna in učinkovita varnostna kopija

Vsakič, ko sem naredil varnostno kopijo sveže ustvarjenega virtualnega stroja, me je preganjal občutek, da delam nekaj narobe. Zakaj dobim zajetno varnostno kopijo sistema, kjer je moja neprecenljiva, neminljiva ustvarjalnost enovrstični index.html z besedilom “Hello world”?

Zakaj je v moji varnostni kopiji 16 MB /usr/sbin/mysqld? Ali je res mogoče, da imam na tem svetu čast hraniti to pomembno datoteko, in če mi spodleti, bo izgubljena za človeštvo? Najverjetneje ne. Shranjen je na zelo zanesljivih strežnikih debian (katerih zanesljivost in čas delovanja se ne moreta primerjati s tem, kar lahko zagotovim jaz), pa tudi v varnostnih kopijah (več milijonov) drugih skrbnikov. Ali res moramo ustvariti 10+ 000. kopijo te pomembne datoteke za izboljšanje zanesljivosti?

Na splošno hashget in rešuje ta problem. Ko je zapakiran, ustvari zelo majhno varnostno kopijo. Pri razpakiranju - popolnoma razpakiran sistem, podobno kot bi bilo, če tar -c / tar -x. (Z drugimi besedami, to je embalaža brez izgube)

Kako deluje hashget

hashget ima koncepta Package in HashPackage, z njuno pomočjo izvaja deduplikacijo.

paket (plastična vrečka). Datoteka (običajno arhiv .deb ali .tar.gz), ki jo je mogoče varno prenesti z interneta in iz katere je mogoče pridobiti eno ali več datotek.

HashPackage — majhna datoteka JSON, ki predstavlja paket, vključno z URL-jem paketa in zgoščenimi vsotami (sha256) datotek iz njega. Na primer, za paket mariadb-server-core s 5 megabajti je velikost hashpackage samo 6 kilobajtov. Približno tisočkrat manj.

Deduplikacija — ustvarjanje arhiva brez podvojenih datotek (če deduplikator ve, kje je mogoče prenesti izvirni paket, zmanjša število podvojenih datotek iz arhiva).

Pakiranje

Pri pakiranju se skenirajo vse datoteke iz imenika, ki se pakira, izračunajo se njihove zgoščene vsote in če je vsota najdena v enem od znanih HashPackages, se shranijo metapodatki o datoteki (ime, zgoščena vrednost, pravice dostopa itd.). v posebni datoteki .hashget-restore.json, ki bo prav tako vključena v arhiv.

V najpreprostejšem primeru sama embalaža ne izgleda nič bolj zapletena kot katran:

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

Razpakiranje

Razpakiranje poteka v dveh fazah. Najprej običajno razpakiranje katrana:

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

nato obnovite iz omrežja:

hashget -u /path/to/data

Pri obnavljanju hashget prebere datoteko .hashget-restore.json, prenese potrebne pakete, jih razpakira in ekstrahira potrebne datoteke ter jih namesti na zahtevane poti z zahtevanimi lastniki/skupino/dovoljenji.

Težje stvari

To, kar je zgoraj opisano, je že dovolj za tiste, ki "hočejo kot tar, ampak zapakirati svojega Debiana v 4 megabajte." Oglejmo si bolj zapletene stvari kasneje.

Indeksiranje

Če hashget sploh ne bi imel niti enega HashPackagea, potem preprosto ne bi mogel ničesar odstraniti.

HashPackage lahko ustvarite tudi ročno (preprosto: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my), vendar obstaja bolj priročen način.

Da bi dobili potreben hashpackage, obstaja faza indeksiranje (samodejno se izvede z ukazom --pack) In hevristika. Pri indeksiranju hashget vsako najdeno datoteko »napolni« z vsemi razpoložljivimi hevristikami, ki jih zanima. Hevristika lahko nato indeksira kateri koli paket, da ustvari HashPackage.

Na primer, hevristika Debian obožuje datoteko /var/lib/dpkg/status in zazna nameščene pakete debian ter jih prenese in indeksira, če niso indeksirani (zanje ni ustvarjen noben HashPackage). Rezultat je zelo lep učinek - hashget bo vedno učinkovito odstranil podvojene operacijske sisteme Debian, tudi če imajo najnovejše pakete.

Datoteke z namigi

Če vaše omrežje uporablja nekaj vaših lastniških paketov ali javni paket, ki ni vključen v hevristiko hashget, mu lahko dodate preprosto datoteko z namigom hashget-hint.json, kot je ta:

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

Nato bo vsakič, ko bo ustvarjen arhiv, paket indeksiran (če ni bil prej), datoteke paketa pa bodo iz arhiva odstranjene podvojene datoteke. Programiranje ni potrebno, vse je mogoče narediti iz vima in shraniti v vsako varnostno kopijo. Upoštevajte, da bodo zaradi pristopa zgoščene vsote nekatere datoteke iz paketa lokalno spremenjene (na primer spremenjena konfiguracijska datoteka), spremenjene datoteke shranjene v arhivu »kot so« in ne bodo okrnjene.

Če se nekateri vaši lastni paketi občasno posodabljajo, vendar spremembe niso zelo velike, lahko namigujete samo za večje različice. Na primer, v različici 1.0 so naredili namig, ki kaže na mypackage-1.0.tar.gz, in bo popolnoma dedupliciran, nato pa so izdali različico 1.1, ki je nekoliko drugačna, vendar namig ni bil posodobljen. V redu je. Samo datoteke, ki se ujemajo z (lahko jih je obnoviti) različice 1.0, se odstranijo podvojene.

Hevristika, ki obdeluje datoteko z namigi, je dober primer za razumevanje notranjega mehanizma delovanja hevristike. Obdeluje samo datoteke hashget-hint.json (ali .hashget-hint.json s piko) in ignorira vse druge. Iz te datoteke določi, kateri URL paketa naj bo indeksiran, hashget pa ga indeksira (če tega še ni storil)

HashServer

Izvedba popolnega indeksiranja pri ustvarjanju varnostnih kopij bi bila precej delovno intenzivna. Če želite to narediti, morate prenesti vsak paket, ga razpakirati in indeksirati. Zato hashget uporablja shemo z HashServer. Ko je zaznan nameščeni paket Debian in ga ni mogoče najti v lokalnem paketu HashPackage, se najprej poskusi enostavno prenesti paket HashPackage s strežnika zgoščevanja. In samo če to ne deluje, hashget sam prenese in zgosti paket (in ga naloži na hashserver, tako da ga ta hashserver zagotovi v prihodnosti).

HashServer je neobvezen element sheme, ni kritičen, služi izključno za pospešitev in zmanjšanje obremenitve repozitorijev. Enostavno onemogočeno (izbirno --hashserver brez parametrov). Poleg tega lahko preprosto naredite svoj hashserver.

Inkrementalne in diferencialne varnostne kopije, načrtovano zastarevanje

hashget omogoča zelo preprosto izdelavo diagrama inkrementalne in diferencialne varnostne kopije. Zakaj ne indeksiramo naše varnostne kopije same (z vsemi našimi edinstvenimi datotekami)? Ena ekipa --submit in končali ste! Naslednja varnostna kopija, ki jo ustvari hashget, ne bo vključevala datotek iz tega arhiva.

Vendar to ni zelo dober pristop, ker se lahko izkaže, da bomo morali pri obnovitvi potegniti vse varnostne kopije hashget v celotni zgodovini (če vsaka vsebuje vsaj eno edinstveno datoteko). Za to obstaja mehanizem načrtovana zastarelost varnostnih kopij. Pri indeksiranju lahko določite datum poteka HashPackage --expires 2019-06-01, po tem datumu (od 00:00) pa ne bo več v uporabi. Samega arhiva po tem datumu ni več mogoče izbrisati (čeprav lahko hashget priročno prikaže URL-je vseh varnostnih kopij, ki so/bodo pokvarjene v tem trenutku ali na kateri koli datum).

Na primer, če naredimo popolno varnostno kopijo 1. in jo indeksiramo z življenjsko dobo do konca meseca, bomo dobili diferencialno varnostno kopijo.

Če nove varnostne kopije indeksiramo na enak način, bo obstajala shema inkrementalnih varnostnih kopij.

Za razliko od tradicionalnih shem vam hashget omogoča uporabo več osnovnih virov. Varnostna kopija bo zmanjšana z zmanjšanjem datotek iz prejšnjih varnostnih kopij (če obstajajo) in javnih datotek (kar je mogoče prenesti).

Če iz nekega razloga ne zaupamo v zanesljivost virov Debian (https://snapshot.debian.org/) ali uporablja drugo distribucijo, lahko preprosto naredimo popolno varnostno kopijo enkrat z vsemi paketi in se nato zanesemo nanjo (z onemogočanjem hevristike). Zdaj, če se izkaže, da nam vsi strežniki naših distribucij niso na voljo (na spominskem internetu ali med zombi apokalipso), vendar so naše varnostne kopije v redu, lahko obnovimo iz katere koli kratke diff varnostne kopije, ki se zanaša samo na naše prejšnje varnostne kopije .

Hashget se zanaša samo na zaupanja vredne vire za obnovitev po VAŠI presoji. Uporabljeni bodo tisti, ki se vam zdijo zanesljivi.

FilePool in Glacier

Mehanizem FilePool vam omogoča, da se za prenos paketov ne obrnete nenehno na zunanje strežnike, temveč uporabite pakete iz lokalnega imenika ali strežnika podjetja, na primer:

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

ali

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

Če želite ustvariti bazen v lokalnem imeniku, morate samo ustvariti imenik in vanj vrči datoteke, hashget bo sam našel, kar potrebuje, s pomočjo zgoščenih vrednosti. Če želite narediti bazen dostopen prek HTTP, morate na poseben način ustvariti simbolne povezave; to storite z enim ukazom (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). HTTP FilePool je sam po sebi statična datoteka, zato jo lahko streže kateri koli preprost spletni strežnik, obremenitev strežnika je skoraj nič.

Zahvaljujoč FilePoolu lahko kot osnovne vire uporabljate ne le vire http(s), ampak tudi na primer, amazonski ledenik.

Ko naložimo varnostno kopijo na ledenik, dobimo njen ID za nalaganje in ga uporabimo kot URL. Na primer:

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

Zdaj bodo nove (diferencialne) varnostne kopije temeljile na tej varnostni kopiji in bodo krajše. Ko tar razpakira diffbackup, lahko vidimo, na katere vire se opira:

hashget --info /tmp/unpacked/ list

in preprosto uporabite lupinski skript za prenos vseh teh datotek iz Glacierja v bazen in zaženite običajno obnovitev: hashget -u /tmp/unpacked —pool /tmp/pool

Ali je igra vredna sveče?

V najpreprostejšem primeru boste enostavno plačali manj za varnostne kopije (če jih boste za denar shranili nekje v oblak). Morda veliko, veliko manj.

Ampak to ni edino. Kvantiteta se spremeni v kvaliteto. To lahko uporabite za visokokakovostno nadgradnjo varnostne sheme. Na primer, ker so naše varnostne kopije zdaj krajše, lahko ne delamo mesečnih varnostnih kopij, ampak dnevne. Shranjujte jih ne šest mesecev, kot prej, ampak 5 let. Prej ste ga shranjevali v počasnem, a poceni "hladnem" skladišču (Glacier), zdaj ga lahko shranite v vročem skladišču, od koder lahko vedno hitro prenesete varnostno kopijo in jo obnovite v minutah, ne v enem dnevu.

Zanesljivost varnostnega shranjevanja lahko povečate. Če jih trenutno hranimo v enem skladišču, jih bomo z zmanjšanjem obsega varnostnih kopij lahko hranili v 2-3 skladiščih in neboleče preživeli, če se eden od njih poškoduje.

Kako poskusiti in začeti uporabljati?

Pojdite na stran gitlab https://gitlab.com/yaroslaff/hashget, namestite z enim ukazom (pip3 install hashget[plugins]) ter samo preberite in izvedite hitri zagon. Mislim, da bo trajalo 10-15 minut, da naredite vse preproste stvari. Nato lahko poskusite stisniti svoje virtualne stroje, po potrebi ustvarite datoteke z namigi, da bo stiskanje močnejše, se poigrajte z bazeni, lokalno zgoščeno bazo podatkov in zgoščenim strežnikom, če vas zanima, in naslednji dan preverite, kakšna je velikost inkrementalne varnostne kopije. bo na vrhu včerajšnjega.

Vir: www.habr.com

Dodaj komentar