Hashget yordamida zahira nusxalarini 99.5% ga kamaytiring

hashget - bu bepul, ochiq manba detuplikator arxivlovchiga o'xshash yordamchi dastur bo'lib, u zaxira nusxalarining hajmini sezilarli darajada kamaytirish, shuningdek, qo'shimcha va differentsial zaxira sxemalarini va boshqalarni tashkil qilish imkonini beradi.

Bu xususiyatlarni tavsiflash uchun umumiy maqola. Hashget-dan haqiqiy foydalanish (juda oddiy) maqolada tasvirlangan README loyiha va wiki hujjatlari.

Taqqoslash

Janr qonuniga ko'ra, men darhol intrigadan boshlayman - natijalarni taqqoslash:

Ma'lumotlar namunasi
ochilmagan o'lcham
.tar.gz
hashget.tar.gz

WordPress-5.1.1
43 Mb
11 Mb (26%)
155 Kb ( 0.3% )

Linux yadrosida 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% )

Ideal va samarali zaxira qanday bo'lishi kerakligi haqida ma'lumot

Har safar yangi yaratilgan virtual mashinaning zahira nusxasini yaratganimda, men noto'g'ri ish qilayotganimni his qilardim. Nega men tizimdan katta zaxira nusxasini olaman, bu yerda mening bebaho, o'zgarmas ijodim “Salom dunyo” matni bilan bir qatorli index.html?

Nega mening zahiramda 16 MB /usr/sbin/mysqld bor? Nahotki, bu dunyoda men bu muhim faylni saqlash sharafiga muyassar bo‘lsam, agar muvaffaqiyatsizlikka uchrasam, u insoniyat uchun yo‘qolib qolishi mumkinmi? Katta ehtimol bilan yo'q. U juda ishonchli debian serverlarida (ishonchliligi va uzluksizligini men taqdim eta oladigan narsalar bilan taqqoslab bo'lmaydi), shuningdek, boshqa administratorlarning zaxira nusxalarida (millionlab) saqlanadi. Ishonchliligini oshirish uchun haqiqatan ham ushbu muhim faylning 10 000 000+ 1-nusxasini yaratishimiz kerakmi?

