Хэшгет көмегімен сақтық көшірмелерді 99.5%-ға азайтыңыз

хэшгет - бұл тегін, көзі ашық дедупликатор резервтік көшірмелердің көлемін айтарлықтай азайтуға, сондай-ақ қосымша және дифференциалды сақтық көшірме схемаларын және т.б. ұйымдастыруға мүмкіндік беретін мұрағатшыға ұқсас утилита болып табылады.

Бұл мүмкіндіктерді сипаттайтын шолу мақаласы. Хэшгетті нақты пайдалану (өте қарапайым) сипатталған README жоба және wiki құжаттамасы.

Салыстыру

Жанр заңына сәйкес, мен бірден интригадан бастаймын - нәтижелерді салыстыру:

Деректер үлгісі
қапталмаған өлшем
.tar.gz
hashget.tar.gz

WordPress-5.1.1
43 Мб
11 Мб (26%)
155 Кб ( 0.3% )

Linux ядросы 5.0.4
934 Мб
161 Мб (20%)
4.7 Мб ( 0.5% )

Debian 9 (LAMP) LXC VM
724 Мб
165 Мб (23%)
4.1 Мб ( 0.5% )

Идеал және тиімді сақтық көшірме қандай болуы керектігі туралы фон

Жаңадан жасалған виртуалды машинаның сақтық көшірмесін жасаған сайын, мені бірдеңе дұрыс емес істеп жатқан сияқты сезіндім. Неліктен мен жүйеден үлкен резервтік көшірме аламын, мұнда менің баға жетпес, өшпейтін шығармашылығым «Сәлем әлем» мәтіні бар бір жолды index.html болып табылады?

Неліктен менің сақтық көшірмеде 16 МБ /usr/sbin/mysqld бар? Бұл дүниеде мен бұл маңызды файлды сақтау құрметіне ие болуым мүмкін бе, егер мен сәтсіз болсам, ол адамзат үшін жоғалып кетуі мүмкін бе? Сірә, жоқ. Ол өте сенімді debian серверлерінде (сенімділігі мен жұмыс уақыты мен қамтамасыз ете алатыныммен салыстыруға келмейді), сондай-ақ басқа әкімшілердің сақтық көшірмелерінде (олардың миллиондаған) сақталады. Сенімділікті арттыру үшін осы маңызды файлдың 10 000 000+ 1-ші көшірмесін жасау керек пе?

Жалпы алғанда хэшгет және бұл мәселені шешеді. Буып-түю кезінде ол өте кішкентай сақтық көшірме жасайды. Қаптаманы ашқан кезде - толығымен ашылған жүйе, егер ол болатынына ұқсас tar -c / tar -x. (Басқаша айтқанда, бұл шығынсыз қаптама)

Хэшгет қалай жұмыс істейді

hashget пакеті және HashPackage концепцияларына ие, олардың көмегімен дедупликацияны орындайды.

пакет (пластикалық пакет). Интернеттен қауіпсіз жүктеп алуға болатын және бір немесе бірнеше файлдарды алуға болатын файл (әдетте .deb немесе .tar.gz мұрағаты).

HashPackage — буманың URL мекенжайын және ондағы файлдардың хэш сомасын (sha256) қоса алғанда, буманы білдіретін шағын JSON файлы. Мысалы, 5 мегабайттық mariadb-сервер ядролық бумасы үшін хэш-пакет өлшемі тек 6 килобайтты құрайды. Шамамен мың есе аз.

Депликация — қайталанатын файлдарсыз мұрағатты құру (егер дедупликатор бастапқы буманы қай жерден жүктеп алуға болатынын білсе, ол мұрағаттағы көшірмелерді азайтады).

Қаптама

Буып-түю кезінде буып-түйіп жатқан каталогтағы барлық файлдар сканерленеді, олардың хэш-сомалары есептеледі және егер сома белгілі HashPackages бірінде табылса, онда файл туралы метадеректер (аты, хэш, кіру құқығы және т.б.) сақталады. .hashget-restore.json арнайы файлында, ол да мұрағатқа қосылады.

