Recykling woluminów w Baculi cz.2

14 listopad 2009 autor: Marcin Haba (gani)

Druga część artykułu o ponownym wykorzystaniu woluminów. Zawiera teorię recyklingu woluminów oraz omawia związane z tym mechanizmy.

W przedstawianiu zasad rządzących recyklingiem woluminów zacznę od zaprezentowania statusów woluminów. Nie jest to temat zarezerwowany wyłącznie dla recyklingu, ale mający duże znaczenie dla przebiegu poszczególnych jego etapów.

Statusy woluminów

Statusem woluminu Baculi określa się zapisany w bazie danych bieżący stan woluminu nadający mu charakterystyczne dla każdego statusu cechy. W terminologii Baculi nazwany jest VolStatus i może ulegać zmianie podczas zdarzeń w pracy z Baculą lub poprzez ręcznie ustawienie przez użytkownika. Status woluminu, choć znajduje się jedynie w bazie danych, to odnosi się do fizycznego woluminu i może określać np. stan zapisanych na nim danych czy też dostępność woluminu (lub jej brak).

Poniżej znajduje się lista dostępnych w Baculi statusów woluminów.

Jak działa recykling

Gdy wolumin zostaje poddany procesowi recyklingu, może zostać ponownie użyty. W momencie gdy Bacula użyje takiego woluminu, poprzednie dane na nim zawarte zostaną utracone. W sytuacji, gdy jest to wolumin plikowy, zostanie on przycięty do rozmiaru, jaki miał przed pierwszym użyciem. W sytuacji, gdy woluminem jest taśma magnetyczna, zostanie nadpisana od początku. Po tej operacji wolumin otrzyma status gotowości do zapisu (status Append).

Podstawowa konfiguracja recyklingu zawiera się w definicji trzech dyrektyw zapisywanych w zasobie puli taśm (zasób Pool) w pliku konfiguracyjnym Zarządcy (ang. Director) bacula-dir.conf. Dyrektywy te to:

Recycle = yes/no
AutoPrune = yes/no
VolumeRetention = czas

Ich definicja przedstawia się następująco:

Recycle = yes/no (domyślnie yes) - dyrektywa określa zdolność woluminu do recyklingu. Przy załączonej dyrektywie (Recycle = yes) każdy nowo tworzony w puli taśm wolumin będzie mógł brać udział w procesie recyklingu. Jeśli dyrektywa jest wyłączona (Recycle = no) to nowo tworzone woluminy nie będą brały udziału w recyklingu. Dyrektywa Recycle w terminologii Baculi określana jest jako flaga recyklingu nakładana na wolumin. Można zobaczyć jej ustawienie np. poprzez komendę listującą woluminy w pulach (komenda konsoli Baculi list media), gdzie wartość 1 oznacza, że flaga jest nałożona, wartość 0 oznacza wyłączenie flagi i tym samym wykluczenie woluminu z procesu recyklingu.

Volume Retention (domyślnie 365 dni) - w przełożeniu na język polski dyrektywę tę można nazwać czasem zachowania danych dla woluminu, który może być podawany w sekundach, minutach, godzinach, dniach, tygodniach, miesiącach, kwartałach lub latach. Określa ona okres czasu, podczas którego dane zostaną zachowane na woluminie. Zliczany jest od czasu ostatniego zapisu na wolumin, który to zapis spowodował, że wolumin został oznaczony statusem Full lub Used. Wolumin biorący udział w procesie recyklingu NIE będzie ponownie nadpisany do momentu upłynięcia czasu Volume Retention.

Warto wyjaśnić tutaj sytuację występowania statusów Full i Used. Pierwszy zostanie osiągnięty przez wolumin w sytuacji jego zapełnienia. Drugi natomiast pojawi się na woluminie wtedy, gdy zostanie osiągnięty któryś z dodatkowych limitów nałożonych na wolumin. Limity te są niczym innym jak dyrektywami zasobu Pool. Dzięki nim użytkownik ma możliwość uruchomienia zliczania czasu Volume Retention przed zapełnieniem woluminu. Dyrektywy określające te limity to:

Use Volume Once = yes/no - limit, który pozwala na zapisanie na woluminie tylko jednego backupu. Po wykonaniu backupu wolumin zostanie oznaczony statusem Used, który uniemożliwi dalsze zapisywanie woluminu. Dyrektywa jest równoważna dyrektywie Maximum Volume Jobs = 1.

Maximum Volume Jobs = liczba backupów - dzięki temu limitowi, użytkownik ma możliwość określenia maksymalnej ilości backupów zapisanych na woluminie. Po osiągnięciu tego limitu, wolumin zostanie oznaczony statusem Used.

Volume Use Duration = czas - limit określający okres czasu, podczas którego będzie możliwy zapis na wolumin. Liczony jest od czasu wykonania pierwszego backupu na woluminie. Status woluminu Append (umożliwiający zapis) będzie utrzymywał się do momentu wygaśnięcia czasu określonego w omawianej dyrektywie, po czym zostanie zmieniony w status Used.

Maximum Volume Files = liczba znaczników EOF (domyślnie 0 czyli bez limitu) - sugerując się nazwą dyrektywy, można przypuszczać, że jest to limit określający maksymalną liczbę plików, jakie można zapisać na woluminie. Nie jest to jednak prawdą. Limit ten określa maksymalną liczbę znaczników EOF (End Of File) jaka może być zapisana na woluminie. Dla urządzeń operujących na woluminach plikowych znacznik EOF zapisywany jest co każde 4GB zapisanych danych. Dla urządzeń napędów taśm magnetycznych Bacula zapisuje znacznik EOF co 1GB, lub gdy backup jest mniejszy niż 1GB to znacznik EOF zapisywany jest na woluminie po każdym takim backupie. Po osiągnięciu tego limitu EOF wolumin zostanie oznaczony statusem Used i tym samym będzie niezdolny do kolejnych zapisów.

Podsumowując przedstawioną do tej pory teorię związaną z recyklingiem woluminów, wolumin zostanie poddany procesowi recyklingu, gdy:

Uwaga na właściwości woluminów

W tym momencie chciałbym wyjaśnić kwestię nadawania woluminom właściwości recyklingu określonych przez dyrektywy Recycle i Volume Retention. Jak wspomniałem, dyrektywy te definiowane są dla zasobu puli taśm (zasób Pool), której woluminy mają być poddane procesowi recyklingu. Gdy użytkownik posiada już woluminy w puli taśm i dopisuje do zasobu tej puli dyrektywy recyklingu, będą one obowiązywać dla nowo tworzonych woluminów w tej puli, nie będą natomiast obowiązywać dla istniejących już woluminów. Dzieje się tak dlatego, że dyrektywy zasobu Pool są niejako szablonem, z którego dziedziczą nowo tworzone woluminy i samo ich zdefiniowanie w żaden sposób nie działa na istniejące już woluminy. Gdyby użytkownik zachciał nadać nowo wprowadzone dyrektywy zasobu Pool już istniejącym woluminom, powinien posłużyć się komendą w konsoli Baculi: update Volume from Pool lub update All Volumes from Pool, w zależności od tego czy chce nadać właściwości nowo wprowadzonych dyrektyw jednemu wybranemu woluminowi czy też wszystkim woluminom w puli taśm. Komendy te nadpisują takie właściwości woluminów jak Recycle, RecyclePool, VolRetention, VolUseDuration, MaxVolJobs, MaxVolFiles oraz MaxVolBytes.

Jak zliczany jest czas Volume Retention

Do tej pory w odniesieniu do czasu Volume Retention używałem przymiotnika "zliczany". Sugeruje to jakoby Bacula dysponowała swego rodzaju zegarem odliczający czas Volume Retention. Nic bardziej mylnego. W rzeczywistości w sytuacji, gdy Bacula będzie potrzebować użycia woluminu i nie znajdzie w puli taśm żadnego woluminu ze statusem Append, wtedy sprawdzi, czy w tej puli są woluminy ze statusem Full lub Used. Jeśli znajdzie takie woluminy, to sprawdzi czy od chwili oznaczenia tych taśm statusem Full lub Used, upłynął już czas Volume Retention i jeśli tak, to Bacula wybierze do ponownego użycia wolumin z najniższym MediaID (pierwsza kolumna tabeli uzyskanej przy pomocy komendy list media wydanej w konsoli Baculi) i wykona na nim operację prune.

Co to jest prune