Umuman hashget va bu muammoni hal qiladi. Qadoqlanganda, u juda kichik zaxira nusxasini yaratadi. Paketni ochishda - butunlay ochilmagan tizim, agar bo'lsa, xuddi shunday bo'ladi tar -c / tar -x. (Boshqacha aytganda, bu yo'qotishsiz qadoqlash)

Hashget qanday ishlaydi

hashget Package va HashPackage tushunchalariga ega, ularning yordami bilan u deduplikatsiyani amalga oshiradi.

To'plam (plastik paket). Internetdan xavfsiz yuklab olinadigan va bir yoki bir nechta faylni olish mumkin bo'lgan fayl (odatda .deb yoki .tar.gz arxivi).

HashPackage — paketni ifodalovchi kichik JSON fayli, jumladan paket URL manzili va undagi fayllarning xesh summasi (sha256). Masalan, 5 megabaytlik mariadb-server yadrosi paketi uchun xeshpaket hajmi atigi 6 kilobaytni tashkil qiladi. Taxminan ming marta kamroq.

Deduplikatsiya — ikki nusxadagi fayllarsiz arxiv yaratish (agar deduplikator asl paketni qayerdan yuklab olish mumkinligini bilsa, u arxivdan dublikatlarni kamaytiradi).

Qadoqlash

Qadoqlashda o'ralgan katalogdagi barcha fayllar skanerdan o'tkaziladi, ularning xesh summalari hisoblab chiqiladi va agar summa ma'lum HashPackages'dan birida topilsa, fayl haqidagi metama'lumotlar (nom, xesh, kirish huquqlari va boshqalar) saqlanadi. .hashget-restore.json maxsus faylida, u ham arxivga kiritiladi.

Eng oddiy holatda, qadoqlashning o'zi smoladan ko'ra murakkabroq ko'rinmaydi:

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

Paketdan chiqarilmoqda

Paketni ochish ikki bosqichda amalga oshiriladi. Avval odatdagi smolani ochish:

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

keyin tarmoqdan tiklang:

hashget -u /path/to/data

Qayta tiklashda, hashget .hashget-restore.json faylini o'qiydi, kerakli paketlarni yuklab oladi, ularni ochadi va kerakli ega/guruh/ruxsatlar bilan kerakli yo'llarga o'rnatib, kerakli fayllarni chiqaradi.

Ko'proq qiyin narsalar

Yuqorida tavsiflangan narsa "buni qatron kabi xohlaydiganlar uchun, lekin mening Debian-ni 4 megabaytga to'plash uchun" etarli. Keyinchalik murakkabroq narsalarni ko'rib chiqaylik.

Indekslash

Agar hashgetda umuman bitta HashPackage bo'lmagan bo'lsa, u shunchaki hech narsani nusxalashtira olmaydi.

HashPackage-ni qo'lda ham yaratishingiz mumkin (shunchaki: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my), lekin qulayroq yo'l bor.

Kerakli xesh-paketni olish uchun bosqich mavjud indekslash (buyruq bilan avtomatik ravishda bajariladi --pack) va evristika. Indekslashda hashget topilgan har bir faylni unga qiziqqan barcha mavjud evristik ma'lumotlarga "oziqlaydi". Keyin evristika HashPackage yaratish uchun har qanday paketni indekslashi mumkin.

Masalan, Debian evristikasi /var/lib/dpkg/status faylini yaxshi ko'radi va o'rnatilgan debian paketlarini aniqlaydi va agar ular indekslanmagan bo'lsa (ular uchun HashPackage yaratilmagan), ularni yuklab oladi va indekslaydi. Natija juda yoqimli effekt - hashget har doim Debian operatsion tizimlarini, hatto ular eng so'nggi paketlarga ega bo'lsa ham, samarali ravishda deduplikatsiya qiladi.

Maslahat fayllari

Agar sizning tarmog'ingiz xususiy paketlaringizdan yoki hashget evristikasiga kiritilmagan umumiy paketlardan foydalansa, unga oddiy hashget-hint.json maslahat faylini quyidagicha qo'shishingiz mumkin:

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

Keyinchalik, har safar arxiv yaratilganda, paket indekslanadi (agar u ilgari bo'lmagan bo'lsa) va paket fayllari arxivdan nusxalanadi. Hech qanday dasturlash kerak emas, hamma narsani vim-dan bajarish mumkin va har bir zaxirada saqlash mumkin. Shuni esda tutingki, hash sum yondashuvi tufayli, agar paketdagi ba'zi fayllar mahalliy sifatida o'zgartirilsa (masalan, konfiguratsiya fayli o'zgartirilsa), o'zgartirilgan fayllar arxivda "xuddi shunday" saqlanadi va kesilmaydi.

Agar o'zingizning ba'zi paketlaringiz vaqti-vaqti bilan yangilanib tursa, lekin o'zgarishlar unchalik katta bo'lmasa, siz faqat asosiy versiyalarga ishora qilishingiz mumkin. Misol uchun, 1.0 versiyada ular mypackage-1.0.tar.gz ga ishora qilishdi va u to'liq nusxalanadi, keyin 1.1 versiyasini chiqarishdi, bu biroz farq qiladi, ammo maslahat yangilanmagan. Hammasi joyida; shu bo'ladi. Faqat 1.0 versiyasiga mos keladigan (qayta tiklash mumkin) fayllar takrorlanadi.

Maslahat faylini qayta ishlovchi evristika evristikaning qanday ishlashining ichki mexanizmini tushunish uchun yaxshi namunadir. U faqat hashget-hint.json fayllarini (yoki nuqta bilan .hashget-hint.json) qayta ishlaydi va qolganlarini e'tiborsiz qoldiradi. Ushbu fayldan qaysi paket URL manzili indekslanishi kerakligini aniqlaydi va hashget uni indekslaydi (agar u hali buni qilmagan bo'lsa)

HashServer

Zaxira nusxalarini yaratishda to'liq indekslashni amalga oshirish juda ko'p mehnat talab qiladi. Buning uchun siz har bir paketni yuklab olishingiz, uni ochishingiz va indekslashingiz kerak. Shuning uchun hashget bilan sxemadan foydalanadi HashServer. O'rnatilgan Debian paketi aniqlanganda, agar u mahalliy HashPackage-da topilmasa, avval HashPackage-ni hash-serverdan yuklab olishga harakat qilinadi. Va agar bu ishlamasa, hashget o'zi paketni yuklab oladi va xeshlaydi (va uni hashserverga yuklaydi, shunda hashserver kelajakda uni taqdim etadi).

HashServer - bu sxemaning ixtiyoriy elementi, muhim emas, u faqat omborlarga yukni tezlashtirish va kamaytirish uchun xizmat qiladi. Osonlik bilan o'chirilgan (ixtiyoriy --hashserver parametrlarsiz). Bundan tashqari, siz osongina qilishingiz mumkin o'zingizning hashserveringizni yarating.

Qo'shimcha va differentsial zaxiralar, rejalashtirilgan eskirish

hashget diagramma tuzishni juda oson qiladi qo'shimcha va differentsial zaxiralar. Nega biz zaxira nusxamizni (barcha noyob fayllarimiz bilan) indekslamaymiz? Bitta jamoa --submit va siz tugatdingiz! Hashget yaratadigan keyingi zaxiraga ushbu arxivdagi fayllar kirmaydi.

Ammo bu juda yaxshi yondashuv emas, chunki qayta tiklashda biz butun tarixdagi barcha hashget zahiralarini tortib olishimiz kerak bo'lishi mumkin (agar har birida kamida bitta noyob fayl bo'lsa). Buning uchun mexanizm mavjud zaxira nusxalarining rejalashtirilgan eskirishi. Indekslashda siz HashPackagening amal qilish muddatini belgilashingiz mumkin --expires 2019-06-01, va bu sanadan keyin (soat 00:00 dan) foydalanilmaydi. Ushbu sanadan keyin arxivning o'zini o'chirib bo'lmaydi (garchi hashget hozirda yoki istalgan sanada chirigan/chirigan barcha zaxira nusxalarining URL manzillarini qulay tarzda ko'rsatishi mumkin).