Қарапайым жағдайда, қаптаманың өзі гудронға қарағанда күрделі емес көрінеді:

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

Қаптамадан шығару

Қаптаманы ашу екі кезеңде жүзеге асырылады. Алдымен әдеттегі гудронды орау:

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

содан кейін желіден қалпына келтіріңіз:

hashget -u /path/to/data

Қалпына келтіру кезінде hashget .hashget-restore.json файлын оқиды, қажетті бумаларды жүктеп алады, оларды қаптамадан шығарады және қажетті ие/топ/рұқсаттармен қажетті жолдарға орната отырып, қажетті файлдарды шығарып алады.

Неғұрлым қиын нәрселер

Жоғарыда сипатталған нәрсе «оны шайыр сияқты қалайтындар үшін, бірақ менің Debian-ды 4 мегабайтқа жинақтау үшін» жеткілікті. Кейінірек күрделі нәрселерді қарастырайық.

Индекстеу

Егер хэшгетте бірде-бір HashPackage жоқ болса, онда ол жай ғана ештеңені қайталай алмайды.

Сондай-ақ, HashPackage-ті қолмен жасауға болады (жай: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my), бірақ ыңғайлырақ жолы бар.

Қажетті хэш-пакетті алу үшін кезең бар индекстеу (ол командамен автоматты түрде орындалады --pack) Және эвристика. Индекстеу кезінде hashget табылған әрбір файлды оны қызықтыратын барлық қолжетімді эвристикаға «береді». Содан кейін эвристика HashPackage жасау үшін кез келген буманы индекстей алады.

Мысалы, Debian эвристикасы /var/lib/dpkg/status файлын жақсы көреді және орнатылған debian бумаларын анықтайды, ал егер олар индекстелмеген болса (олар үшін HashPackage жасалған жоқ), жүктеп алып, индекстейді. Нәтиже – өте жақсы әсер – hashget әрқашан Debian операциялық жүйелерінің соңғы пакеттері болса да тиімді қайталанатын болады.

Кеңес файлдары

Егер желіңіз кейбір меншікті пакеттеріңізді немесе хэшгет эвристикасына қосылмаған жалпыға ортақ буманы пайдаланса, оған қарапайым hashget-hint.json анықтама файлын келесідей қосуға болады:

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

Әрі қарай, мұрағат жасалған сайын бума индекстеледі (егер ол бұрын болмаған болса) және бума файлдары мұрағаттан қайталанады. Ешқандай бағдарламалау қажет емес, барлығын vim-тен жасауға және әрбір сақтық көшірмеде сақтауға болады. Хэш сомасы тәсілінің арқасында пакеттегі кейбір файлдар жергілікті түрде өзгертілсе (мысалы, конфигурация файлы өзгертілсе), өзгертілген файлдар мұрағатта «сол қалпында» сақталады және қысқартылмайтынын ескеріңіз.

Жеке пакеттеріңіздің кейбірі кезеңді түрде жаңартылса, бірақ өзгерістер онша үлкен болмаса, тек негізгі нұсқалар үшін кеңес бере аласыз. Мысалы, 1.0 нұсқасында олар mypackage-1.0.tar.gz сілтемесін көрсетті және ол толығымен дедупликацияланады, содан кейін олар 1.1 нұсқасын шығарды, ол сәл өзгеше, бірақ кеңес жаңартылмады. Бәрі жақсы. Тек 1.0 нұсқасына сәйкес келетін (қалпына келтіруге болатын) файлдар қайталанбайды.

Анықтама файлын өңдейтін эвристика эвристика қалай жұмыс істейтінінің ішкі механизмін түсінудің жақсы үлгісі болып табылады. Ол тек hashget-hint.json файлдарын (немесе нүктесі бар .hashget-hint.json) өңдейді және қалғандарының барлығын елемейді. Бұл файлдан ол URL бумасының қайсысы индекстелетінін анықтайды және hashget оны индекстейді (егер ол әлі жасалмаған болса)

HashServer

Сақтық көшірмелерді жасау кезінде толық индекстеуді орындау өте көп еңбекті қажет етеді. Ол үшін әрбір буманы жүктеп алып, оны ораудан шығарып, индекстеу керек. Сондықтан hashget схемасын пайдаланады HashServer. Орнатылған Debian бумасы анықталғанда, егер ол жергілікті HashPackage ішінде табылмаса, алдымен HashPackage-ді хэш-серверінен жай ғана жүктеп алуға әрекет жасалады. Бұл жұмыс істемесе ғана, hashget өзі пакетті жүктеп алады және хэштейді (және оны хэшсерверге жүктейді, осылайша хэшсервер оны болашақта қамтамасыз етеді).

HashServer схеманың қосымша элементі болып табылады, маңызды емес, ол тек репозиторийлерге жүктемені жылдамдату және азайту үшін қызмет етеді. Оңай өшірілген (міндетті емес --hashserver параметрлерсіз). Сонымен қатар, сіз оңай аласыз өзіңіздің хэшсерверіңізді жасаңыз.

Қосымша және дифференциалды резервтік көшірмелер, жоспарланған ескіру

хэшгет диаграмманы жасауды өте жеңілдетеді қосымша және дифференциалды резервтік көшірмелер. Неліктен сақтық көшірменің өзін (барлық бірегей файлдарымызбен) индекстемейміз? Бір команда --submit және сіз бітірдіңіз! Hashget жасайтын келесі сақтық көшірме осы мұрағаттағы файлдарды қамтымайды.

Бірақ бұл өте жақсы әдіс емес, өйткені қалпына келтіру кезінде біз бүкіл тарихтағы барлық хэшттердің сақтық көшірмелерін (егер әрқайсысында кем дегенде бір бірегей файл болса) алып тастауға тура келетіні көрінуі мүмкін. Бұл үшін механизм бар резервтік көшірмелердің жоспарланған ескіруі. Индекстеу кезінде HashPackage жарамдылық мерзімін көрсетуге болады --expires 2019-06-01, және осы күннен кейін (00:00 бастап) ол пайдаланылмайды. Бұл күннен кейін мұрағаттың өзін жою мүмкін емес (бірақ хэшгет қазіргі уақытта немесе кез келген күнде бұзылған/шіріген барлық сақтық көшірмелердің URL мекенжайларын ыңғайлы көрсете алады).

Мысалы, егер біз 1-ші күні толық сақтық көшірме жасасақ және оны айдың соңына дейін өмір бойы индекстесек, біз дифференциалды резервтік схеманы аламыз.

Жаңа резервтік көшірмелерді дәл осылай индекстесек, қосымша сақтық көшірмелердің схемасы болады.

Дәстүрлі схемалардан айырмашылығы, hashget бірнеше негізгі көздерді пайдалануға мүмкіндік береді. Сақтық көшірме алдыңғы сақтық көшірмелердегі файлдарды (бар болса) және жалпы файлдарды (не жүктеп алуға болады) азайту арқылы да азаяды.

