RAID

Z DCEwiki
Skočit na navigaci Skočit na vyhledávání

RAID (Redundant Array of Inexpensive Disks) je technologie, která umožuje spojit několik fyzicky nezávislých disků do jednoho pole, které se pak navenek tváří jako disk jediný. To může vést:

  • ke zvýšení kapacity diskového systému
  • zvýšení výkonu při IO operacích
  • zvýšení úrovně zabezpečení uložených dat bez extrémních pořizovacích nákladů.

Proto se RAID používá všude tam, kde je výpadek disku nebo dokonce ztráta dat nepřípustná.


RAID - typy

V Linuxu můžeme použít 3 typy RAIDů:

  • Linux SW RAID, který je realizován kompletně linuxovým jádrem
  • FakeRAID neboli SW RAID v BIOSu počítače, který je realizován BIOSem, ale nad kterým v lze získat v Linuxu kontrolu jen v případě, že je k dispozici funkční linuxový driver k chipsetu, který raid provádí.
  • plně HW RAID - v základních deskách běžných počítačů a levných serverů se většinou vyskytuje pouze FakeRAID (viz níže). Desky, které mají skutečný HW RAID bývají nechutně drahé a navíc pokud řadič umře a vy nemáte k dispozici více strojů se stejným typem řadiče, tak se vám už nemusí podařit z disků data vydolovat.

HW a SW RAID

Jednou z výhod hardwarových RAIDů je jejich blbuvzdornost. Většinou podporují tzv. hotswap ( tj. že zařízení lze vyjmout či přidat, aniž by bylo nutné stroj restartovat ), takže v případě, že jeden z disků odejde do věčných lovišť, stačí místo něj zasunout nový.

Bohužel některé hardwarové RAIDy omezují uživatele tím, že vyžadují identickou velikost a rovněž typ náhradního disku. Nelze tedy kupř. vytvořit RAIDové pole kombinací SATA a IDE zařízení (což softwarový RAID umožňuje). Dříve to vcelku nebyl až takový problém, protože vývoj pevných disků nebyl tak překotný jako dnes. Jenže kdo vám dnes zaručí, že za dva roky seženete disk s identickou kapacitou a rozhraním? Pokud budete mít štěstí, tak to bude za cenu kompletně nového stroje.

Výhodou je, že nainstalovaný systém vidí diskové pole vždy jako jedno fyzické zařízení, bez ohledu na použitý operační systém. Nevýhodou je však závislost na uzavřeném firmware. Pokud bude ovladač vašeho RAID zařízení obsahovat nějaký bug, nezbývá se než modlit aby pro něj měl výrobce nabídnul nějakou možnost opravy či řešení.

Hardwarové RAIDy jsou také poměrně drahá zařízení, proto levnější základové desky pro PC s HW RAIDEM umožňovaly vytvořit jen jeden RAID z menšího počtu disků. Dnes už je situace taková, že se základové desky prodávají pouze se softwarovými pseudořadiči, které ve skutečnosti vůbec hardwarový RAID neumí! Bohužel nezkušený uživatel se tuto skutečnost zpravidla dozví až v okamžiku, kdy mu začne vrtat hlavou, proč mu instalovaný Linux vidí místo jednoho zařízení stále jednotlivé disky.

Linuxový SW RAID

Linuxový softwarový RAID je obecně považován za spolehlivější řešení než RAID hardwarový. Je to dáno i tím, že dává mnohem větší svobodu jak při tvorbě jednotlivých RAIDových zařízení, ale také tím, že v případě problémů je (na rozdíl od pseudohardwarových SW RAID zařízení) u disku z takového zařízení mnohem větší pravděpodobnost záchrany dat, prostřednictvím jakéhokoliv jiného linuxového stroje.


  • Výhody:
    • pokud máte hotswap disky a správně nakonfigurovaný systém (viz kapitola o Hotswap), můžete za plného provozu serveru (bez výpadku služeb) odstranit pokažený disk a místo něj dát čerstvý nový. Nastavení nového disku totiž děláte z příkazové řádky Linuxu.
    • do Linux SW RAIDu lze zapojit různě velké disky - nezapojují se totiž celé disky, ale jejich partitions. Pokud po letech provozu selže jeden ze starých disků a do RAIDu vložíme nový disk s násobnou velikostí, není jeho zbylá volná kapacita promarněna - můžeme ji využít na ukládání nekritických dat, popř. můžeme zbylou kapacitu do RAIDu zapojit později, až vyměníme i ten zbývající starý malý disk
    • Linux SW RAID je nezávislý na HW počítače. Pokud shoří základní deska a disky přežijí, můžete disky vložit do jakéhokoli jiného počítače a server máte okamžitě znovu online, v plné parádě včetně funkčního RAIDu, bez potřeby jakéhokoli nastavování v Linuxu.
    • Linux SW RAID je plně funkční, odladěný a stabilní systém, určený pro nasazení v ostrém provozu. Což se mnohdy od Linux driverech BIOS SW RAIDu nedá říci.


  • Nevýhody:
    • je potřeba se naučit syntaxi příkazů mdadm :-)
    • ve srovnání s plně HW RAIDem asi menší rychlost a větší zátěž CPU
    • je použitelný pouze s OS který linuxový SW RAID podporuje, což rozhodně nejsou systémy od Microsoftu
Poznámka Výhod linuxového SW RAID ale lze u produktů MS využít, pokud u nich použijete nějakou formu síťového přístupu - samba, iscsi, aj.

Vytvoření raidového pole

Pro vytvoření nového RAID pole se používá režim --create (lze použít i zkrácenou verzi parametru -C). Tento režim se nikdy nesmí použít, pokud pracujeme s disky již existujícího pole! Tj. pokud chceme do nového pole přidat blokové zařízení, které již bylo součástí nějakého RAID pole, je nezbytné provést nejprve u tohoto zařízení vynulování superbloku ( viz část Vyhození disku z pole )

