Samaziniet dublējumus par 99,5% ar hashget

hashget — ir bezmaksas, atvērtās koda deduplikators — rīks, kas līdzīgs arhivatoram, ļauj ievērojami samazināt dublējumu apjomu, kā arī organizēt inkrementālo un diferencēto dublējumkopiju shēmas un ne tikai.

Šis ir pārskata raksts par iespējām. Paša hashget lietošanas (salīdzinoši vienkāršs) apraksts ir README projekta un wiki dokumentācijā.

Salīdzinājums

Pēc žanra likuma, sākušu ar intrigu — salīdzinājumu rezultātiem:

Datu paraugs
izsaiņotais izmērs
.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% )

Iepriekšējā vēsture, kādam jābūt ideālajam un efektīvajam dublējumam

Katru reizi, kad es veicu dublējumu jaunizveidotai virtuālai mašīnai, man nedod mieru sajūta, ka es kaut ko daru nepareizi. Kāpēc man ir smags dublējums no sistēmas, kur manas nenovērtējamās nemirstīgās radīšanas — vienas rindas index.html ar tekstu «Hello world»?

Kāpēc manā dublējumā ir 16 megabaitu liels /usr/sbin/mysqld? Vai tiešām šajā pasaulē man ir uzticēta šī svarīgā faila glabāšana, un, ja es neizdosies — tas tiks zaudēts cilvēcei? Drīzāk nē. Tas tiek glabāts augsti uzticamajos Debian serveros (to uzticamība un nepārtrauktība nav salīdzināma ar to, ko es varu nodrošināt), un arī citas administratoru rezerves kopijās (miljonos tām). Vai tiešām mums ir nepieciešams izveidot, lai palielinātu uzticamību, 10 000 000 + 1. kopiju šim svarīgajam failam?

Vispārēji hashget un atrisina šo problēmu. Iepakojot — tas izveido ļoti mazu dublējumu. Izsaiņojot — pilnībā izsaiņotu sistēmu, līdzīgu tai, kas būtu pie tar -c / tar -x. (Citiem vārdiem sakot, tā ir zaudējumu neizsaiņošana)

Kā darbojas hashget

hashget ir jēdzieni Package un HashPackage, ar to palīdzību tas veic deduplikāciju.

Package (paketēm). fails (parasti .deb vai .tar.gz arhīvs), kuru var droši lejupielādēt no tīkla un no kura var iegūt vienu vai vairākus failus.

HashPackage — neliels JSON fails, kas attēlo Package, tostarp satur pakotnes URL un failu heshot (sha256) no tā. Piemēram, mariadb-server-core pakotnei ar apjomu 5 megabaiti hashpackage apjoms ir tikai 6 kilobaiti. Aptuveni tūkstoš reizes mazāk.

Deduplication — archiva izveidošana bez dublētiem failiem (ja deduplikators zina, kur var lejupielādēt oriģinālo paketi, tas samazina dublējumus arhīvā).

Iepakošana

Pakošanas procesā tiek pārskatīti visi faili pakojamajā katalogā, aprēķinātas to haša summas, un, ja summa tiek atrasta kādā no zināmajiem HashPackage, tad faila metadati (nosaukums, hašs, piekļuves tiesības u.c.) tiek saglabāti īpašā failā .hashget-restore.json, kas arī tiks iekļauts arhīvā.

Pašas pakošanas process visvienkāršākajā gadījumā izskatās nekomplicētāk par tar:

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

Izpakošana

Izpakošana notiek divos posmos. Sākumā parastā tar izpakošana:

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

tad atjaunošana no tīkla:

hashget -u /path/to/data

Atjaunošanas laikā hashget lasa failu .hashget-restore.json, lejupielādē nepieciešamos pakotnes, izpako tos un izvelk nepieciešamos failus, uzstādot tos vajadzīgajos ceļos ar vajadzīgajiem owner/group/permissions.

Sarežģītākas lietas

Tas, kas aprakstīts iepriekš, jau ir pietiekami tiem, kam "gribu, kā tar, bet lai iepako manu Debian 4 megabaitos". Tālāk apskatīsim sarežģītākas lietas.

Indeksēšana

Ja hashget vispār nebūtu neviena HashPackage, tas vienkārši nevarētu neko deduplicēt.

Izveidot HashPackage var arī manuāli (vienkārši: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my), bet ir ērtāks veids.

Lai iegūtu nepieciešamos hashpackage, ir posms indeksēšanas (tas automātiski tiek veikts, kad tiek izpildīta komanda --pack) un hevristikas. Indeksēšanas laikā hashget "apstrādā" katru atrasto failu visām esošajām hevristikām, kas tam interesantas. Hevristikam tad var būt iespēja indeksēt kādu pakotni, lai izveidotu HashPackage.