Jako jeden z etapów recyklingu, prune jest pierwszym etapem, który fizycznie ingeruje w zapisane dane. Operacja prune polega na wyczyszczeniu z bazy danych wszystkich danych backupu zapisanych w bazie danych. Po tej operacji wolumin zostaje oznaczony statusem Purged. Ważnym jest zrozumienie, że prune operuje TYLKO na rekordach bazy danych (usuwa je), a nie na danych zapisanych na woluminie. Innymi słowy, po operacji prune dane na woluminie pozostają nienaruszone. Status Purged jest również informacją dla Baculi, że wolumin jest gotowy do poddania go ostatniemu procesowi recyklingu, czyli ponownemu użyciu woluminu.

Prune może przebiegać w dwóch wariantach: automatycznym i manualnym. Ustawienie automatycznego prune oznacza oddanie Baculi decyzji o tym, kiedy i na jakim woluminie ma wykonać prune. Jest to powszechna konfiguracja zwalniająca użytkownika z ręcznej interwencji, na wypadek potrzeby wyczyszczenia rekordów danych woluminu z bazy danych.

Do ustawienia automatycznego prune służy poniższa dyrektywa definiowana  dla zasobu Pool.

AutoPrune = yes/no

Gdy jednak użytkownik zdecyduje się sam wywoływać operację prune, to ma do  dyspozycji dwie komendy dostępne w konsoli Baculi:

prune - usuwa przedawnione rekordy z bazy danych dla woluminu z zachowaniem czasu Volume Retention. Polega to na wysłaniu zapytania o wolumin do Baculi, która stwierdzi, czy wolumin jest już gotowy do operacji prune. Jeśli czas Volume Retention dla takiego woluminu jeszcze nie wygasł, to nie nastąpi prune.

purge - usuwa przedawnione rekordy z bazy danych dla woluminu nie respektując czasu Volume Retention. Innymi słowy, każde wywołanie komendy purge wyczyści rekordy w bazie danych. Trzeba być bardzo ostrożnym przy używaniu komendy purge, gdyż przy jej pomocy można przeprowadzić prune nawet dla woluminów ze statusem Append.

Automatyczny recykling woluminów

Jak powiedziałem przed chwilą, do uruchomienia lub wyłączenia automatycznego recyklingu woluminów służy dyrektywa AutoPrune. Ustawienie na yes włącza automatyczny recykling, ustawienie na no wyłącza go. Podstawowa konfiguracja recyklingu woluminów w wersji zautomatyzowanej wymaga użycia trzech dyrektyw.

Recycle = yes 
AutoPrune = yes
VolumeRetention = czas

Dyrektywy te są powiązane ze sobą i samo poznanie ich opisu może nie wystarczyć do poprawnej konfiguracji recyklingu. Pora więc spojrzeć na ich wzajemne zależności.

Recycle - jeśli dyrektywa ustawiona jest na no dla woluminu, to wolumin nie będzie brany pod uwagę w procesie recyklingu, nawet jeśli jego rekordy w bazie danych zostaną wyczyszczone, a wolumin będzie miał status Purged. Jeśli dyrektywa ustawiona jest na yes dla woluminu, to wolumin będzie poddany procesowi recyklingu i jego dane zostaną nadpisane od początku, gdy wygaśnie określony dla niego czas Volume Retention, a w puli taśm nie będzie żadnego woluminu ze statusem Append.

Volume Retention - jeśli wolumin posiada ustawioną flagę Recycle oraz ustawiony jest automatyczny recykling woluminów (AutoPrune = yes) i Bacula zażąda nowego woluminu, a w puli taśm nie ma żadnego woluminu ze statusem Append oraz czas Volume Retention wygasł, to Bacula wykona na woluminie prune i następnie nadpisze wolumin od początku.

AutoPrune - jeśli ustawione jest na no, to w sytuacji, gdy Bacula zgłosi żądanie nowego woluminu, a w puli taśm nie będzie żadnego woluminu ze statusem Append, to proces backupu zostanie zatrzymany, a użytkownik otrzyma komunikat z informacją o potrzebie dołożenia nowego woluminu. Żaden pruning w tej sytuacji nie zostanie wykonany. Gdy dyrektywa jest ustawiona na yes to w tej samej opisanej sytuacji Bacula będzie sprawdzać, czy któryś z woluminów w puli taśm jest już gotowy do wykonania prune (Volume Retention dla niego wygasł) i jeśli znajdzie taki wolumin, to oczyści jego rekordy w bazie danych a następnie użyje go jako nowy wolumin.