Raid může být několika typů, které se liší jak různou úrovní zabezpečení dat tak výkonem a kapacitou. Podrobné informace najdete například na adrese http://cs.wikipedia.org/wiki/RAID.

RAID 0 (disk striping)
Není vlastně žádný RAID. Zajišťuje pouze zvýšení objemu úložného prostoru spojením více disků do jednoho celku. Tento typ pole může být lineární (disky jsou jakoby spojeny za sebou) nebo prokládaný (kapacita celého pole se rozdělí na bloky, které se pak střídavě ukládají na ostatní disky). Pole má velikost 100% celkové diskové kapacity, ovšem při výpadku některého z disků jsou data, která na něm byla uložena - ztracena.
RAID 1 (disk mirroring)
Je nejstarší používaná metoda zabezpečení dat. Tento typ raidu musí být tvořen minimálně dva stejně velkými disky, nad kterými se provádějí veškeré diskové operace paralelně. To může sna jednu stranu mírně snížit celkovou rychlost zápisu dat (protože se data musí zapisovat dvakrát), ale zase naopak se může mírně zvednout rychlost načítání dat, protože je systém prostřednictvím raidu může načítat z obou dvou disků současně. Pokud v raidu není přítomen žádný záložní disk, je při výpadku jednoho z disků nadále používán pouze zbývající disk. Data tím sice nejsou nijak dotčena, ale chybějící disk je třeba co nejrychleji nahradit.
RAID 5
Musí být tvořen minimálně třemi disky. Bezpečnostní informace o paritě dat se ukládají rozprostřeně na všechny disky v poli, takže nedochází k přetěžování některého z disků. Díky tomu, že jsou informace o paritě dat rozloženy na všech discích, lze v případě výpadku jednoho z disků chybějící data dopočítat. Výsledná datová kapacita raid5 oproti raid0 je tak menší pouze o kapacitu jednoho disku (u raid0 diskovou kapacitu náhradního (sparse) disku nelze využít). Pokud však z pole raid5 tvořeného třemi disky vypadnou dva disky, dojít k poškození dat. tento typ raidu je tedy výhodný při poiužití většího počtu stejně velkých HDD.
RAID 6
Je obdobou raid5, ovšem s tím rozdílem, že zabezpečovacím informacím je vyhrazena kapacita 2 disků (u raid5 je těmto datům vyhrazena pouze kapacita jednoho disku). Pole je tak odolné vůči výpadku 2 disků. Na druhou stranu je to na úkor snížení celkové kapacity úložného prostoru.
RAID 10
Je v podstatě spojením dvou raidových polí typu raid1 do jednoho pole raid0. Toto pole je tvořeno minimálně čtyřmi disky. Pole má vysokou rychlostí čtení, ovšem pokud vám selžou dva disky, které se zrovna zrcadlí mezi sebou, dojde ke ztrátě dat.
Upozornění Raidová pole lze skládat pouze z logických oddílů stejné velikosti. Pokud chcete zkombinovat disky o různé kapacitě, musíte raidové pole poskládat z diskových oddílů, které velikostí odpovídají diskové kapacitě nejmenšího z disků.

Nemá také valný smysl skládat raidové pole z diskových oddílů na jednom disku, přestože to lze udělat. Dosáhli byste tím pouze další degradace výkonu při diskových operacích.

Bloková zařízení a RAID

RAID pole lze sestavit rovnou z celých disků, ale pokud však nemáme stejně velké disky je lepší RAID pole sestavit z logických oddílů.

Upozornění Pokud jsou logické oddíly, ze kterých je RAID pole sestaveno, označeny jako typ Linux raid autodetect ( kód fd), pak se pole při startu jádra automaticky sestaví - to je důležité v případě, že kořenový souborový systém je také v RAID poli. Každopádně však musí být příslušné moduly jádra buď zakompilované rovnou v jádře, nebo přítomny v initrd obrazu, který jádro používá při svém zavedení do paměti počítače při startu systému.

Po každé změně RAID polí je tedy žádoucí aktualizovat ramdisk příkazem:

update-initramfs -u

S - spare disk

Disk, který je součástí RAID zařízení, ale není používaný dokud z něj některý disk nevypadne. Pak přestane být označen [S] a začnou se na něj replikovat data.

Upozornění V případě že zhavaruje disk na kterém byly uloženy informace potřebné pro replikaci, dojde ke ztrátě dat. To je důvod proč upřednostnit RAID-6 před RAID-5.

F - faulty disk

Když nějaké blokové zařízení, které je součástí RAID pole zkolabuje, zůstane dále jeho součástí, ale je označeno jako faulty [F]. V poli je takový disk nahrazen prvním dostupným spare diskem, na který se automaticky začne pole rekonstruovat. Pokud není spare disk k dispozici, může pole fungovat dál, pokud mu to dovolí jeho typ, ovšem v degradovaném režimu.

Poznámka Pokud chceme nějaké diskové zařízení z RAID pole vyjmout, musíme ho nejprve označit jako faulty (přestože je v pořádku), jinak nám ho nedovolí mdadm odstranit, protože s ním bude stále pracovat.
Upozornění V případě SATA disků (podporují hotswap) se může v případě problémů s napájením stát, že vypadnou a systém je znovu najde jako nové zařízení. V takovém případě se RAID pole přepne nejenom do degradovaného režimu, ale také do stavu read-only. Systém zůstane běžet pouze s tím co má aktuálně nataženo v paměti. Po restartu by se mělo pole normálně obnovit. Každopádně takové chování signalizuje vážný hardwarový problém, který je nutno bezpodmínečně vyřešit.