Piemēram, Debian hevristika patīk fails /var/lib/dpkg/status un atklāj uzstādītās Debian pakotnes, un, ja tās nav indeksētas (HashPackage nav izveidoti), tās lejupielādē un indeksē. Rezultāts iznāk ļoti patīkams — hashget vienmēr efektīvi deduplicēs Debian operācijas sistēmas, pat ja tajās ir visjaunākās pakotnes.

Faili-iedvesmas (hints)

Ja jūsu tīklā tiek izmantots kāds jūsu uzņēmuma paket vai publiska pakete, kas nav iekļauta hashget hevristikās, jūs varat pievienot tam vienkāršu hint-failu hashget-hint.json pēc parauga:

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

Tālāk, katru reizi, izveidojot arhīvu, pakotne tiks indeksēta (ja tā iepriekš nav bijusi) un pakotnes faili tiks deduplicēti no arhīva. Nav nepieciešama programmēšana, visu var izdarīt no vim un ietaupīt katrā dublējumā. Piezīmiet, ka, pateicoties pieejai caur hash summām, ja kādi faili no pakotnes tiks mainīti lokāli (piemēram, mainīts konfigurācijas fails) — tad mainītie faili saglabāsies arhīvā „kā ir” un netiks samazināti.

Ja kāda jūsu pašu pakotne tiek regulāri atjaunināta, bet izmaiņas nav ļoti lielas, var izdarīt hint tikai galvenajām versijām. Piemēram, 1.0 versijā tika veikts hints ar norādījumu uz mypackage-1.0.tar.gz, un tā tiks pilnībā deduplicēta, pēc tam tika izlaista versija 1.1, kas nedaudz atšķiras, bet hints nav atjaunots. Nekas ļoti traks. Deduplicēsies tikai faili, kas atbilst (kurus var atjaunot) versijai 1.0.

Heuristika, kas apstrādā hint-failu — labi piemērs, lai saprastu iekšējo mehānismu, kā darbojas heuristikas. Tā apstrādā tikai failus hashget-hint.json (vai .hashget-hint.json ar punktu) un ignorē visus pārējos. Pēc šī faila tā nosaka, kurš pakotnes URL jāindeksē, un hashget to indeksē (ja tas nav izdarīts iepriekš).

HashServer

Būtu diezgan darbietilpīgi, izveidojot dublējumus, pilnībā veikt indeksācijas. Tam ir nepieciešams lejupielādēt katru pakotni, izpakot, indeksēt. Tāpēc hashget izmanto shēmu ar HashServer. Atpazīstot uzstādīto debian pakotni, ja tā netiek atrasta vietējās HashPackage, vispirms tiek mēģināts vienkārši lejupielādēt HashPackage no hash servera. Un tikai tad, ja tas neizdodas — hashget pats lejupielādē un heshē pakotni (un augšupielādē uz hashserver, lai nākotnē hashserver to nodrošinātu).

HashServer — nav obligāts shēmas elements, tas nav kritisks, kalpo tikai, lai paātrinātu un samazinātu slodzi uz repozitorijiem. To viegli var izslēgt (ar opciju --hashserver bez parametriem). Turklāt viegli var izveidot savu paša hashserver..

Inkrementālie un diferencējošie dublējumi, plānotā novecošana

hashget ļauj ļoti vienkārši izveidot shēmu inkrementālo un diferencējošo dublējumu.. Kāpēc gan mums neindeksēt pašu dublējumu (ar visiem mūsu unikālajiem failiem)? Viena komanda --submit Un viss ir gatavs! Nākamais dublējums, ko izveidos hashget, nesaturēs failus no šī arhīva.

Tomēr tas nav vislabākais risinājums, jo var gadīties, ka atjaunošanas laikā nāksies vilkt visus hashget dublējumus no visas vēstures (ja katrā būs vismaz viens unikāls fails). Šim nolūkam ir mehānisms plānotas dublējumu novecošanas. Indeksēšanas laikā var norādīt HashPackage novecošanas datumu --expires 2019-06-01, un pēc šīs datuma iestāšanās (no 00:00) tas netiks izmantots. Pašu arhīvu pēc šīs datuma var neatbrīvot (kaut gan hashget var ērti parādīt URL visiem dublējumiem, kas mums ir beigušies vai beigsies noteiktā datumā).

Piemēram, ja 1. datumā veiksim pilnu dublējumu un indeksēsim to dzīves ilguma beigām mēnesī — mēs iegūsim diferencionālo dublējumu shēmu.

Ja tāpat indeksēsim arī jaunus dublējumus — būs inkrementālo dublējumu shēma.