Misol uchun, agar biz 1-da to'liq zaxira nusxasini yaratsak va uni oy oxirigacha umr bo'yi indekslasak, biz differentsial zaxira sxemasini olamiz.

Agar biz yangi zaxiralarni xuddi shu tarzda indekslasak, qo'shimcha zaxiralar sxemasi bo'ladi.

An'anaviy sxemalardan farqli o'laroq, hashget bir nechta asosiy manbalardan foydalanishga imkon beradi. Zaxira nusxasi avvalgi zahiradagi fayllarni (agar mavjud bo'lsa) va umumiy fayllarni (nimalarni yuklab olish mumkin) kamaytirish orqali qisqartiriladi.

Agar biron sababga ko'ra biz Debian resurslarining ishonchliligiga ishonmasak (https://snapshot.debian.org/) yoki boshqa tarqatishdan foydalansa, biz barcha paketlar bilan bir marta to'liq zaxira nusxasini yaratishimiz va keyin unga tayanishimiz mumkin (evristikani o'chirish orqali). Endi, agar bizning tarqatishimizning barcha serverlari biz uchun mavjud bo'lmasa (esdalik sovg'asida yoki zombi apokalipsisi paytida), lekin bizning zaxiralarimiz tartibda bo'lsa, biz faqat oldingi zaxiralarimizga tayanadigan har qanday qisqa diff zahirasidan tiklashimiz mumkin. .

Hashget faqat SIZNING ixtiyoriga ko'ra ishonchli tiklash manbalariga tayanadi. Ishonchli deb hisoblaganingizdan foydalaniladi.

FilePool va Glacier

mexanizm FilePool paketlarni yuklab olish uchun doimiy ravishda tashqi serverlar bilan bog'lanishga emas, balki mahalliy katalog yoki korporativ serverdagi paketlardan foydalanishga imkon beradi, masalan:

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

yoki

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

Mahalliy katalogda hovuz yaratish uchun siz shunchaki katalog yaratishingiz va unga fayllarni tashlashingiz kerak, hashget o'zi xeshlar yordamida kerakli narsani topadi. Hovuzga HTTP orqali kirishni ta'minlash uchun siz maxsus tarzda symlinks yaratishingiz kerak; bu bitta buyruq bilan amalga oshiriladi (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). HTTP FilePool o'zi statik fayllar, shuning uchun har qanday oddiy veb-server unga xizmat qilishi mumkin, serverdagi yuk deyarli nolga teng.

FilePool tufayli siz nafaqat http(lar) resurslaridan asosiy manba sifatida, balki foydalanishingiz mumkin masalan, Amazon muzligi.

Zaxirani muzlikka yuklagandan so'ng, biz uning Yuklash identifikatorini olamiz va uni URL sifatida ishlatamiz. Masalan:

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

Endi yangi (differensial) zaxiralar shu zahiraga asoslanadi va qisqaroq bo'ladi. Diffbackup-ni tar bilan ochganimizdan so'ng, u qanday resurslarga tayanishini ko'rishimiz mumkin:

hashget --info /tmp/unpacked/ list

va bu fayllarning barchasini Glacier-dan hovuzga yuklab olish uchun qobiq skriptidan foydalaning va odatdagi tiklashni bajaring: hashget -u /tmp/unpacked —pool /tmp/pool

O'yin shamga arziydimi?

Eng oddiy holatda, siz zaxira nusxalari uchun kamroq to'laysiz (agar siz ularni pul uchun bulutda saqlasangiz). Balki ko'p, kamroq.

Lekin bu yagona narsa emas. Miqdor sifatga aylanadi. Zaxira sxemasini yuqori sifatli yangilash uchun undan foydalanishingiz mumkin. Misol uchun, bizning zahira nusxalarimiz endi qisqarganligi sababli, biz oylik emas, balki kunlik zaxiralashni amalga oshirishimiz mumkin. Ularni avvalgidek olti oy emas, balki 5 yil davomida saqlang. Ilgari siz uni sekin, ammo arzon “sovuq” omborda (Muzlik) saqlagan edingiz, endi uni issiq omborda saqlashingiz mumkin, u yerdan har doim tezda zahirani yuklab olishingiz va uni bir kunda emas, bir necha daqiqada tiklashingiz mumkin.

Zaxira saqlash ishonchliligini oshirishingiz mumkin. Agar biz ularni hozirda bitta omborxonada saqlasak, zahiralar hajmini kamaytirib, 2-3 ta omborxonada saqlashimiz va ulardan biri shikastlansa, og‘riqsiz omon qolishimiz mumkin bo‘ladi.

Qanday qilib sinab ko'rish va foydalanishni boshlash kerak?

Gitlab sahifasiga o'ting https://gitlab.com/yaroslaff/hashget, bitta buyruq bilan o'rnating (pip3 install hashget[plugins]) va shunchaki o'qing va tezkor boshlashni bajaring. Menimcha, barcha oddiy ishlarni bajarish uchun 10-15 daqiqa kerak bo'ladi. Keyin siz virtual mashinalaringizni siqib chiqarishga harakat qilishingiz mumkin, agar kerak bo'lsa, siqishni kuchaytirish uchun maslahat fayllarini yarating, agar sizni qiziqtirsa, hovuzlar, mahalliy xesh ma'lumotlar bazasi va xesh-server bilan o'ynashingiz mumkin va ertasi kuni qo'shimcha zahiraning hajmini ko'rishingiz mumkin. kechagi kunning tepasida bo'ladi.

Manba: www.habr.com

a Izoh qo'shish