Příklad vytvoření RAID pole typu 0 z blokových zařízení /dev/hda3 a /dev/sda3

Poznámka
 stroj~# mdadm -C /dev/md1 -l0 -n2 /dev/hda3 /dev/sda3
  • Parametr -C je zkrácená forma pro parametr --create, operaci, kterou vytvoříme nové RAID pole /dev/md1
  • Parametr -l nastaví typ raidového pole (0, 1, 5, 6 apod.)
  • Parametr -n určí z kolika disků (či diskových oddílů) se má pole sestavit. Je-li pole sestaveno z více disků nežli je třeba, nastavení nepoužívaným diskům příznak [S] (spare - záložní disk)

Linuxový RAID vytváří zařízení v rámci MD subsystému, proto systém tato zařízení vidí pod jejich pořadovými čísly v rámcio adresáře /dev/md. Informace o aktuálním stavu MD subsystému udržuje jádro v souboru /proc/mdstat, ze kterého lze získat podrobnosti o aktuálně spuštěných RAID polích pouhým výpisem:

Poznámka
user@stroj:~$ cat /proc/mdstat
 Personalities : [raid1]
 md0 : active raid1 sda1[0] hda1[1]
       19542976 blocks [2/2] [UU]
 
 unused devices: <none>

Výše uvedený příklad poskytuje informaci o tom že v systému běží jedno spuštěné RAID pole typu 1 (mirror), které je dostupné jako blokové zařízení /dev/raid1. Je složené ze dvou diskových oddílů - /dev/sda1, který je na SATA disku a /dev/hda1, který je na IDE disku. Pole je plně funkční - má příznak [UU], který signalizuje že oba z disků jsou ve stavu U (z angl. up - nahozené).

Neúplné ( degradované) pole

V případě že by některý z disků vypadnul, běželo by RAID pole dál, ovšem v degradovaném stavu. Data by nadále zůstala dostupná, ovšem pouze z jednoho disku. Ovšem v případě selhání i tohoto druhého disku by mohla být ztracena, proto by bylo zapotřebí do RAID pole urychleně přidat náhradní disk.

U běžícího pole, kterému vypadlo či selhalo některé z blokových zařízení by příznak vypadal buď [U_] nebo [_U], v závislosti na tom, který z disků nelze použít.}}

Poznámka Za určitých okolností je neúplné RAID pole výhodné. Pokud chceme tedy pole záměrně vytvořit jako degradované je třeba při jeho vytvoření místo chybějících blokových zařízení uvést parametr missing. Mějte však stále na paměti, že v případě selhání degradovaného pole (nebo pole vytvořeného s příznakem --assume-clean) mohou být data - v případě že selže zrovna disk na němž jsou uložena - nenávratně ztracena.

S výjimkou RAID 0 se nové pole vždy vytvoří v degradovaném stavu, s tím, že pokud je přítomen plný počet blokových zařízení, začne automaticky proces synchronizace. Znamená to, že se ukládaná data primárně ukládají na jeden z disků a teprve z něj se postupně rozhazují na další disky v RAID poli. Tento proces synchronizace - nazývaný také "rekonstrukce" - raidového pole je poměrně zdlouhavý. Pokud na nově vytvořený RAID, který se teprve synchronizuje, začnete ihned sypat data, může trvat ještě déle. Proto máte několik možností

  • Nechat dojet synchronizaci a teprve pak začít RAID používat
  • Manuálně zastavit synchronizaci, dokud neskončí všechny ostatní operace s polem (ovšem pak ji nesmíte zapomenout spustit)
  • Nové pole vytvářet rovnou s parametrem --assume-clean, a synchronizaci spustit manuálně až po nakopírování dat.
  • Nové pole vytvořit jako degradované, nasypat do něj data a teprve poté do něj přidat další disky, které se začnou automaticky synchronizovat.Tato možnost se hodí obzvlášť tehdy, když nemůžeme nebo nechceme použít rovnou všechny diskové oddíly.

Synchronizace dat RAID pole

Synchronizace se spouští automaticky po vytvoření nového RAID pole. Je to však proces, který může trvat u velkých a pomalých blokových zařízení i několik hodin a každá další IO operace jej ještě víc zpomalí. Proto je dobré vědět jakým způsobem lze proces synchronizace dat řídit, a jakým způsobem jej lze urychlit.

Průběh synchronizace RAID zařízení lze řídit zápisem příslušné hodnoty do souboru sync_action příslušného RAID zařízení.

Zastavení probíhající synchronizace

Poznámka Pokud chceme u zařízení /dev/md1 proces synchronizace odložit na pozdější dobu, zapíšeme do souboru /sys/block/md1/md/sync_action hodnotu idle
stroj~#  echo idle > /sys/block/md1/md/sync_action

Vytvoření nového RAID pole bez automatického spuštění synchronizace

Automatickému spuštění synchronizace, bezprostředně po vytvoření RAID pole, můžeme zabránit, pokud při jeho vytvoření použijeme parametr --assume-clean. Tím se nastaví, aby zápis nových dat probíhal pouze do těch oblastí PRIMÁRNÍHO disku, které nejsou synchronizovány.

Poznámka
stroj~# mdadm --create --assume-clean --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1

Jak zabránit spouštění synchronizace po přidání nového disku do běžícího pole

Za normálních okolností se synchronizace dat automaticky spouští, je-li do pole přidáno chybějící blokové zařízení. Tomu lze zabránit tím, že se pole přepne do režimu, kdy používá tzv. bitmapu

Bitmapa obsahuje informace o aktuálním stavu synchronizace dat v RAID poli a zajišťuje, aby se nová data nezapisovala do těch míst disku, kde by mohlo dojít ke kolizi s nesynchronizovanými daty na ostatních discích.

Bitmapa se používá především tehdy, pokud potřebujeme pracovat s RAID polem kterého z nějakého důvodu prošlo zhroucením a při automatické synchronizaci dat by mohlo dojít k jejich poškození. Následná rekonstrukce pole po vypnutí bitmapy pak rovněž proběhne rychleji, protože se budou synchronizovat pouze rozhozená data, nikoliv celý disk.

Při použití bitmapy, je sice výkon RAID pole mírně degradován, ale bloková zařízení lze přidávat a odebírat bez toho, aniž by se pokaždé automaticky spustila zdlouhavá rekonstrukce pole.

Upozornění Při použití bitmapy se data zapisují pouze na primary disk!. Je-li tedy nastaveno použití bitmapy na čerstvě vytvořené RAID pole, nebude žádná replikace probíhat a přidaný disk zůstane čistý!
Poznámka Použití bitmapy může být také zbytečné, pokud během výpadku zařízení nemohlo v neúplném RAID poli dojít k nějakým změnám. Typicky když došlo k zastavení celého stroje v jeden okamžik - např. při náhlém přerušení el. proudu, atp.

Zapnutí bitmapy

Poznámka
stroj:~# cat /proc/mdstat 
Personalities : [raid1] 
md1 : active raid1 sdb2[0] sda2[1]
      29302464 blocks [2/2] [UU]
stroj:~# mdadm --grow --bitmap=internal /dev/md1
stroj:~# cat /proc/mdstat                       
Personalities : [raid1] 
md1 : active raid1 sdb2[0] sda2[1]
      29302464 blocks [2/2] [UU]
      bitmap: 1/1 pages [4KB], 65536KB chunk

Vypnutí bitmapy

Po ukončení manipulace s polem lze použití bitmapy vypnout a odstartovat rekonstrukci pole

Poznámka
stroj:~# mdadm --grow --bitmap=none /dev/md1
stroj:~# echo check > /sys/block/md1/md/sync_action 
stroj:~# cat /proc/mdstat                           
Personalities : [raid1] 
md1 : active raid1 sdb2[0] sda2[1]
      29302464 blocks [2/2] [UU]
      [>....................]  check =  0.4% (137856/29302464) finish=7.0min speed=68928K/sec
      
unused devices: <none>

Spuštění synchronizace

Jak se má přistupovat k rozhozeným datům při synchronizaci lze určit hodnotou, která se stejně jako když synchronizaci pozastavujeme, zapíše do souboru sync_action.

Poznámka V případě zařízení /dev/md1 odstartujeme synchronizaci pole zapsáním hodnoty resync do souboru /sys/block/md1/md/sync_action
stroj~#  echo resync > /sys/block/md1/md/sync_action

Po skončení synchronizace dat se automaticky změní hodnota v souboru na idle.

Poznámka Pokud disk synchronizaci nepotřebuje, tak se nestane nic a synchronizace pole se ihned přepne do stavu idle

Chceme-li nejprve zjistit, jak dalece je pole rozhozené, můžeme použít hodnotu check

Poznámka V případě zařízení /dev/md1 zapíšeme hodnotu check do souboru /sys/block/md1/md/sync_action
stroj~#  echo check > /sys/block/md1/md/sync_action

Provede se synchronizace pouze těch datových bloků, které nejsou v konfliktu. V případě rozhozených bloků se pokusí pokusí RAID o obnovu z disku, který má "čerstvější" data. Tzn. že pokud se při synchronizaci narazí na data, která nejsou synchronizována, zapíše se na ostatní disky datový blok z upřednostňovaného disku. V případě že se data nepodaří zesynchronizovat, je blok ignorován. Jak dalece je RAID pole rozhozené, se pak můžete dozvědět z obsahu souboru mismatch_cnt, který najdete na stejném místě jako sync_action, kterým se proces synchronizace řídí. Pokud proběhla synchronizace dobře bude hodnota v tomto souboru nulová.

Poznámka
stroj~# cat /sys/block/md1/md/mismatch_cnt

Při spuštění synchronizace hodnotou repair budou při synchronizaci datové bloky, které se nepodaří opravit vynulovány, s tím že se o opravu poškozených dat pak musí postarat soborovým systém nad RAID polem.

Poznámka V případě zařízení /dev/md1 zapíšeme hodnotu repair do souboru /sys/block/md1/md/sync_action
stroj~#  echo repair > /sys/block/md1/md/sync_action

Nastavení rychlosti synchronizace dat

Synchronizace dat má defaultně stanovené limity, které však lze změnit a tím i ovlivnit, jak dlouho potrvá. Tyto limity vymezují kolik IO operací za sekundu se má provést. Jde o hodnoty, které zajišťují že za normálních okolností nebude synchronizace příliš zatěžovat řadič a tím i zpomalovat ostatní IO operace. Za určitých okolností však může být žádoucí synchronizaci urychlit na úkor ostatních IO operací (např. při obnově havarovaného systému). V takovém případě zvedněte hodnotu minimálního limitu (který je defaultně nastaven na 1000, zatímco maximální limit je defaultně nastaven na 200000) zapsáním nové hodnoty do souboru /proc/sys/dev/raid/speed_limit_min

Poznámka
stroj:~# echo 200000 > /proc/sys/dev/raid/speed_limit_min


Zjišťování dalších informací o RAID poli

Kromě výpisu souboru /proc/mdstat, můžete zjistit další informace o běžícím RAID poli pomocí dotazů přes mdadm:

Poznámka
stroj~# mdadm -Q /dev/md0
 /dev/md0:37.28GiB raid1 2 devices, 0 spares. Use mdadm --detail for more detail.

Podrobnější výpis můžete dostat buď přidáním volby --detail a nebo rovnou nahrazením parametru -Q za -D:

Poznámka
stroj~# mdadm -D /dev/md0
 /dev/md0:
         Version : 00.90.01
   Creation Time : Thu Mar 12 01:34:06 2009
      Raid Level : raid1
      Array Size : 39086016 (37.28 GiB 40.02 GB)
     Device Size : 39086016 (37.28 GiB 40.02 GB)
    Raid Devices : 2
   Total Devices : 2
 Preferred Minor : 0
     Persistence : Superblock is persistent 
 
     Update Time : Tue Jul 21 10:55:23 2009
           State : clean
  Active Devices : 2
 Working Devices : 2
  Failed Devices : 0
   Spare Devices : 0
 
            UUID : ae074243:b857e8b6:85943576:cab70855
          Events : 0.13454779
 
     Number   Major   Minor   RaidDevice State
        0       8        1        0      active sync   /dev/sda1
        1       8       17        1      active sync   /dev/sdb1

Ve výše uvedeném výpisu jsou vypsány tyto informace:

  • Jde o pole typu RAID1 (zrcadlo)
  • je složeno ze dvou logických diskových oddílů (/dev/sda1 a /dev/sdb2)
  • major-minor čísla tj. čísla speciálních zařízení jednotlivých oddílů jsou: 8-1 (/dev/sda1) a 8-17 /dev/sdb2).
  • preferované minor number RAID pole je 0 (nula), takže se pole automaticky sestaví po spuštění jako /dev/md0.
  • položka update time se používá při sestavování pole, kdy je potřeba zjistit, které členy pole obsahují platná data (novější záznam o poslední aktualizaci pole). Pokud jsou tedy u dvou členů zrcadla (pole RAID1) časy různé, použije se pro sestavení pouze novější člen(!) a starší člen je tedy poté nutno s polem synchronizovat (viz Rekonstrukce degradovaného pole).

Výše uvedené informace se zapisují do superbloku každého členu pole (dřív se superbloky nepoužívaly, takže bylo například velmi obtížné pole po změně zapojení disků správně složit). Informace o poli musí být konzistentní u všech členů pole. Jaké informace jsou u jednotlivých členů pole, lze zjišťovat dotazováním přímo jednotlivých členů pole:

Poznámka
stroj~# mdadm -Q --examine /dev/sda1

Výstup bude obdobný jako tabulka která byla uvedena výše. Navíc v ní bude uvedeno, kterého člena pole jsme se zeptali. Na základě této informace pak můžeme zjistit na který člen pole byly data ukládané přednostně.

Monitoring stavu RAID pole

Nástroj mdadm umožňuje průběžně sledovat stav pole a v případě, že dojde k jeho rozpadu či selhání některého z disků vám odešle upozornění na jehož základě budete moct provést servisní zásah.

Aby to fungovalo, musíte mít na stroji funkční odesílání e-mailů (nakonfigurovaný exim4 nebo jiný mailovací systém) a v souboru /etc/mdadm.conf nastaveno na jakou adresu má být upozornění odesláno (MAILADDR) a pokud možno i zpáteční adresu (MAILFROM), abyste si pak nemuseli lámat hlavu s tím, na kterém stroji vám RAID pole vlastně selhalo.

E-mail však není příliš spolehlivé komunikační médium, proto je vhodné nastavit systém tak, aby byl tento informační mail odesílán opakovaně, dokud nebude problém odstraněn.

Poznámka Pokud toužíte pozorovat jaký je průběh synchronizace, můžete využít utilitu watch, která vám bude v pravidelných intervalech provádět výpis obsahu souboru /proc/mdstat
Poznámka
user@stroj:~$ watch cat /proc/mdstat


Kromě výpisu souboru /proc/mdstat, můžete zjistit další informace o běžícím RAID poli pomocí dotazů přes mdadm:

Poznámka
stroj~# mdadm -Q /dev/md0
 /dev/md0:37.28GiB raid1 2 devices, 0 spares. Use mdadm --detail for more detail.

Podrobnější výpis můžete dostat buď přidáním volby --detail a nebo rovnou nahrazením parametru -Q za -D:

Poznámka
stroj~# mdadm -D /dev/md0
 /dev/md0:
         Version : 00.90.01
   Creation Time : Thu Mar 12 01:34:06 2009
      Raid Level : raid1
      Array Size : 39086016 (37.28 GiB 40.02 GB)
     Device Size : 39086016 (37.28 GiB 40.02 GB)
    Raid Devices : 2
   Total Devices : 2
 Preferred Minor : 0
     Persistence : Superblock is persistent 
 
     Update Time : Tue Jul 21 10:55:23 2009
           State : clean
  Active Devices : 2
 Working Devices : 2
  Failed Devices : 0
   Spare Devices : 0
 
            UUID : ae074243:b857e8b6:85943576:cab70855
          Events : 0.13454779
 
     Number   Major   Minor   RaidDevice State
        0       8        1        0      active sync   /dev/sda1
        1       8       17        1      active sync   /dev/sdb1

Ve výše uvedeném výpisu jsou vypsány tyto informace:

  • Jde o pole typu RAID1 (zrcadlo)
  • je složeno ze dvou logických diskových oddílů (/dev/sda1 a /dev/sdb2)
  • major-minor čísla tj. čísla speciálních zařízení jednotlivých oddílů jsou: 8-1 (/dev/sda1) a 8-17 /dev/sdb2).
  • preferované minor number RAID pole je 0 (nula), takže se pole automaticky sestaví po spuštění jako /dev/md0.
  • položka update time se používá při sestavování pole, kdy je potřeba zjistit, které členy pole obsahují platná data (novější záznam o poslední aktualizaci pole). Pokud jsou tedy u dvou členů zrcadla (pole RAID1) časy různé, použije se pro sestavení pouze novější člen(!) a starší člen je tedy poté nutno s polem synchronizovat (viz Rekonstrukce degradovaného pole).

Výše uvedené informace se zapisují do superbloku každého členu pole (dřív se superbloky nepoužívaly, takže bylo například velmi obtížné pole po změně zapojení disků správně složit). Informace o poli musí být konzistentní u všech členů pole.

Informace z jednotlivých členů pole, lze zjišťovat jejich přímým dotazováním:

Poznámka
stroj~# mdadm -Q --examine /dev/sda1

Výstup bude obdobný jako tabulka která byla uvedena výše. Navíc v ní však bude uvedeno, kterého člena pole jsme se zeptali. Na základě tohoto výpisu pak můžeme kupř. zjistit:

  • do kterého RAID pole patří resp. patřil
  • kdy byl naposled aktualizován a v jakém stavu se tehdy pole nacházelo.
  • jaké bylo v poli jeho pořadí

To jsou informace důležité především při úpravách na úrovni fyzických zařízení či opravě rozpadlého pole.



Ovládání RAID pole

Ovládáním RAID pole se rozumí:

  • jak z pole odstranit disk
  • jak do pole přidat chybějící disk
  • jak pole správně spustit
  • jak zvětšit kapacitu pole
  • jak pole zastavit

Vyhození disku z pole

Pro správu RAID polí slouží utilita mdadm. Pokud tedy chceme nějaký disk z běžícího pole vyřadit aniž by byl systémem detekován jako vadný, taj jej nejprve musíme pomocí tohoto nástroje jako vadný (failed) označit. Bez toho jádro nedovolí disk z RAID pole odebrat.

Poznámka
stroj~# mdadm /dev/md1 -f /dev/sda3

Je-li disk označen jako vadný, jede pole dál, ovšem jako degradované, ale disk je možné z pole odstranit

Poznámka
stroj~# mdadm /dev/md1 -r /dev/sda3

Nechceme-li, aby pole odstraněné blokové zařízení začalo po restartu znovu používat, je nutné odstranit ze superbloku diskového zařízení informaci o tom že bylo součástí nějakého RAID pole.

Poznámka
stroj~# mdadm --zero-superblock /dev/sda3
Upozornění Před nulováním superbloku musí být blokové zařízení z pole již vyřazeno (viz výše), jinak to nebude mít žádný efekt.

Superblok je nutné vynulovat i u blokových zařízení, které přidáme omylem, protože by se jinak po restartu nemuselo díky tomu pole správně sestavit.

Přidání disku do degradovaného pole

Poznámka
stroj~# mdadm /dev/md1 -a /dev/sda3
Poznámka Pramater -a je zkrácená varianta pro příkaz --add. Existuje také příkaz --re-add. Ten je určen pro přidání zpět do pole disku, který z něj pouze na chvíli vypad. Při jeho aplikaci by se měla omezit synchronizace pouze na ta data která se změnila výpadku. V praxi je však výsledek chování obou parametrů shodný.

Pokud se do degradovaného RAID pole, které není v režimu interní bitmapy doplní chybějící disk, spustí se automaticky po jeho přidání rekonstrukce pole. Její průběh lze sledovat výpisem souboru /proc/mdstat (viz výše).

Upozornění Pokud je přidáno blokové zařízení disku na kterém již probíhá rekonstrukce jiného RAID pole, bude spuštění rekonstrukce odložena, dokud předchozí rekonstrukce nedoběhne. U příslušného pole se pak objeví ve výpisu příznak (DELAYED)

Přidání nového (náhradního) disku

V případě že původní blokové zařízení v RAID poli selhalo, musíte nové zařízení, které ho má nahradit nejprve připravit. Tj. zajistit aby:

  • Neobsahovalo zbytky informací z jiného RAID pole
  • Neobsahovalo zbytky dat z jiného souborového systému, které by mohl vyvolávat konflikty

Přidání vypadlého disku

Jak už bylo zmíněno, disk může z nejrůznějších příčin z pole vypadnout

Zastavení RAID pole

RAID pole lze zastavit pouze v případě, že se nepoužívá (tzn. nesmí být připojené a také s ním nesmí pracovat žádný jiný proces, např. LVM):

Poznámka
stroj~# mdadm -S /dev/md1

Nové sestavení (spuštění) pole

Chceme-li zastavené pole znovu spustit a přitom zachovat na něm uložená data, musí být sestaveno, nikoliv znovu vytvořeno!!!.

Poznámka Příklad sestavení raid pole /dev/md1, identifikovaného záznamem v souboru /etc/mdadm/mdadm.conf
stroj~# mdadm -A /dev/md1

Občas je však potřeba, sestavit pole, které nemá záznam v souboru /etc/mdadm/mdadm.conf. V takovém případě musíme při jeho novém sestavení zároveň předat informaci, podle níž jsou při sestavování příslušného raidu identifikovány jednotlivé disky. U staršího typu raid polí verze 0.90 je to číslo MD zařízení, pod kterým bylo pole původně sestaveno - tzv. Preferred Minor, kdežto u novější verze raid polí 1.20 se používá Array UUID.

Upozornění U starší verze raid polí 0.90, se může stát - v případě kdy jsou disky přehozeny do jiného stroje - že mají stejné Preferred Minor jako disky jiného již běžícího RAID pole. Proto aby při pokusu o sestavení nedošlo k nabourání tohoto běžícího pole, je nutné u přenesených disků hodnotu Preferred Minor změnit. Viz níže.
Poznámka Příklad sestavení raid pole /dev/md1, verze 0.9 identifikovaného hodnotou Preferred Minor
stroj~# mdadm -A /dev/md1 -m1
Poznámka Příklad sestavení raid pole /dev/md1, verze 1.2 identifikovaného hodnotou Array UUID
stroj~# mdadm -A /dev/md1 -u52f39b28:a84c56aa:c351dded:ed2c7fe4
Poznámka Jak je z příkladů zřejmé, pravděpodobnost výskytu stejné hodnoty Array UUID je velmi malá, neboť nejde o pouhé jedno celé číslo, ale řetězec. Přesto to není vyloučeno. K duplicitě může dojít tehdy, pokud bylo původní raid pole "naklonováno" na jiný stroj a po nějakém čase je toto naklonované pole přesunuto zpět na původní stroj.

