Zmniejsz liczbę kopii zapasowych o 99.5% dzięki hashgetowi

hashget - jest darmowy i ma otwarte oprogramowanie deduplikator to narzędzie podobne do archiwizatora, które pozwala znacznie zmniejszyć rozmiar kopii zapasowych, a także organizować przyrostowe i różnicowe schematy tworzenia kopii zapasowych i nie tylko.

To jest artykuł przeglądowy opisujący funkcje. Rzeczywiste użycie hashgetu (całkiem proste) opisano w README projekt i dokumentacja wiki.

Porównanie

Zgodnie z prawem gatunku zacznę od razu od intrygi – porównania wyników:

Próbka danych
rozmiar po rozpakowaniu
.tar.gz
hashget.tar.gz

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

Jądro Linux 5.0.4
934 Mb
161 Mb (20%)
4.7 Mb ( 0.5% )

Debian 9 (LAMPA) LXC maszyna wirtualna
724 Mb
165 Mb (23%)
4.1 Mb ( 0.5% )

Podstawowe informacje na temat tego, czym powinna być idealna i skuteczna kopia zapasowa

Za każdym razem, gdy tworzyłem kopię zapasową świeżo utworzonej maszyny wirtualnej, prześladowało mnie poczucie, że robię coś złego. Dlaczego otrzymuję pokaźną kopię zapasową systemu, gdzie moją bezcenną, niezniszczalną twórczością jest jednowierszowy plik Index.html z tekstem „Witaj, świecie”?

Dlaczego w mojej kopii zapasowej znajduje się plik /usr/sbin/mysqld o rozmiarze 16 MB? Czy to naprawdę możliwe, że na tym świecie mam zaszczyt przechowywać te ważne akta, a jeśli mi się nie uda, zostaną one utracone dla ludzkości? Najprawdopodobniej nie. Jest przechowywany na wysoce niezawodnych serwerach Debiana (których niezawodność i czas pracy nie może być porównywalny z tym, co mogę zapewnić), a także w kopiach zapasowych (milionów takich serwerów) innych administratorów. Czy naprawdę musimy utworzyć ponad 10 000 000 pierwszej kopii tego ważnego pliku, aby poprawić niezawodność?

Ogólnie hashget i rozwiązuje ten problem. Po spakowaniu tworzy bardzo małą kopię zapasową. Podczas rozpakowywania - całkowicie rozpakowany system, podobny do tego, jaki byłby, gdyby tar -c / tar -x. (Innymi słowy, jest to opakowanie bezstratne)

Jak działa hashget

hashget ma koncepcje Package i HashPackage, za ich pomocą wykonuje deduplikację.

Pakiet (plastikowa torba). Plik (zwykle archiwum .deb lub .tar.gz), który można bezpiecznie pobrać z Internetu i z którego można uzyskać jeden lub więcej plików.

Pakiet Hash — mały plik JSON reprezentujący pakiet, zawierający adres URL pakietu i sumę skrótów (sha256) znajdujących się w nim plików. Na przykład dla 5-megabajtowego pakietu mariadb-server-core rozmiar pakietu hash wynosi tylko 6 kilobajtów. Około tysiąc razy mniej.

Deduplikacja — utworzenie archiwum bez duplikatów plików (jeżeli deduplikator wie, gdzie można pobrać oryginalny pakiet, redukuje duplikaty z archiwum).

Opakowanie

Podczas pakowania skanowane są wszystkie pliki z pakowanego katalogu, obliczana jest ich suma skrótów, a jeśli suma zostanie znaleziona w jednym ze znanych HashPackages, to zapisywane są metadane dotyczące pliku (nazwa, skrót, prawa dostępu itp.) w specjalnym pliku .hashget-restore.json, który również zostanie uwzględniony w archiwum.

W najprostszym przypadku samo opakowanie nie wygląda na bardziej skomplikowane niż smoła:

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

Rozpakowanie

Rozpakowywanie odbywa się w dwóch etapach. Najpierw zwykłe rozpakowywanie tar:

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

następnie przywróć z sieci:

hashget -u /path/to/data

Podczas przywracania hashget odczytuje plik .hashget-restore.json, pobiera niezbędne pakiety, rozpakowuje je i wyodrębnia niezbędne pliki, instalując je w wymaganych ścieżkach, z wymaganymi właścicielami/grupami/uprawnieniami.

Trudniejsze rzeczy

To, co opisano powyżej, wystarczy już tym, którzy „chcą tego jak tar, ale spakować mojego Debiana do 4 megabajtów”. Przyjrzyjmy się bardziej złożonym sprawom później.

Indeksowanie

Gdyby hashget w ogóle nie miał ani jednego HashPackage, to po prostu nie byłby w stanie niczego deduplikować.

