|
wersja 0.7 |
|
Spis treści |
1. Był sobie dysk... 2. Wymagania 3. Plik konfiguracyjny 4. Instalacja nowego systemu 5. Przesiadka na mirror 6. Diagnostyka 7. Spokojnie, to tylko awaria Posłowie |
| 1. Był sobie dysk... |
Jest to jeden z najgorszych możliwych scenariuszy. Dostajesz telefon, że coś jest nie tak. Co tym razem - zastanawiasz się - i nawet przez chwilę nie przychodzi Tobie do głowy awaria twardziela. Myślisz o łączu od TPsa, które po raz dziesiąty w tym miesiącu siadło, myślisz o braku prądu, włamie, ostatniej imrezie z kolegami (z której i tak niewiele pamiętasz). Może niepotrzebnie dałeś hasło do roota żulowi na dworcu PKP zakładając że nie wie o co chodzi ? No i zaczyna się - pożyczanie kasy na nowy dysk, szukanie ostatniej kopii zapasowej, która i tak okazuje się uszkodzona, odbieranie telefonów od userów, szefa, wierzycieli... Najbardziej awaryjnym elementem peceta (zaraz po zasilaczu w obudowach ATX) jest dysk twardy. Jeśli system jest nowy, żałujemy sprzętu. Jeśli nasz serwerek chodzi już jakiś czas, idą w cholerę dokumenty, poczta, konfigi i inne rzeczy które nie są backupowane :) Tak czy siak czeka nas kupa roboty. Najlepszym wyjściem w tej sytuacji jest uruchomienie naszego systemu na mirrorze (znanym jako "RAID-1"). Wszystkie dane są na bieżąco zapisywane na dwóch (w naszym przypadku) dyskach. Awaria jednego z nich nie wpływa na pracę całego systemu. Co więcej, możemy zdefiniować dodatkowy "wolny" (ang. spare) dysk, który w momencie awarii jednego z pozostałych, przejmuje jego rolę. O ile stworzenie mirrora dla poszczególnych partycji (np. /home) zostało dość ładnie opisane w Software RAID Howto, zajmiemy się tutaj lustrzanką całego systemu. Wszystko winno być skonfigurowane tak, że system bootuje się i pracuje normalnie po fizycznej awarii twardziela. Dodam jeszcze, że za zarządzanie RAIDem w naszym systemie odpowiadało będzie jajko (dlatego "soft"), nie potrzebujemy żadnego dodatkowego sprzętu (a ja nie mam do takowego dostępu). Całość opisywanych tutaj rzeczy testuje na Slackware 9.1 chodzącym na P200 z 64 MB RAM. Czysta moc :) Dyski, które zebrałem to zbieranina trzech jednoGigowych dysków różnych producentów w różnych stanach technicznych. Oczywiście zaleca się identyczne dyski i tak dalej. Dokument możemy podzielić na dwie części: pierwsza opisuje instalację Slacka na "nowym", czystym komputerze - chcemy system od razu instalować na mirrorze. Cześć druga opisuje przejście z chodzącego, zainstalowanego już Linucha na mirror (jest to część bardziej uniwersalna, powinna działać na innych dystrybucjach). |
| 2. Wymagania |
No cóż, potrzebne są dobre chęci, trochę czasu i paczka fajek. Dodatkowo: pewne pojęcie o dyskach i kernelu. RAID nie jest dobrym miejscem żeby zaczynać swoją przygodę z Linuxem, są to raczej zaawansowane sprawy. Narzędzia: * kernel 2.4 Bez jajka ani rusz. Domyślne jajko Slacka 9.1 (wcześniejszych pewnie też) posiada wkompilowane opcje obsługi RAID (dotyczy pierwszego przypadku), nie ma problemu. W drugim przypadku należy je włączyć. Tak czy siak, osoby które poważnie traktują swoje systemy mają jaja oraz odpowiednio przystosowane jajko. Jeśli chcesz się upewnić, że wszystko jest cacy, sprawdź czy istnieje plik /proc/mdstat. Przypominam, że nie powinieneś mieć ładowanych modułów jądra odpowiedzialnych za RAID, tylko statycznie wkomilowane (gwiazdka zamiast M :) Polecenie dmesg powinno coś na temat RAID chociaż wspomnieć. Oprócz jajka, potrzebny będzie pakiet raidtools. OK. Jeśli instalujesz system na nowym sprzęcie, jesteś gotowy. Jeśli chcesz przeskoczyć na RAID, przekompiluj jądro oraz zainstaluj potrzebny soft. Jeszcze o samym hardłer. Robimy mirror - dwa dyski pracują równolegle i przechowują te same dane. Opcjonalnie trzymamy w pogotowiu trzeci dysk, który w momencie awarii jednego z mirrorujących, przejmie jego rolę. Tak więc dwa nasze główne, mirrorujące dyski podłączamy jako mastery do dwóch różnych kanałów (IDE1 i IDE2). Jest to rozwiązanie zalecane ze względu na szybkość (wydajność) oraz możliwość awarii jednego z kontrolerów. Opcjonalny trzeci dysk podłączamy jako slave gdziekolwiek, może być to IDE1 lub IDE2. |
| 3. Plik konfiguracyjny |
Dlaczego w tym miejscu o konfigu ? Ano przerabiamy dwa przypadki, i opisywanie tych samych rzeczy w dwóch miejscach nie bardzo nam odpowiada (tak, tak, Tobie też). Później umieszcze tylko przykłady, teraz opis poszczególnych opcji. Po podłączeniu dysków musisz wyczaić, jakie mają oznaczenia. W klasycznym przypadku będą to /dev/hda (IDE1, master), /dev/hdc (IDE2, master), /dev/hdd (IDE2, slave). Jak widzisz, opiszemy przypadek dwóch mirrorów + jeden dysk "awaryjny" będący w pogotowiu. Ten trzeci jest opcjonalny. Do wyczajenia dysków możesz użyć polecenia dmesg. Po utworzeniu mirrora operujemy w systemie na urządzeniach MetaDevice: - sprzęt, który fizycznie nie istnieje. Czyli jeśli połączymy /dev/hda2 z /dev/hdc2 w mirrorze, otrzymamy np. /dev/md2 i na nim będzie chodził nasz system. Troche o partycjach. Ze względu na małą pojemność dysku, w naszym przypadku podzielimy go tak: / (hda2, hdc2): 600MB /home (hda3, hdc3): 200MB Swap znajdował się będzie na /dev/hda1, /dev/hdc1, /dev/hdd1 niezależnie. Mirrorowanie swapa nie ma sensu a przy odpowiedniej konfiguracji wydajność trochę na tym zyska. Czas na plik konfiguracyjny. Prawdę mówiąc jest to prosta sprawa... Mowa o /etc/raidtab, zdefiniowane są w nim dyski, ich partycje biorące udział w mirrorze oraz nasze MetaDevice. Oto przykład /etc/raidtab dla naszego przypadku: raiddev /dev/md0 raid-level 1 nr-raid-disks 2 nr-spare-disks 1 chunk-size 4 persistent-superblock 1 device /dev/hda2 raid-disk 0 device /dev/hdc2 raid-disk 1 device /dev/hdd2 spare-disk 0 raiddev /dev/md1 raid-level 1 nr-raid-disks 2 nr-spare-disks 1 chunk-size 4 persistent-superblock 1 device /dev/hda3 raid-disk 0 device /dev/hdc3 raid-disk 1 device /dev/hdd3 spare-disk 0 Zgodnie z założeniami konfig definiuje nam root: /dev/md0 oraz /home: /dev/md1. Te urządzenia trafią docelowo do /etc/fstab. Te "meta-urządzenia" definiowane są w identyczny sposób, różnią się jedynie cyferkami określającymi odpowiednie partycje. Przeróbmy dla przykładu /dev/md1: * raiddev /dev/md1 Definiujemy urządzenie RAID o nazwie md1. * raid-level 1 Urządzenie to pracuje w mirrorze = RAID 1. * nr-raid-disks 2 Biorą w nim udział dwa dyski. * nr-spare-disks 1 I jeden "zapasowy". Opcjonalne. Jeśli nie masz trzeciego, wpisz 0 zamiast 1. * chunk-size 4 W przypadku RAID-1 wielkość "czanka" nie ma znaczenia. Wartość musi jednak być niezerowa, inaczej się wykrzaczy. Wpisz 4 i zapomnij o sprawie ("czank" to wielkość fragmentu rozkładana po różnych dyskach w innych typach RAID). W każdej chwili możesz czanka wyrzucić w ogóle. * persistent-superblock 1 Jeśli chcemy bootować z mirrora, na każdym dysku umieszczany jest zapis jego konfiguracji. Wpisz i zapomnij. * device ... Urządzenie (dysk) ... * raid-disk / spare-disk jest albo "głównym" urządzeniem RAID albo "zapasowym", używanym w przypadku awarii głównego. Numeracja zaczyna się od zera. Gdy nie masz zapasowego, pomijasz dwie ostatnie linijki. I tyle na temat konfiga. Prosta sprawa. Prawdziwe wyzwanie to uruchomienie tego w "pełnym" mirrorze - wszystkie partycje i bootowanie. Dobra, zaczynamy. |
| 4. Instalacja nowego systemu |
Rozważmy przypadek pierwszy, bardziej prosty: instalujemy nowy system. Chcemy żeby chodził na pełnym RAID-1. Dodatkowo opisuje instalke z trzecim, zapasowym dyskiem. Poniższe odnosi się do Slackware 9.1, w innych może być podobnie (konfigurator Mandrake umożliwia wyklikanie myszką mirrora :)). Zakładam, że sprzęt jest już podłączony i BIOS wykrywa go należycie. Umieszczasz płytke w napędzie, bootujesz z CDROMu, logujesz się jako root. Jedziemy...
To by było tyle. System powinien się podnieść. W opisywanym przypadku wystartował bez problemów, chodził na md0 i md1, swapował natomiast po hda1, hdc1, hdd1. Słów kilka na temat swap. Swap pracuje najwydajniej na kilku dyskach równolegle. A ponieważ mamy do dyspozycji kilka dysków, dlaczego nie wykorzystać tego faktu ? Przy instalacji systemu, różne dyski biorące udział w słapowaniu mają różne priorytety. Aby to zobaczyć, w czasie normalnej pracy systemu (po reboocie, po instalacji) wydaj polecenie swapon -s. Aby zmienić priorytety wystarczy do pliku /etc/fstab (po wyjściu z instalatora Slacka w czasie instalacji /mnt/etc/fstab) dodać wpis w sekcjach dotyczących swapa. Zwykły wpis, np. /dev/hda1 swap swap defaults 0 0 wystarczy zastąpić takim: /dev/hda1 swap swap defaults,pri=1 0 0 Czyli przy każdej partycji typu swap wystarczy dopisać pri=1. Po następnym reboocie (lub np. wydaniu polecen swapoff -a oraz swapon -a) wynik polecenia swapon -s powinien pokazać takie same priorytety dla swapowanych dysków. Przejrzyj komunikaty startowe systemu, naciesz się widokiem chodzącego RAIDa, ponieważ od tej chwili Twój system jest prawie dwa razy bardziej niezniszczalny :) |
| 5. Przesiadka na mirror |
Mamy dany serwerek z systemem pracującym na jednym dysku. Celem jest przesiadka na mirror. Taki z dwoma dyskami, jak podpiąć ew. "wolny" dysk opisałem gdzieś niżej. Nasz Linux chodzi na /dev/hda, który wygląda tak (fragment /etc/fstab): /dev/hda1   swap   swap   ... /dev/hda2   /   reiserfs   ... /dev/hda3   /home   reiserfs   ... Do maszyny został podpięty /dev/hdd: secondary slave (miał być master ale popieprzyłem zworki, nieważne). Ważne, że secondary. Dobra, mamy system chodzący na jednym dysku, chcemy na dwóch. Drugi dysk został podpięty. Nowy, czysty dysk należy teraz podzilić na partycje w podobny sposób, w jaki podzilony jest pierwszy, ten z chodzącym systemem. Informacje te wyświetli nam fdisk -l /dev/hda. Uruchamiamy fdisk (lub inny program) i dzielimy nasz nowy dysk pamiętając o tym, by wszystkie partycje oprócz swap były typu Linux raid autodetect. Po wykonaniu partycjonowania, fdisk -l /dev/hdd wygląda tak: /dev/hdd1   .........   82   Linux swap /dev/hdd2   * .......   fd   Linux raid autodetect /dev/hdd3   ......   fd   Linux raid autodetect Czyli dwa nasze dyski mają podobny układ partycji. Kolejnym krokiem jest stworzenie pliku /etc/raidtab. Jednyną rzeczą wartą uwagi jest to, że partycje na których chodzi nasz system oznaczone były jako failed-disk a nie raid-disk. W ten sposób nie zostanie na nim namieszane, jajco potraktuje go jak uszkodzony dysk, i dobrze - nie chcemy stracić naszego systemu. Powolutku. Tak wygląda nasz gotowy /etc/raidtab: raiddev /dev/md0 raid-level 1 nr-raid-disks 2 nr-spare-disks 0 chunk-size 4 persistent-superblock 1 device /dev/hda2 failed-disk 0 device /dev/hdd2 raid-disk 1 raiddev /dev/md1 raid-level 1 nr-raid-disks 2 nr-spare-disks 0 chunk-size 4 persistent-superblock 1 device /dev/hda3 failed-disk 0 device /dev/hdd3 raid-disk 1 Następnie tworzymy meta-urządzenia /dev/md.. oraz zakładamy na nich system plików. Ponieważ nasz systemowy dysk jest failed, nie stracimy danych. mkraid /dev/md0 mkraid /dev/md1 W tej chwili /proc/mdstat powinien pokazać "uszkodzoną" macierz. mkreiserfs /dev/md0 mkreiserfs /dev/md1 Podsumujmy: mamy "mirror" z jednym działającym dyskiem, należy na niego przerzucić dane z drugiego dysku, będącego systemowym i zarazem częścią mirrora. Nieźle :) Kolejnym krokiem jest przeniesienie struktury katalogów z obecnego dysku na nowy, przyszły mirror. Znaczy się, należy skopiować pliki i katalogi i takie tam inne dziwne rzeczy. Zatrzymaj w tej chwili jak najwięcej usług chodzących w Twoim systemie (serwer plików, www, poczty, bla bla bla). Tak będzie lepiej. Dobra, przpominam, że miejscem docelowym jest macierz (jeszcze nie jest w pełni sprawna ale o tym za chwilę). Teraz na naszej macierzy próbujemy odtworzyć przyszły system plików. Powinieneś czaić o co chodzi: mkdir /mnt/mirror mount -t reiserfs /dev/md0 /mnt/mirror mkdir /mnt/mirror/home mount -t reiserfs /dev/md1 /mnt/mirror/home Utworzyliśmy sobie katalog /mnt/mirror, który od tej pory traktujemy jako root naszego nowego systemu. Jest on zainstalowany na /dev/md0 czyli na RAIDzie. Na /home przeznaczyliśmy osobną partycję, /dev/md1, dlatego jest ona podmontowana w tymże miejscu. Jeśli planujesz więcej partycji, robisz analogicznie. Należy teraz przerzucić pliki z /dev/hda na macierz. Hir łi goł: cd / find . -xdev | cpio -pm /mnt/mirror Dane trafiły na mirror. Ponieważ dysk źródłowy widziany jest przez jajko jako uszkodzony, nie jest na nim nic zapisywane. Za chwilę to odkręcimy. Najpierw musimy jednak skonfigurować system tak, aby od następnego reboota pracował na macierzy. Wystarczą zmiany w pliku - uwaga - /mnt/mirror/etc/fstab. Oto jak wygląda ten plik po zmianach (przed nimi - kilka linijek wyżej): /dev/hda1   swap   swap   ... /dev/hdd1   swap   swap   ... /dev/md0   /   reiserfs   ... /dev/md1   /home   reiserfs   ... Od razu zajmijmy się lilo, bez tego mogą być później problemy. W skrócie - zamiana hda na md dla root i boot w pliku - uwaga - /mnt/mirror/etc/lilo.conf: boot=/dev/md0 ............. root=/dev/md0 ............. raid-extra-boot=/dev/hda,/dev/hdd Zapisz zmiany. Uruchom lilo -r /mnt/mirror U mnie były trzy ostrzeżenia, nie przejmuj się. Czas na reboot - pamiętaj, aby ustawić w biosie boot z dysku będącego częścią chodzącego obecnie mirrora (tu: /dev/hdd). Jeśli system wystartował a polecenie mount pokazuje, że pracujemy na mirrorze, jedziemy dalej. Pozostało obecnie załączyć do mirrora "uszkodzony" dysk - ten, na którym do tej pory był stary system a o którym jajko myśli, że jest uszkodzony (tu: /dev/hda). Najpierw fdiskiem (lub czymś podobnym) zmieniamy typ partycji dysku /dev/hda na Linux raid autodetect (fd) i zapisujemy zmiany. Reboot kompa. Następnie wystarczy w /etc/raidtab zamienić failed-disk na raid-disk (zrób to teraz, zapisz zmiany w pliku) oraz wydać polecenia: raidhotadd /dev/md0 /dev/hda2 raidhotadd /dev/md1 /dev/hda3 Spowodują one, że do naszego mirrora dodane zostaną "uszkodzone" dyski, rozpocznie się ich synchronizacja i po chwili /proc/mdstat pokaże w pełni działający mirror :) |
| 6. Diagnostyka |
Od czasu do czasu warto sprawdzić w jakim stanie znajduje się nasz mirror. Z pomocą przychodzi nam polecenie lsraid. Rzućmy okiem na stan naszego pierwszego mirrora: lsraid -a /dev/md0 W omawianym przypadku wynik może wyglądać tak: [dev ...] /dev/md0 .............. online [dev ...] /dev/hda2 .............. good [dev ...] /dev/hdc2 .............. good [dev ...] /dev/hdd2 .............. spare Tak więc widzimy, że pierwszy RAID (/dev/md0) pracuje (online). W jego skład wchodzą dwa dyski (hda, hdc), które pracują poprawnie (good). Trzecim, zapasowym dyskiem będącym w pogotowiu jest hdd. Wygląda na to, że wszystko jest w porządku. Jeśli natomiast chcemy sprawdzić, do której macierzy należy partycja hdc3, wykonujemy polecenie: lsraid -d /dev/hdc3 Chcesz wiedzieć, w jakiej konfiguracji pracują macierze w Twoim kompie ? lsraid -R -p Tyle sensownych opcji lsraid. Po inne udaj się do manuala. Powróćmy teraz do /proc/mdstat. Wypisanie zawartości tego pliku (cat /proc/mdstat) pokaże z grubsza to samo. W naszym przypadku fragment dotyczący /dev/md0 wygląda następująco: md0: active raid1 hdd2[2] hdc2[1] hda2[0] 586560 blocks [2/2][UU] Widzimy, że md0 jest mirrorem (raid1). Następnie wymienione są partycje biorące w nim udział, każdej z nich przyporządkowany jest numer (w nawiasie kwadratowym, za chwile wrócimy do tych numerków). Kolejną rzeczą jest wielkość urządzenia md0 podana w bajtach. A teraz to, co tygrysy lubią najbardziej. Pierwszy nawias kwadratowy to [2/2]. Mówi on tyle: w macierzy pracują dwa dyski (pierwsza cyfra). Dwa z nich pracują prawidłowo (druga cyfra). Co w tym fajnego ? Ano np. zapis [2/1] oznacza, że masz problem (patrz następny punkt). A taki: [2/0] mówi: "szukaj nowej pracy". To jeszcze nie wszystko. Pamiętasz numerki przy każdej partycji biorącej udział w RAID ? Weźmy jeszcze raz pierwszą z dwóch cyfr w [2/2]. Jest to 2 (słownie: dwa). Numerki naszych partycji to 0,1 i 2. Możemy wywnioskować stąd, że partycja (i dysk) numer 2 jest "zapasowa", załączająca się w momencie awarii jednego z pozostałych dysków. Bierze się to stąd, że zapasową jest każda partycja, której numer jest większy lub równy od pierwszej cyfry w nawiasie kwadratowym [2/2]. Czyli gdybyśmy mieli więcej "zapasowych" partycji, miałyby one numery większe od dwójki (bo mamy już zapasową dwójkę). Gdybyśmy w nawiasie kwadratowym mieli [3/3] zapasowe partycje miałyby przyporządkowane numery większe lub równe od trzech. Dobra, pieprzyć zapasowe, można je przecież odczytać przez lsraid. I jeszcze ostatnia rzecz, graficzna reprezentacja naszego [2/2] to [UU]. Pierwsze U to partycja o numerku 0 (zero), drugie U to kolejna partycja, u nas o numerku 1 (jeden). Jeśli padnie partycja (dysk) numer 0, wówczas będzie tak: [_U], jeśli padnie ta o numerku jeden, będzie [U_]. Czyli: kolejne U to kolejne partycje. Po co ta szopka ? Żeby można było np. napisać skrypt, który "grepuje" podkreślniki i wyczaja, że coś jest nie tak. Tak między nami: lsraid w zupełności wystarczy. Omówienie /proc/mdstat to taka sobie ciekawostka. Chyba, że zdarzy się, że siądziesz do kompa w którym ktoś wykasował lsraid i będziesz mógł przycynić :) Warto na koniec tego punktu wspomnieć o jeszcze jednym narzędziu: mdadm. Umożliwia ono... wszystko. Zmiany w macierzy, dodawanie i usuwanie dysków, monitoring, itd. Jeśli odczuję taką potrzebę (lub Ty ją czujesz - napisz do mnie) napiszę na temat tego narzędzia (BTW: jest ono dobrze udokumentowane w Sieci). |
| 7. Spokojnie, to tylko awaria |
"I stało się to, co miało się stać, patrzę sobie do mirrora: nosz k... mać!" To może jakiś praktyczny przykład. A właściwie przykłady. Jeden: z "wolnym" dyskiem, drugi bez niego. Zacznę od awarii jednego z dysków mirrorujących. Będzie to secondary master: /dev/hdc. Zrobie to kulturalnie: odłącze zasilanie od dysku przy wyłączonym komputerze i spróbuje uruchomić system. W przykładzie drugim spróbuję udowodnić, że niektóre dyski dyski IDE są hotpluggowe - odłącze pałera w czasie pracy twardziela. Kolejność jest zrozumiała :) Przykład 1 Uruchomienie systemu z "uszkodzonym" secondary master na macierzy z "zapasowym" dyskiem. Włączam komputer. Startuje normalnie, komunikaty systemu przelatują tak szybko, że nie idzie wyczaić padu twardego. Rzut oka do pliku /proc/mdstat: md0: active raid1 hdd2[2] hda2[0] ...... blocks [2/1] [U_] [==>................] recovery = 12.5% (.....) finish=2.6min speed... Co widzimy w tym okrojonym wyniku ? W mirrorze biorą udział dwa dyski, nie trzy. Ostał się hdd oraz hda. Fakt, że coś jest nie tak potwierdza zapis [2/1]. Jednego brakuje. Czytamy dalej: [U_] mówi nam, że padł drugi dysk (unit ?). Wszystko jasne. Jednocześnie widzimy na dole, że rozpoczęła się (automatycznie) rekonstrukcja macierzy z udziałem dysku wolnego, zapasowego :) Za dwie i pół minuty będziemy mieli znowu system na dwóch dyskach. Dla pewności robimy: lsraid -a /dev/md1 (padły wszystkie meta-dyski w których brał udział hdc, więc i md0 i md1). [...] /dev/md1 ................. online [...] /dev/hda3 ................. good [...] (unknown) ................. missing [...] /dev/hdd3 ................. spare Tutaj nie trzeba nic wyjaśniać. Minęły trzy minuty. Zapasowy dysk zastąpił uszkodzony, /proc/mdstat wygląda tak, jakby nigdy nie było dysku zapasowego. lsraid zachowuje się identycznie. Mamy zwykły mirror, bez dysku zapasowego. Wszystko stało się samo. W ciągu trzech minut system naprawił się sam :) Na spokojnie oglądamy komunikaty dmesg. Jak to wyglądało ? Oto ciekawsze fragmenty: md: Autodetecting RAID arrays. md1: former device hdc3 is unavailable, removing from array! raid1: spare disk hdd3 raid1: md1, not all disks are operational - trying to recover array raid1: raid set md1 active with 1 out of 2 mirrors md: updating md1 RAID superblock on device md: recovery thread got woken up ... md1: resyncing spare disk hdd3 to replace failed disk Należy jeszcze uakualnić plik konfiguracyjny mirrora: albo ręcznie edytujemy /etc/raidtab albo też robimy taki myk: lsraid -R -p > /etc/raidtab Od tej chwili plik raidtab zawiera właściwe dane. Następnie uaktualnij plik /etc/lilo.conf, chodzi o parametr raid-extra-boot. Zamień uszkodzony dysk (tutaj hdc) tym zapasowym, który przejął jego rolę (tutaj hdd). Jeszcze przeładuj lilo i szafa gra. Możemy położyć komputer i wyjąć z niego uszkodzony dysk. Od tej pory mamy zwykły mirror bez dysku zapasowego. O tym jak załączyć nowy zapasowy dowiesz się z trzeciego przykładu. Przykład 2 Teraz coś dla hardkorowców: odłączenie pałera w czasie pracy macierzy (2 dyski, bez zapasowego). Szczęśliwym wybrańcem został... primary master. Przykład ten ma pokazać, że na dobrze skonfigurowanym mirrorze system potrafi wstać z jednego dysku (typu slave) oraz czynności jakie należy wykonać po podłączeniu nowego dysku. No to jedziemy: system sobie chodzi a ja odłączam od twardego zasialnie... System chodzi dalej. Jest troche ciszej, bo płyta i dyski leżą rozłożone na stole :) Co widzimy w /proc/mdstat ? md0: active raid1 hdd2[1] hda2[0](F) ..... blocks [2/1] [_/U] Po pierwsze: oznaczenie (F) czyli failed, czyli któryś dysk rozsypał się na dobre. Po drugie: [_/U] czyli pierwszy dysk, czyli ten z mniejszą cyferką przy opisie czyli /dev/hda2, czyli /dev/hda, czyli primary master. A nie mówiłem ? Okej. Teraz wynik polecenia lsraid -a /dev/md0: [dev ....] /dev/md0 ............... online [dev ....] /dev/hda2 ............... failed [dev ....] /dev/hdd2 ............... good Nie chce mi się tego komentować :) Nasz dysk nadaje się do wymiany. Jako stary użytkownik systemów Windows postanawiam zrebootować kompa. Może naprawi się samo. Dobra, chodzi o lilo, zobaczymy czy ta padlina się podniesie. Jego zamykaniu towarzyszą ostrzeżenia o uszkodzonym dysku (podobne pojawiły się w logach). A za chwilę co widzimy ? He ? Tak jest, lilo oraz ładujący się system. Jest git, nasz system chodzi jak należy. Tyle, że z macierzą jednodyskową :) Uaktualniamy nasz /etc/raidtab w taki sposób: lsraid -R -p > /etc/raidtab albo ręcznie. Dobra, zamykamy system, wymieniamy dysk i wracamy do tego miejsca. Pożyczyliśmy kasę, mamy nowy dysk, jest już podłączony. Dzielimy go fdiskiem podobnie jak w przykładzie 1 (podobne wielkośći, typ partycji fd itp.). Uaktualniamy /etc/raidtab dopisując dodatkowe partycje do odpowiednich meta-device. Oto fragment dla md0 przed wymianą dysku: raiddev /dev/md0 raid-level 1 nr-raid-disks 2 nr-spare-disks 0 persistent-superblock 1 chunk-size 4 device /dev/hdd2 raid-disk 1 device /dev/null failed-disk 0 oraz po naszej interwencji: raiddev /dev/md0 raid-level 1 nr-raid-disks 2 nr-spare-disks 0 persistent-superblock 1 chunk-size 4 device /dev/hdd2 raid-disk 1 device /dev/hda2 raid-disk 0 Tia. Pozostało jeszcze wydać polecenie(a) analogiczne do tych: raidhotadd /dev/md0 /dev/hda2 raidhotadd /dev/md1 /dev/hda3 Rozpoczynają one synchronizację nowych dysków i po paru minutach nasze meta-urządzenia są jak nowe. Od tej pory używasz prawdziwego mirrora. Ale to nie wszystko. Sprawdź plik /etc/fstab i skoryguj, popraw lub upewnij się, że są w porządku dane dotyczące swapa. Jeśli szafa gra, wydaj polecenie załączające swapowanie na odpowiedniej partycji (z odpowiednim priorytetem), np. swapon -p 1 /dev/hda1. Do kontroli użyj swapon -s To też jeszcze nie wszystko. Nie zapomnij o lilo, nie rób siary! Sprawdź, ew. popraw /etc/lilo.conf i wydaj polecenie lilo. Gratuluje, zasłużyłeś na piwo. Na kilka piw. Szkoda, że Twój szef o tym nie wie (i jeszcze jebie cie za konieczność zakupu nowego dysku). Przyzwyczaj się. Przykład 3 Sytuacja wygląda tak: mamy system chodzący na mirrorze. Chcemy dodać dysk zapasowy, albo żeby zastąpić uszkodzony albo żeby czuć się bezpieczniej ;) Powód nie ma znaczenia, procedury są takie same. Podstawowa sprawa to podłączyć dysk do kompa i wyczaić jak jest widziany przez system. W tym przykładzie padł dam dysk /dev/hdc. Można podejść do tego także w taki sposób, że chcemy aby zapasowy dysk znajdował się na /dev/hdc. Ustawiamy zworkę na master i podłączamy do drugiego IDE. Włączamy komputer. Należy teraz wyczaić jak podzielone są dyski biorące udział w obecnym mirrorze. W naszym przypadku są to /dev/hda oraz /dev/hdd. Wydajemy polecenie np. fdisk -l /dev/hda i widzimy już, jak z grubsza podzielić nasz "wolny" dysk. Bierzemy fdisk w obroty i dzilimy nasz nowy dysk w bardzo podobny sposób (pamiętaj, że typem wszystkich partycji prócz swap jest fd). Zapisujemy zmiany. Należy teraz dodać odpowiednie wpisy do pliku /etc/raidtab. Ponieważ chcemy dołożyć po "wolnym" dysku, zwiększamy wartość parametru nr-spare-disks oraz dopisujemy do każdego urządzenia /dev/md.. sekcję device oraz spare-disk. W omawianym przypadku /dev/md1 wygląda mniej więcej tak: raiddev /dev/md1 raid-level 1 nr-raid-disks 2 nr-spare-disks 0 persistent-superblock 1 chunk-size 4 device /dev/hda3 raid-disk 0 device /dev/hdd3 raid-disk 1 Po odpowiednim podzieleniu fdiskiem nowego, zapasowego dysku plik ten modyfikujemy tak: raiddev /dev/md1 raid-level 1 nr-raid-disks 2 nr-spare-disks 1 persistent-superblock 1 chunk-size 4 device /dev/hda3 raid-disk 0 device /dev/hdd3 raid-disk 1 device /dev/hdc3 spare-disk 0 W razie awarii któregoś z dysków mirrorujących, jego rolę przejmie /dev/hdc. W naszym przypadku, w macierzy /dev/md1, rolę uszkodzonej partycji /dev/hda3 lub /dev/hdd3 przejmie partycja /dev/hdc3. Zapisujemy zmiany. To jeszcze nie wszystko, żebym zapasowy dysk zaskoczył (wystarczy rzut oka na wynik polecenia lsraid -R -p). Pozosta ło jeszcze dla każdego mirrora /dev/md.. posłużyć się poleceniem raidhotadd. W naszym przypadku będą to: raidhotadd /dev/md0 /dev/hdc2 raidhotadd /dev/md1 /dev/hdc3 Teraz lsraid -R -p zwróci wynik, na który czekaliśmy. To samo widzimy po wydaniu polecenia cat /proc/mdstat. A skoro nowy jest już częścią mirrora, może zostać także częścią swapa. Wystarczy edycja /etc/fstab i dopisanie linijki analogicznej do innych swapów. Przykład 4 Na szybkiego, w tym miejscu powinieneś już wiedzieć jak się obchodzić z mirrorem. Założenie: system z mirrorem plus dysk zapasowy. Nagle odczuwasz silną wewnętrzną potrzebę posiadania dysku (np. okazało się, że kumpel ma wuchtę filmów i chcesz je mieć u siebie. Albo za skrzynkę piwa pożyczasz dysk znajomemu). Dla zrobienia wrażenia możesz rzucić tekst: poczekaj, wyjmę dysk z serwera, i tak mam mirrora :). Tak czy siak chcesz na jakiś czas wyjąć zapasowy. Załóżmy, że zapasowy to /dev/hdb (tak, literki "b" chyba jeszcze nie przerabialiśmy). Najpierw palisz głupa przed kernelem, że zepsuł się zapasowy dysk mirrora: raidsetfaulty /dev/hdb Teraz zachowujesz się tak, jak gdyby uszkodzeniu uległ wspomniany dysk i uaktualniasz konfig: raidhotremove /dev/md... /dev/hdb lsraid -R -p > /etc/raidtab Hmm... Możesz wyłączyć kompa i triumfalnym gestem wręczyć kumplowi twardego :) Jeśli przyszłoby Tobie do głowy pożyczać jednego z głównych mirrorujących, wykonaj powyższe a następnie wykasuj zawartość twardziela :). To by było na tyle, polecenie raidsetfaulty sprawia, że system zaczyna traktować dysk jak normalnie uszkodzony. Użyj go, jeśli chcesz odłączyć od macierzy jakikolwiek sprawny dysk. Inne przykłady omawiają jak podłączyć z powrotem i zapasowy i główny mirrorujący. Dobrej zabawy. Podsumowanie Nie lubie podsumowań. Przeważnie oznaczają koniec. Najlepszym rozwiązaniem jest mirror(2 dyski) plus zapasowy(1 lub więcej dysków). W przypadku awarii system sam wykonuje odpowiednie czynności i gdy połapiesz się, że coś jest nie tak, wystarczy dodać dysk zapasowy - jest to najprostsza czynność. Nie ryzykujesz wtedy w takim stopniu utraty danych i generalnie trudno coś spaprać. Gdy nie masz zapasowego i dojdzie do awarii dysku, nie dość, że trudniej jest przywrócić system do normalnego stanu, to wszystko chodzi na jednym twardzielu. Na chłopski rozum: szybciej spieprzą się dwa dyski niż trzy. Wystarczy. Przeglądaj plik /proc/mdstat. Najlepiej gdy cron zrobi to za Ciebie ze dwa razy dziennie i w przypadku wyłapania "podkreślnika" w kwadratowym nawiasie podeśle Tobie mejla. Po chamsku napisz markerem na dyskach w serwerku, który jest który (hda, hdb, ...). Nigdy nie wiadomo jak zareagujesz na awarię na produkcyjnej maszynie. Uwierz, naprawdę dziwne rzeczy dzieją się wtedy :) Jeśli masz okazję na byle jakim sprzęcie bawić się mirrorem, rób to. Im więcej będziesz się bawił na doświadczalnej maszynie tym lepiej. Na serwerku błędy mogą wiele kosztować. Mało optymistyczny akcent na koniec :) |
| Posłowie |
Jest to pierwsza wersja tego dokumentu i zawiera pewnie jakieś błędy/niedoróbki/potknięcia itp. Będę bardzo wdzięczny za wszelkie uwagi, komentarze, poprawki, wyrazy wdzięczności. Z góry przepraszam za powyższe i mam nadzieję, że będziecie mnie informować w których miejscach coś nie gra. Jako (częściowe) wytłumaczenie przedstawiam fakt, że większość tej pracy powstawała w późnych godzinach nocnych. Ostatnia wersja tego dokumentu znajduje się pod niżej wymienionym adresem. Kontakt ze mną: linio@terramail.pl Wesprzyj finansowo autora - kliknij tutaj |
|
=============================== Henryk Liniowski, Poznań 2004 http://linio.terramail.pl =============================== |