Atšķirībā no tradicionālajiem shēmām, hashget ļauj izmantot vairākus pamata avotus. Dublējums tiks samazināts gan, samazinot failus no iepriekšējiem dublējumiem (ja tādi ir), gan no publiskajiem failiem (to, ko var lejupielādēt).

Ja kāda iemesla dēļ mēs neuzticamies debian resursu uzticamībai (https://snapshot.debian.org/) vai izmantojam citu izplatījumu, mēs vienkārši varam vienreiz veikt pilnu dublējumu ar visiem pakotnēm, un tālāk paļauties uz to (izslēdzot heuristiku). Tagad, ja visi mūsu izplatījumu serveri kļūst mums nepieejami (suvenīru internetā vai zombiju apokalipsē), bet mūsu dublējumi būs kārtībā — mēs varēsim atjaunoties no jebkura īsa differenciālā dublējuma, paļaujoties tikai uz mūsu iepriekšējiem dublējumiem.

Hashget paļaujas tikai uz uzticamiem atjaunošanas avotiem pēc JŪSU ieskatiem. Pārējie izvēlēto avoti tiks izmantoti.

FilePool un Glacier

Sistēma FilePool ļauj neatsaukties pastāvīgi uz ārējiem serveriem pakotņu lejupielādei, bet izmantot pakotnes no lokālā katalogā vai korporatīvā servera, piemēram:

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

vai

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

Lai izveidotu baseinu vietējā katalogā, pietiek tikai izveidot katalogu un iekraūt tajā failus, hashget pats pēc hash atradīs to, kas tam nepieciešams. Lai padarītu baseinu pieejamu caur HTTP, jāizveido simboliskie saites īpašā veidā, to var izdarīt ar vienu komandu (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). Pats HTTP FilePool — tas ir statiski faili, tāpēc jebkurš vienkāršs tīmekļa serveris var to apkalpot, slodze uz serveri ir gandrīz nulles līmenī.

Pateicoties FilePool, kā bāzes resursus var izmantot ne tikai resursus uz http(s), bet arī, piemēram, Amazon Glacier.

Pēc rezerves kopijas augšupielādes uz Glacier saņemam tās Upload ID un izmantojam to kā URL. Piemēram:

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

Tagad jaunas (diferenciālās) rezerves kopijas balstīsies uz šo rezerves kopiju un būs īsākas. Pēc tar izsaiņošanas no diferencālās rezerves kopijas mēs varam paskatīties, uz kādiem resursiem tā paļaujas:

hashget --info /tmp/unpacked/ list

un vienkārši ar shell skriptu lejupielādēt no Glacier visus šos failus pool un palaist parasto atjaunošanu: hashget -u /tmp/unpacked --pool /tmp/pool

Vai tas ir tā vērts

Vienkāršākajā gadījumā — jūs vienkārši maksāsiet mazāk par rezerves kopijām (ja glabājat tās kaut kur mākonī par maksu). Varbūt — daudz, daudz mazāk.

Bet tas nav vienīgais. Skaits pāriet kvalitātē. Jūs varat to izmantot, lai iegūtu kvalitatīvu jauninājumu rezerves kopiju shēmā. Piemēram, tagad, kad rezerves kopijas ir īsākas — varat veikt ne mēneša, bet ikdienas rezerves kopijas. Glabāt tās ne pusgadu, kā agrāk, bet 5 gadus. Agrāk glabājām lēnajā, bet lētajā 'aukstajā' glabāšanā (Glacier), tagad varat glabāt karstajā, no kurienes var ātri lejupielādēt rezerves kopiju un atjaunoties minūšu laikā, nevis dienu.

Var palielināt rezerves kopiju glabāšanas uzticamību. Ja šobrīd mēs tās glabājam vienā glabātuvē, tad samazinot rezerves kopiju apjomu — varēsim glabāt 2-3 glabātuvēs un viegli pārdzīvot, ja viena no tām tiek bojāta.

Kā pamēģināt un sākt lietot?

Aiziet uz GitLab lapu https://gitlab.com/yaroslaff/hashget, instalējiet ar vienu komandu (pip3 install hashget[plugins]) un vienkārši izpildām quick-start. Domāju, ka visas vienkāršās lietas varēs izdarīt — tas aizņems apmēram 10-15 minūtes. Pēc tam var izmēģināt samazināt savas virtuālās mašīnas, izveidot, ja nepieciešams, hint-failus, lai vēl vairāk samazinātu, paklausīties ar pulkiem, lokālo hash datu bāzi un hash serveri, ja būs interese, un nākamajā dienā paskatīties, kāds būs inkrementālā dublējuma lielums virs vakardienas.

Avots: habr.com

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster