Pokazywanie postów oznaczonych etykietą windows. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą windows. Pokaż wszystkie posty

sobota, 25 lutego 2012

Twarde fluszowanie buforów

Dawno nie było "twardego" wpisu...

Gdy tworzymy aplikację i kod zapisujący do pliku, zwykle traktujemy operację zapisu jako wykonaną gdy sterowanie w kodzie przejdzie do kolejnych instrukcji. Zazwyczaj to fałszywe poczucie bezpieczeństwa w niczym nie przeszkadza. Do czasu, gdy pojawi się sytuacja awaryjna: aplikacja, system operacyjny, dyski lub zasilanie padną.

Odkrywamy jednak operację typu (f)flush() i czujemy się lepiej, bufory mamy opróżnione. Bardzo miło, ale nasza sytuacja w razie awarii systemu nie jest wiele lepsza. Jedyne co osiągnęliśmy, to wypchnięcie danych z jednych buforów do drugich (OS). Dane nadal nie są utrwalone. Jeśli oprogramowanie zapisuje krytyczne dane, realizuje jakąś transakcję, to kiepsko to wygląda.

Aby je utrwalić na nośnikach, musimy sięgnąć po fsync(). Bardzo ładnie jest to wyjaśnione tutaj.

Oczywiście, one nadal nie muszą być utrwalone. Jest jeszcze sterownik systemu plików, sterownik urządzenia blokowego, bufor w macierzy/kontrolerze dysków i w samym dysku! Ale jeśli sterowniki, kontroler dysków i firmware dysku są OK, no to w końcu czujemy się lepiej. Problem w tym, że nie zawsze są OK.

Poza tym, nawet jeśli są OK, awaria dysku/zasilania może przyjść w trakcie zapisywania danych na dysk i zapiszą się tylko częściowo i nie w tej kolejności, w której były zlecone. Implikacje mogą być bardzo daleko idące i dotyczą głównie implementacji: systemów plików, baz danych, systemów transakcyjnych, systemów kolejkowych czy nawet serwera pocztowego. Na pewno wszędzie, gdzie liczy się ACID.

Niektóre systemy udostępniają dodatkowe możliwość wpłynięcia na proces utrwalania, np. Mac OS X udostępnia w fnctl() opcję F_FULLFSYNC. Również Windows udostępnia funkcję FlushFileBuffers() do czyszczenia (całego) cache dysku oraz tryb otwarcia pliku FILE_FLAG_WRITE_THROUGH, których opis sugeruje, że załatwiają sprawę (głowy nie dam, ale wg tego porównania wypada nieźle).

Istnieją narzędzia, które świadomie korzystają z tego dobrodziejstwa, np.:

Istnieją ponadto techniki radzenia sobie z częściowym utrwaleniem danych na podsystemie dyskowym w aplikacjach, które przepisują daną "w miejscu". Dla przykładu Websphere MQ zapisuje dziennik operacji (journal) w stronach i może się zdarzyć, że strona nie jest pełna. Wówczas zapisywana jest część strony, a reszta zostaje dopisana później. Ta druga operacja potencjalnie może skutkować utratą danych tego pierwszego zapisu. Aby to obejść, Websphere MQ domyślnie stosuje dla loga operacji metodę zapisu (LogWriteIntegrity) TripleWrite. Powoduje to dla niepełnych stron loga zapis pierwszej "połówki", na kolejnej stronie commit drugiej "połówki", a następnie (trzeci zapis) commit obu połówek razem do tej pierwszej strony.

To na ostateczne popsucie humoru:
  • znacie programistów krytycznych aplikacji biznesowych ;) w Java, którzy świadomie robią coś więcej niż flush() by utrwalić dane?
  • znacie kogoś, kto ma transakcyjną bazę danych SQL lub serwer SMTP na "oszukujących" dyskach SATA? (co lepsze, te low-endowe dyski mają duże 16-64MB cache)
  • co się stanie z e-mailem, gdy serwer SMTP potwierdzi jego przyjęcie i nie zrobi fsync() na pliku w spoolu, po czym padnie zasilanie?
  • znacie administratorów Linux, którzy świadomie wyłączają write cache na dyskach? (czasami robią to za nich same kontrolery macierzowe)
  • zastanawialiście się co czeka system plików w wirtualnej maszynie po padzie hosta, zwłaszcza gdy ów filesystem gościa jest plikiem na systemie hosta? (hint)
  • czy Wasz system plików księguje (journalling) dane, czy tylko metadane?
  • ile lat temu pojawiło się wsparcie dla wiarygodnego utrwalania danych w Twoich krytycznych aplikacjach i systemach?