Możesz także utworzyć HashPackage ręcznie (po prostu: hashget --submit https://wordpress.org/wordpress-5.1.1.zip -p my), ale jest wygodniejszy sposób.

Aby uzyskać niezbędny pakiet hash, następuje etap indeksowanie (jest to automatycznie wykonywane za pomocą polecenia --pack) I heurystyka. Podczas indeksowania hashget „zasila” każdy znaleziony plik wszystkimi dostępnymi heurystykami, które są nim zainteresowane. Heurystyka może następnie zindeksować dowolny pakiet, aby utworzyć HashPackage.

Na przykład heurystyka Debiana uwielbia plik /var/lib/dpkg/status i wykrywa zainstalowane pakiety Debiana, a jeśli nie są one indeksowane (nie utworzono dla nich żadnego pakietu HashPackage), pobiera je i indeksuje. Rezultatem jest bardzo fajny efekt - hashget zawsze skutecznie deduplikuje systemy operacyjne Debiana, nawet jeśli mają one najnowsze pakiety.

Pliki podpowiedzi

Jeśli Twoja sieć korzysta z niektórych pakietów zastrzeżonych lub pakietu publicznego, który nie jest uwzględniony w heurystyce hashget, możesz dodać do niej prosty plik podpowiedzi hashget-hint.json w następujący sposób:

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

Następnie za każdym razem, gdy tworzone jest archiwum, pakiet zostanie zindeksowany (jeśli nie był wcześniej) i pliki pakietu zostaną usunięte z archiwum. Nie jest potrzebne żadne programowanie, wszystko można zrobić z vima i zapisać w każdej kopii zapasowej. Należy pamiętać, że dzięki podejściu sumy skrótów, jeśli niektóre pliki z pakietu zostaną zmienione lokalnie (na przykład plik konfiguracyjny zostanie zmieniony), zmienione pliki zostaną zapisane w archiwum „tak jak są” i nie zostaną obcięte.

Jeśli niektóre z Twoich pakietów są okresowo aktualizowane, ale zmiany nie są zbyt duże, możesz podpowiedzieć tylko dla wersji głównych. Na przykład w wersji 1.0 dodali podpowiedź wskazującą na mypackage-1.0.tar.gz i zostanie ona całkowicie zdeduplikowana, następnie wypuścili wersję 1.1, która jest nieco inna, ale wskazówka nie została zaktualizowana. W porządku. Deduplikowane są tylko pliki zgodne z wersją 1.0 (można je przywrócić).

Heurystyka przetwarzająca plik podpowiedzi jest dobrym przykładem zrozumienia wewnętrznego mechanizmu działania heurystyki. Przetwarza tylko pliki hashget-hint.json (lub .hashget-hint.json z kropką) i ignoruje wszystkie inne. Na podstawie tego pliku określa, który adres URL pakietu powinien zostać zaindeksowany i hashget go indeksuje (jeśli jeszcze tego nie zrobił)

Serwer Hash

Pełne indeksowanie podczas tworzenia kopii zapasowych byłoby dość pracochłonne. Aby to zrobić, musisz pobrać każdy pakiet, rozpakować go i zaindeksować. Dlatego hashget używa schematu z Serwer Hash. Po wykryciu zainstalowanego pakietu Debiana, jeśli nie można go znaleźć w lokalnym pakiecie HashPackage, najpierw podejmowana jest próba prostego pobrania pakietu HashPackage z serwera mieszającego. I tylko jeśli to nie zadziała, sam hashget pobiera i miesza pakiet (i przesyła go do hashserver, aby hashserver udostępnił go w przyszłości).

HashServer jest opcjonalnym elementem schematu, nie krytycznym, służy jedynie do przyspieszenia i zmniejszenia obciążenia repozytoriów. Łatwo wyłączone (opcjonalnie --hashserver bez parametrów). Ponadto możesz łatwo stwórz własny serwer haszujący.

Przyrostowe i różnicowe kopie zapasowe, planowane starzenie się

hashget bardzo ułatwia wykonanie diagramu przyrostowe i różnicowe kopie zapasowe. Dlaczego nie indeksujemy samej naszej kopii zapasowej (ze wszystkimi naszymi unikalnymi plikami)? Jedna drużyna --submit i jesteś skończony! Następna kopia zapasowa utworzona przez hashget nie będzie zawierać plików z tego archiwum.

Nie jest to jednak zbyt dobre podejście, gdyż może się okazać, że przy przywracaniu będziemy musieli wyciągnąć wszystkie kopie zapasowe hashgetów z całej historii (o ile każda zawiera przynajmniej jeden unikalny plik). Istnieje na to mechanizm planowane starzenie się kopii zapasowych. Podczas indeksowania możesz określić datę wygaśnięcia HashPackage --expires 2019-06-01, a po tym terminie (od godz. 00:00) nie będzie już wykorzystywany. Samo archiwum nie może zostać usunięte po tej dacie (chociaż hashget może wygodnie wyświetlać adresy URL wszystkich kopii zapasowych, które są/będą zepsute w danej chwili lub w dowolnym dniu).

Na przykład, jeśli pierwszego dnia wykonamy pełną kopię zapasową i zaindeksujemy ją z czasem życia do końca miesiąca, otrzymamy różnicowy schemat tworzenia kopii zapasowych.

Jeżeli w ten sam sposób indeksujemy nowe kopie zapasowe, powstanie schemat przyrostowych kopii zapasowych.

W przeciwieństwie do tradycyjnych schematów, hashget umożliwia korzystanie z wielu źródeł. Kopia zapasowa zostanie zmniejszona zarówno poprzez redukcję plików z poprzednich kopii zapasowych (jeśli istnieją), jak i plików publicznych (które można pobrać).

Jeśli z jakiegoś powodu nie ufamy niezawodności zasobów Debiana (https://snapshot.debian.org/) lub korzysta z innej dystrybucji, możemy po prostu raz wykonać pełną kopię zapasową wszystkich pakietów i wtedy na niej polegać (poprzez wyłączenie heurystyki). Teraz, jeśli wszystkie serwery naszych dystrybucji okażą się dla nas niedostępne (w pamiątkowym Internecie lub podczas apokalipsy zombie), ale nasze kopie zapasowe są w porządku, możemy odzyskać dane z dowolnej kopii zapasowej z krótkim różnicowaniem, która opiera się tylko na naszych wcześniejszych kopiach zapasowych .

Hashget opiera się wyłącznie na zaufanych źródłach odzyskiwania według TWOJEGO uznania. Wykorzystane zostaną te, które uznasz za wiarygodne.

FilePool i lodowiec

mechanizm Pula plików pozwala nie kontaktować się ciągle z zewnętrznymi serwerami w celu pobrania pakietów, ale korzystać z pakietów z lokalnego katalogu lub serwera firmowego, na przykład:

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

lub

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

Aby utworzyć pulę w katalogu lokalnym, wystarczy utworzyć katalog i wrzucić do niego pliki, sam hashget znajdzie to, czego potrzebuje, korzystając z skrótów. Aby pula była dostępna poprzez HTTP należy w specjalny sposób utworzyć dowiązania symboliczne; robi się to za pomocą jednego polecenia (hashget-admin --build /var/www/html/hashdb/ --pool /tmp/pool). Sam HTTP FilePool to pliki statyczne, więc każdy prosty serwer WWW może go obsłużyć, obciążenie serwera jest prawie zerowe.

Dzięki FilePool możesz używać nie tylko zasobów http(s) jako zasobów bazowych, ale także np.,Lodowiec Amazonki.

Po przesłaniu kopii zapasowej na lodowiec otrzymujemy jej identyfikator przesyłania i używamy go jako adresu URL. Na przykład:

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

Teraz nowe (różnicowe) kopie zapasowe będą oparte na tej kopii zapasowej i będą krótsze. Po rozpakowaniu pliku diffbackup za pomocą programu tar możemy zobaczyć, z jakich zasobów korzysta:

hashget --info /tmp/unpacked/ list

i po prostu użyj skryptu powłoki, aby pobrać wszystkie te pliki z Glacier do puli i uruchom zwykłe odzyskiwanie: hashget -u /tmp/unpacked —pool /tmp/pool

Czy gra jest warta świeczki?

W najprostszym przypadku za kopie zapasowe zapłacisz po prostu mniej (jeśli za pieniądze będziesz je przechowywać gdzieś w chmurze). Może dużo, dużo mniej.

Ale to nie jedyna rzecz. Ilość zamienia się w jakość. Możesz to wykorzystać, aby uzyskać wysokiej jakości aktualizację schematu tworzenia kopii zapasowych. Na przykład, ponieważ nasze kopie zapasowe są teraz krótsze, możemy tworzyć kopie zapasowe nie co miesiąc, ale codziennie. Przechowuj je nie przez sześć miesięcy, jak poprzednio, ale przez 5 lat. Wcześniej przechowywałeś je w powolnym, ale tanim „zimnym” magazynie (Lodowiec), teraz możesz przechowywać go w gorącym magazynie, skąd zawsze możesz szybko pobrać kopię zapasową i przywrócić ją w ciągu kilku minut, a nie jednego dnia.

Możesz zwiększyć niezawodność przechowywania kopii zapasowych. Jeśli obecnie przechowujemy je w jednym magazynie, to zmniejszając wolumen kopii zapasowych, będziemy mogli przechowywać je w 2-3 magazynach i bezboleśnie przetrwać w przypadku uszkodzenia jednego z nich.

Jak spróbować i zacząć używać?

Przejdź do strony gitlab https://gitlab.com/yaroslaff/hashget, zainstaluj jednym poleceniem (pip3 install hashget[plugins]) i po prostu przeczytaj i wykonaj szybki start. Myślę, że wykonanie wszystkich prostych rzeczy zajmie 10-15 minut. Następnie możesz spróbować skompresować swoje maszyny wirtualne, w razie potrzeby utworzyć pliki podpowiedzi, aby wzmocnić kompresję, pobawić się pulami, lokalną bazą danych mieszających i serwerem mieszającym, jeśli jesteś zainteresowany, a następnego dnia zobaczyć, jaki jest rozmiar przyrostowej kopii zapasowej będzie na szczycie wczoraj.

Źródło: www.habr.com

Dodaj komentarz