Inne dyrektywy recyklingu

Oprócz recyklingu woluminów Bacula udostępnia również możliwość recyklingu backupów (dyrektywa Job Retention) oraz plików (dyrektywa File Retention). Dyrektywy te, choć dotyczą również recyklingu, nie zostaną tutaj opisane. To temat na osobny artykuł, lecz już teraz warto wiedzieć o ich istnieniu.

Bacula udostępnia kilka dodatkowych dyrektyw związanych z recyklingiem woluminów definiowanych w zasobie puli taśm (Pool). Poniżej przedstawiam ich definicję.

Recycle Oldest Volume = yes/no (domyślnie no) - dyrektywa mówi Baculi, aby w sytuacji gdy potrzebny jest nowy wolumin, poszukała najstarszego używanego woluminu w puli taśm i podjęła próbę wykonania operacji prune. Jeśli czas Volume Retention wygasł, to prune powiedzie się i Bacula będzie mogła użyć tego woluminu.

Recycle Current Volume = yes/no (domyślnie no) - dyrektywa działa bardzo podobnie do opisanej powyżej dyrektywy Recycle Oldest Volume, z tą różnicą, że zamiast najstarszego woluminu sprawdzi bieżący wolumin pod kątem możliwości przeprowadzenia operacji prune i w następstwie ponownego użycia.

Purge Oldest Volume = yes/no (domyślnie no) - dyrektywa mówi Baculi, aby w sytuacji, gdy potrzebny jest nowy wolumin, poszukała najstarszego używanego woluminu w puli taśm i wykonała na nim operację purge. Należy być szczególnie ostrożnym przy używaniu tej dyrektywy, gdyż jej działanie nie respektuje czasu Volume Retention.

Recycle Pool = nazwa puli taśm - dyrektywa definiuje pulę taśm, do której zostanie przeniesiony wolumin, który zakończy cykl procesu recyklingu i zostanie ponownie użyty (zrecyklingowany). Dyrektywa może okazać się bardzo przydatna dla użytkowników korzystających z puli taśm Scratch. Gdy Recycle Pool wskazuje na pulę taśm Scratch, to po wykonaniu się recyklingu na woluminie, zostanie on przeniesiony do puli taśm Scratch, skąd na żądanie Baculi może zostać dobrany do innej puli taśm.

Ponowne użycie woluminu

Ostatnim etapem procesu recyklingu jest oznaczenie woluminu statusem Recycled. W odróżnieniu od etapu prune, który przygotowuje wolumin do ponownego użycia poprzez oczyszczenie rekordów backupów w bazie danych, to etap Recycled informuje Baculę o tym, że został przeprowadzony etap prune i wolumin jest gotowy do nadpisania danych.

Poniższe dwie ilustracje obrazują drogę jaką przechodzi wolumin w procesie recyklingu.

 

Cykl życia woluminu w procesie recyklingu woluminów - przykład z zapełnieniem woluminu

 

Cykl życia woluminu w procesie recyklingu woluminów - przykład z limitem woluminu

Interesującym może wydać się fakt, że Bacula zawsze będzie zpisywać dane na woluminach ze statusem Append przed ponownym użyciem woluminu, nawet jeśli wolumin posiada status Purged. Ma to na celu zatrzymanie danych na woluminie tak długo, jak to tylko możliwe.

Recykling a urządzenie zmieniarki taśm

Użytkownicy wykorzystujący w pracy z Baculą zmieniarkę taśm znają zapewne zagadnienie flagi InChanger. Flaga ta określa, które taśmy znajdują się w magazynkach zmieniarki, a które znajdują się poza urządzeniem.

W procesie recyklingu brane pod uwagę są tylko taśmy z ustawioną falgą InChanger.  Oznacza to, że operacja prune będzie wykonywać się tylko dla taśm znajdujących się w urządzeniu zmieniarki.

Ustawienie flagi InChanger leży w zakresie użytkownika, który po każdej wymianie taśm powinien wykonać skanowanie slotów, które automatycznie ustawi flagę InChanger dla taśm znajdujących się w urządzeniu oraz ściągnie flagę dla taśm wyjętych z urządzenia.