Při přesunu raid pole na jiný stroj je tedy nutno postupovat následovně:

  1. Nově přidaná bloková zařízení z jiného stroje je nutné nejprve řádně prozkoumat
  2. Nejjednodušší je výsledek zkoumání rovnou přidat do souboru mdadm.conf
  3. V něm pak upravíme příslušné číslo, tak aby nemohlo dojít při sestavení pole ke kolizi, a pokusíme se pole sestavit.

V případě že chceme pole pouze přečíslovat, stačí je zastavit, změnit v souboru mdadm.conf číslo a pole znovu sestavit.

Upozornění Aby se změna projevila i po restartu, musí se po nahození pole aktualizovat ramdisk! Viz výše.

Hodnotu Preferred minor number resp. Array UUID lze zjistit dotazem na příslušný diskový oddíl, který chceme aktivovat. Následující příkaz vypíše informace z MD superbloku na prvním oddíle prvního disku v systému:

Poznámka
stroj~# mdadm -E /dev/sda1

Pole lze znovu spustit (sestavit) i v degradovaném stavu, v takovém případě je však nutné přidat parametr --run:

Poznámka
stroj~# mdadm -A /dev/md1 -m1 --run
Poznámka Pole byste pochopitelně mohli místo pouhého sestavení (spuštění s parametrem -A) také znovu vytvořit - parametr -C (viz výše), ovšem automatickou rekonstrukcí byste mohli poškodit rozhozená data.

Pokud si nejste po havárii jisti konzistencí dat, sestavujte (spouštějte) raději pole vždy tak, aby nemohlo dojít k poškození nesynchronizovaných dat a synchronizaci spusťe až po ověření, že bylo pole správně sestaveno. (To je důležité zvláště u pole typu RAID 5, kterému zhavarovaly dva disky a vy se pokoušíte zachránit data).


Zvětšení kapacity pole

Pro změny v organizaci pole slouží parametr -G (režim grow). Nestačí-li nám tedy již kapacita stávajícího pole, můžeme je (v případě že používáte disky které podporují hotswap - i za běhu) zvětšit.

Pokud nemáte volnou pozici pro nový disk vyhoďte jeden z disků stávajícího RAID pole (čímž se sice pole stane degradovaným, ale na vyjmutém disku vám zůstanou stávající data jako pojista pro případ selhání operace) a místo něj zapojte nový, větší disk.

Pokud nechcete přidat celý disk, tak na něm vytvořte nový, větší logický oddíl a ten přidejte do běžícího pole.

Proběhne rekonstrukce pole, ovšem to zůstane v původní velikosti (RAID nevyužije větší oddíl celý).

Po ukončení synchronizace vyhoďte další starý disk. Ten rovněž vyměňte za nový, který rozdělíte stejně jako ten předchozí a znovu nechte provést rekonstrukci.

V tomto okamžiku již máte k dispozici kompletní pole, které je sice menší, než je kapacita přidaných oddílů, ale které lze snadno roztáhnout za běhu příkazem:

mdadm -G /dev/md1 --size max

Po roztažení se nově přidaný kus pole automaticky zesynchronizuje, ale vy již v tuto chvíli můžete zvětšit souborový systém, který se na RAID poli nachází. Podporuje-li vaše jádro a použitý souborový systém změnu velikosti za běhu (online-resize), není ani potřeba souborový systém odpojovat. Stačí pouze zadat příslušný příkaz.

V případě, že vaše jádro nedovoluje zvětšování souborového systému za běhu, je nutné souborový systém odpojit (příkazem umount), zvětšit a poté znovu připojit. Během toho pochopitelně není nutné čekat na to než doběhne synchronizace.


Bootovatelnost: nahrání GRUB bootloaderu do MBR nového

Pokud je na disku systém a má být bootovatelný, musíme ještě do MBR nainstalovat grub. O tom, že disk nemá v MBR boot loader, se můžete přesvědčit třeba takto:

xeric:~# dd if=/dev/sdd bs=512 count=1 | hexdump
1+0 records in
1+0 records out
512 bytes (512 B) copied0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
, 2.5337e-05 s, 20.2 MB/s
00001b0 0000 0000 0000 0000 0000 0000 0000 0180
00001c0 0001 fefd ffff 003f 0000 2941 0254 fe00
00001d0 ffff fefd ffff 2980 0254 f08b 0380 fe00
00001e0 ffff fefd ffff 1a0b 05d5 2b76 1747 fe00
00001f0 ffff fefd ffff 4581 1d1c 8e3a 1d1a aa55
0000200

Vidíme, že až do adresy 0x1b0 jsou v MBR samé nuly, což asi nebude bootloader.

Proto uděláme toto:

#grub
grub> find /boot/grub/stage1

Tento příkaz najde všechny disky, na kterých je soubor "stage1", který GRUB potřebuje při boot-u. Příkaz vypíše třeba toto:

find /boot/grub/stage1
 (hd0,0)
 (hd1,0)
 (hd3,0)

Můj nový disk je "hd3", takže udělám toto:

grub> root (hd3,0)
root (hd3,0)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd3)
setup (hd3)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd3)"...  17 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd3) (hd3)1+17 p (hd3,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.
grub> quit
quit