wtorek, 24 maja 2011

Prymitywny acz skuteczny backup

Jak wiadomo, użytkownicy komputerów dzielą się na tych, którzy robią kopie zapasowe i tych, którzy będą je robić. Postanowiłem zrobić ruch wyprzedzający i zostać tym pierwszym ;-) czyli nieco bardziej regularnie niż zwykle archiwizować swoje dane z komputera osobistego (MS Windows) na dysk przenośny (który zresztą kupiłem w tym właśnie celu).

Standardowe narzędzie MS czyli ntbackup wykluczyłem, "bo tak".
Jako miłośnik systemów UNIX-like zacząłem od rozpoznania implementacji rsync (w tym Unison) pod Windows. Po paru chwilach stwierdziłem, że rzeźbienie plików .cmd z listą katalogów jakoś mnie nie bawi i chcę coś klikanego.

Wymagania są więc następujące:
  1. GUI do konfiguracji
  2. automatyczne kopie zapasowe wg harmonogramu
  3. operowanie na poziomie struktur katalogów katalogów (a nie bloki partycji)
  4. sprawdzone bojem na danych milionów frajerów przede mną ;-)
  5. opcjonalnie:
    1. kilka wersji plików wstecz
    2. odtwarzanie bez dodatkowych narzędzi (zwykłe kopie plików)
    3. kompresja
    4. szyfrowanie (dyski i tak mam zaszyfrowane, ale może się przydać przy kopiowaniu na zasób sieciowy)
    5. odtworzenie z zachowaniem uprawnień do plików
    6. wsparcie do archiwizowania ustawień aplikacji np. przeglądarek, komunikatora itp.

Przejrzałem nieco opinii:

Wybór strasznie duży, gorzej niż z dystrybucjami Linuksa. ;)

Mój pierwszy wybór padł na AceBackup. Prosty, schludny, zapowiada się nieźle. Niestety, nawet pierwszy backup mi się nie udał: skończyło się miejsce na C: (w TEMP powstawał roboczy plik w wersji skompresowanej). W wyniku uszkodził się też plik z definicją archiwum, na szczęście import wynikowej struktury katalogów udał się. Następnie backup wykonał się już w całości, ale program zaraportował braki niektórych plików. Z listy wnoszę, że wymiękł na długich ścieżkach/nazwach albo nietypowych znaczkach w nazwie. Po przejściu z formatu binarnego na kopiowanie plików AS-IS, problem zniknął.

Przy okazji szukania winnego zapchania dysku C: przypomniałem sobie użyteczną kombinację Alt+Shift+Enter w Total Commanderze (obliczenie zajętości wszystkich podkatalogów, czyli taki du -sm *). Następnie nadziałem się na magiczny folder Winsxs, który nie wiedzieć czemu ma u mnie skromne 15GB. Na dodatek w necie straszą, żeby nic stamtąd nie usuwać, bo wszystko jest potrzebne! Co za porażka, naprawdę nie mam wielu aplikacji na komputerze. Podratowałem się narzędziem compcln.exe z Service Packa 2, które wywala starsze biblioteki (uniemożliwia to deinstalację SP, na czym mi akurat nie zależy).

Wracając jednak do kopii zapasowych, muszę spróbować innego narzędzia... tym razem będzie to może:

Areca wygląda nienajgorzej, poza tym, że jest w Javie. Definiowanie celów, kompresowanie, szyfrowanie, kopia przyrostowa, generowanie batcha do automatyzacji, prosty interfejs i tutorial. Wchodzę w to i... jak na razie, po jednym backupie pełnym i jednym przyrostowym wydaje się działać.

Kto wie, czy taki backup mi się kiedyś nie przyda—zamierzam bowiem sprawić sobie pamięć masową SSD.