Егер қандай да бір себептермен біз Debian ресурстарының сенімділігіне сенбейтін болсақ (https://snapshot.debian.org/) немесе басқа таратуды пайдаланса, біз жай ғана бір рет барлық пакеттермен толық сақтық көшірме жасай аламыз, содан кейін оған сене аламыз (эвристиканы өшіру арқылы). Енді, егер дистрибутивтердің барлық серверлері біз үшін қолжетімсіз болып шықса (кәдесыйлық интернетте немесе зомби апокалипсисі кезінде), бірақ сақтық көшірмелеріміз дұрыс болса, біз тек бұрынғы сақтық көшірмелерімізге негізделген кез келген қысқа дифференциалды сақтық көшірмеден қалпына келтіре аламыз. .

Hashget тек сіздің қалауыңыз бойынша сенімді қалпына келтіру көздеріне сүйенеді. Сенімді деп санайтындар пайдаланылады.

FilePool және мұздық

Тетік FilePool бумаларды жүктеп алу үшін сыртқы серверлерге үнемі хабарласпауға мүмкіндік береді, бірақ жергілікті каталогтан немесе корпоративтік серверден пакеттерді пайдалануға мүмкіндік береді, мысалы:

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

немесе

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

Жергілікті каталогта пул жасау үшін сізге каталог жасап, оған файлдарды лақтыру керек, hashget өзі хэштердің көмегімен өзіне қажет нәрсені табады. Пулға HTTP арқылы қол жетімді ету үшін арнайы жолмен символдық сілтемелер жасау керек, бұл бір пәрменмен орындалады (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). HTTP FilePool өзі статикалық файлдар, сондықтан оған кез келген қарапайым веб-сервер қызмет ете алады, сервердегі жүктеме нөлге жуық.

FilePool арқасында сіз http(лар) ресурстарын негізгі ресурстар ретінде ғана емес, сонымен қатар пайдалана аласыз Мысалыға, Amazon мұздығы.

Сақтық көшірмені мұздыққа жүктегеннен кейін біз оның Жүктеп салу идентификаторын аламыз және оны URL мекенжайы ретінде пайдаланамыз. Мысалы:

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

Енді жаңа (дифференциалды) сақтық көшірмелер осы сақтық көшірмеге негізделеді және қысқа болады. Дифф сақтық көшірме орамынан шығарылғаннан кейін оның қандай ресурстарға негізделгенін көре аламыз:

hashget --info /tmp/unpacked/ list

және Glacier-тен бассейнге осы файлдардың барлығын жүктеп алу үшін қабық сценарийін пайдаланыңыз және әдеттегі қалпына келтіруді іске қосыңыз: hashget -u /tmp/unpacked —pool /tmp/pool

Ойын шамға тұрарлық па?

Ең қарапайым жағдайда, сіз сақтық көшірмелер үшін аз төлейсіз (егер сіз оларды ақша үшін бұлтта сақтасаңыз). Мүмкін көп, әлдеқайда аз.

Бірақ бұл жалғыз нәрсе емес. Сан сапаға айналады. Мұны сақтық көшірме схемасына жоғары сапалы жаңартуды алу үшін пайдалануға болады. Мысалы, қазір сақтық көшірмелеріміз қысқарғандықтан, біз ай сайынғы емес, күнделікті сақтық көшірме жасай аламыз. Оларды бұрынғыдай алты ай емес, 5 жыл сақтаңыз. Бұрын сіз оны баяу, бірақ арзан «суық» қоймада (Мұздық) сақтадыңыз, енді оны ыстық қоймада сақтай аласыз, ол жерден сақтық көшірмені әрқашан жылдам жүктеп алып, оны бір күнде емес, бірнеше минут ішінде қалпына келтіре аласыз.

Сақтық көшірме сақтаудың сенімділігін арттыруға болады. Егер біз қазір оларды бір сақтау орнында сақтасақ, резервтік көшірмелердің көлемін азайту арқылы 2-3 қоймаға сақтап, біреуі зақымданған жағдайда ауыртпалықсыз өмір сүре аламыз.

Қолдануды қалай бастауға болады?

gitlab бетіне өтіңіз https://gitlab.com/yaroslaff/hashget, бір пәрменмен орнату (pip3 install hashget[plugins]) және жай ғана жылдам бастауды оқып, орындаңыз. Менің ойымша, барлық қарапайым нәрселерді жасауға 10-15 минут кетеді. Содан кейін виртуалды машиналарды қысуға тырысуға болады, қысуды күшейту үшін қажет болса, анықтамалық файлдарды жасауға, бассейндермен, жергілікті хэш дерекқорымен және сізді қызықтыратын болса, хэш-сервермен ойнауға және келесі күні қосымша сақтық көшірменің өлшемін көруге болады. кешегі күннің үстінде болады.

Ақпарат көзі: www.habr.com

пікір қалдыру