O tom, že se dílo podařilo, se můžete přesvědčit opět příkazem

xeric:~# dd if=/dev/sdc bs=512 count=1 | hexdump
1+0 records in
1+0 records out
512 bytes (512 B) copied, 2.2194e-05 s, 23.1 MB/s
0000000 48eb 0090 0000 0000 0000 0000 0000 0000
0000010 0000 0000 0000 0000 0000 0000 0000 0000
*
0000030 0000 0000 0000 0000 0000 0000 0000 0203
0000040 00ff 2000 0001 0000 0200 90fa f690 80c2

(atd)

0000190 7369 006b 6552 6461 2000 7245 6f72 0072
00001a0 01bb b400 cd0e ac10 003c f475 00c3 0000
00001b0 0000 0000 0000 0000 0000 0000 0000 0180
00001c0 0001 fefd ffff 003f 0000 2941 0254 fe00
00001d0 ffff fefd ffff 2980 0254 f08b 0380 fe00
00001e0 ffff fefd ffff 1a0b 05d5 2b76 1747 fe00
00001f0 ffff fefd ffff 4581 1d1c 8e3a 1d1a aa55
0000200

Přejmenování RAID zařízení: mdX->mdY

Tuto operaci budete potřebovat asi jen v případě, kdy budete chtít přidat disky s RAIDem z jednoho počítače do jiného, ve kterém už RAID je, a budete jim chtít přidělit nějaké vaše vlastní jméno. Příklad přejmenování md0 na md6:

mdadm --stop /dev/md0
mdadm --assemble /dev/md6 [--super-minor=0] --update=super-minor /dev/sda5 /dev/sdb5

První příkaz stopne RAID na /dev/md0, aby mohl provést změny v superblocích jeho disků. Druhý příkaz poskládá ("assemble") RAID /dev/md6 z disků, které byly součástí /dev/md0, což zařídí nepovinná podmínka "--super-minor=0". Vysvětlení: Každý disk, který je součástí RAIDu, má ve svém superbloku zapsáno číslo "minor", které odpovídá číslu N jména RAID zařízení /dev/mdN. Proto také u libovolného disku, který byl součástí Linux RAID pole a který připojíte do počítače, můžete zjistit jméno mdN RAID zařízení, do kterého disk patřil, pomocí příkazu "mdadm --examine --scan /dev/sdXY"

Option "--update=super-minor" pak zařídí, aby se při operaci assemble v superblocích disku přepsalo minor číslo disku z (/dev/md)0 na (/dev/md)6 Příklad.jpg

Je třeba updatovat ramdisk..!!!

update-initramfs -u


Zvětšení kapacity RAID zařízení a roztažení LVM

  1. Z RAID pole, které chci zvětšit, odeberu 1 disk (přes --fail a --remove)
  2. Přidám do RAID pole nový, větší disk (či diskový oddíl) a po přidání roztáhnu RAID pole na maximální dostupnou kapacitu ( mdadm --grow /dev/mdX --size=max )
  3. Poté vyhodím i druhý původní disk (opět přes --fail a --remove) a místo něj přidám do RAID pole druhé nové (větší) blokové zařízení, aby se mohlo pole plně zrekonstruovat.
  4. Nakonec roztáhnu LVM physical volume přes celou kapacitu RAID pole ( pvresize /dev/mdX )

Potřebuju změnit velikost partitions (včetně systémového), na nové není místo, co dělat?

  • zapojte do systému jakýkoli nový disk, na kterém vytvoříme správný partitioning.
  • boot from SystemRescueCD (výhoda: malé CD, které umí 32bit i 64bit a má všechny nástroje pro správu disků)
  • Stopněte md0, pokud jede:
mdadm --stop /dev/md0
  • a nahoďte si jej pod jiným jménem (nebojte, změna jména nemá žádné trvalé následky:)
mdadm --assemble /dev/md10 /dev/sd?? /dev/sd??
  • vytvořte nový md0 s novým diskem
mdadm --create /dev/md0 --level=raid1 --raid-devices=1 /dev/nejaky_novy_disk
mkfs.ext2 /dev/md0
  • namountujte obě RAID zařízení:
mount /dev/md10 /media/old
mount /dev/md0 /media/new
  • zkopírujte obsah:
rsync -a /media/old /media/new
  • nainstalujte grub:
mount -o bind /dev/ /media/new/dev
mount -o bind /proc/ md0/proc
mount -o bind /sys/ md0/sys
chroot /dev/new
grub-install /dev/md0
  • zkuste, jestli nabootujete. Já jsem nenabootoval a musel jsem udělat ještě toto:
#grub
grub> find /boot/grub/stage1
find /boot/grub/stage1
 (hd0,0)
 (hd1,0)
 (hd3,0)
grub> root (hd0,0)
root (hd0,0)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd0)
setup (hd0)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  17 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd0) (hd0)1+17 p (hd0,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.
grub> root (hd1,0)
root (hd1,0)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd1)
setup (hd1)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd1)"...  17 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd1) (hd1)1+17 p (hd1,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.
grub> root (hd3,0)
root (hd3,0)
 Filesystem type is ext2fs, partition type 0xfd
grub> setup (hd3)
setup (hd3)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/e2fs_stage1_5" exists... yes
 Running "embed /boot/grub/e2fs_stage1_5 (hd3)"...  17 sectors are embedded.
succeeded
 Running "install /boot/grub/stage1 (hd3) (hd3)1+17 p (hd3,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
Done.
grub> quit
quit
  • Obsah boot sektoru si můžete prohlédnout např. takto:
dd if=/dev/sda bs=512 count=1 | hexdump
  • pokud ano, zkopírujte na nový disk i obsah ostatních disků
  • Namountuj
  • mount -o bind /dev/ /media/md0

Zdroje