- p°edchozφ Φlßnek - nßsledujφcφ Φlßnek - obsah - ·vodnφ strßnka -

LinuxovΘ noviny 07-08/2001

Softwarov² RAID pod Linuxem

David HΣring, 28. Φervence 2001

Definice RAIDu

Na rozdφl od jin²ch hardwarov²ch problΘm∙ jsou v²padky disk∙ obvykle spojeny s Φasov∞ nßroΦnou obnovou dat ze zßloh. T∞mto problΘm∙m se ale m∙╛eme vyhnout pou╛itφm redundantnφch diskov²ch polφ RAID, kterß jsou v∙Φi v²padk∙m jednotliv²ch disk∙ odoln∞j╣φ. OznaΦenφ RAID pochßzφ z anglickΘho "Redundant Array of Inexpensive Disks" nebo takΘ "Redundant Array of Independent Disks". Jednß se tedy o n∞kolik disk∙ slouΦen²ch do jednoho logickΘho svazku, kter² zpravidla zaji╣╗uje urΦitou redundanci dat, dφky kterΘ je pak odoln² v∙Φi hardwarov²m v²padk∙m n∞kterΘho z disk∙. I kdy╛ je v nßzvu obsa╛eno slovφΦko "redundant", ne v╣echny typy RAIDu jsou skuteΦn∞ redundantnφ. Zatφmco n∞kterΘ typy RAIDu jsou navr╛eny s ohledem na maximßlnφ bezpeΦnost dat, jinΘ jsou naopak optimalizovßny na rychlost.

HardwarovΘ a softwarovΘ implementace RAIDu

RAID lze provozovat v podstat∞ dvojφm zp∙sobem. Bu∩ je realizovßn v hardwaru, co╛ obnß╣φ specißlnφ °adiΦ osazen² procesorem a zpravidla vybaven² vlastnφ pam∞tφ, kterß slou╛φ jako cache. Ve╣kerΘ funkce RAIDu plnφ °adiΦ a z pohledu operaΦnφmu systΘmu se chovß jako jedin² disk. Tato °e╣enφ b²vajφ pom∞rn∞ drahß (Mylex, DPT - nynφ Adaptec, ICP Vortex, velcφ v²robci PC jako HP, IBM, Compaq apod. majφ svΘ vlastnφ implementace). P°ednostφ hardwarov²ch °e╣enφ b²vß maximßlnφ spolehlivost a ve srovnßnφ se softwarovou variantou RAIDu dovedou odlehΦit zßt∞╛i systΘmu. RAID ov╣em takΘ m∙╛e b²t realizovßn pat°iΦn²m ovladaΦem na ·rovni operaΦnφho systΘmu a spousta operaΦnφch systΘm∙ to takΘ dnes umo╛≥uje. Toto °e╣enφ m∙╛e b²t za jist²ch okolnostφ flexibiln∞j╣φ a rychlej╣φ, ale takΘ nßroΦn∞j╣φ na systΘmovΘ prost°edky - zejmΘna na Φas procesoru. V poslednφch letech se setkßvßme i s nap∙l hardwarov²mi/softwarov²mi implementacemi RAIDu, kdy hardware obsahuje jen minimßlnφ podporu a v∞t╣inu prßce d∞lß ovladaΦ - tato varianta je levnß, ale °ada produkt∙ tΘto kategorie je nevalnΘ kvality a v²konu. Tento Φlßnek je zam∞°en² na softwarov² RAID pod Linuxem.

Teorie fungovßnφ RAIDu

Ne╛ se zam∞°φme na detaily softwarovΘho RAIDu pod Linuxem, podφvßme se na princip fungovßnφ jednotliv²ch typ∙ RAIDu a jejich vlastnosti.

RAID 0 (Nonredundant striped array)

Tento typ je urΦen pro aplikace, kterΘ vy╛adujφ maximßlnφ rychlost a nenφ redundantnφ. Naopak je pot°eba vzφt v ·vahu, ╛e pravd∞podobnost v²padku takovΘho pole roste s poΦtem disk∙. Ideßlnφ pou╛itφ p°edstavujφ audio/video streamingovΘ aplikace, eventußln∞ databßze a obecn∞ aplikace, p°i kter²ch Φteme sekvenΦn∞ velkß mno╛stvφ dat. Zßkladnφ jednotkou pole je tzv. stripe (z angl. "stripe", Φesky pruh), co╛ je blok dat urΦitΘ velikosti (b∞╛n∞ 4-64kB v zßvislosti na aplikaci). Po sob∞ jdoucφ data jsou pak v poli rozlo╛ena st°φdav∞ mezi disky do "strip∙" takov²m zp∙sobem, aby se p°i sekvenΦnφm Φtenφ/zßpisu p°istupovalo ke v╣em disk∙m souΦasn∞. Tφm je zaji╣t∞na maximßlnφ rychlost jak p°i Φtenφ tak i zßpisu, ale souΦasn∞ je tφm dßna takΘ zranitelnost pole. P°i v²padku kterΘhokoliv disku se stßvajφ data v podstat∞ neΦitelnß (respektive nekompletnφ). RAID 0 b²vß oznaΦovßn rovn∞╛ jako striping. Proto╛e nenφ redundantnφ, mß nejv²hodn∞j╣φ pom∞r cena/kapacita. PoΦet disk∙ je libovoln². Je ov╣em t°eba pamatovat na to, ╛e s rostoucφm poΦtem disk∙ v poli roste i pravd∞podobnost v²padku pole (proto╛e v²padek libovolnΘho disku znamenß havßrii celΘho pole); RAID 0 je tedy velmi rychl², ale mΘn∞ bezpeΦn² ne╛ samostatn² disk.

RAID 1 (Mirrored array)

RAID 1 je naopak maximßln∞ redundantnφ. Rychlost Φtenφ m∙╛e b²t oproti samostatnΘmu disku v²razn∞ vy╣╣φ, rychlost zßpisu je stejnß jako u samostatnΘho disku. Funguje tak, ╛e data jsou p°i zßpisu "zrcadlena" na v╣echny disky v poli (tedy v p°φpad∞ RAIDu 1 tvo°enΘho dv∞ma disku jsou data duplikovßna apod.). P°i Φtenφ lze vyu╛φt vφcero kopiφ dat a podobn∞ jako u RAIDu 0 Φφst za v╣ech disk∙ souΦasn∞. Tento typ pole je urΦen pro aplikace s d∙razem na maximßlnφ redundanci. V²hodou tohoto redundantnφho °e╣enφ je stabilnφ v²kon i v p°φpad∞ v²padku disku, nev²hodou je pom∞r cena/kapacita. PoΦet disk∙ b²vß bu∩ 2 anebo libovoln², Φφm v∞t╣φ poΦet disk∙, tφm v∞t╣φ redundance a odolnost proti v²padku.

RAID 2 (Parallel array with ECC)

Pole tohoto typu jsou dnes ji╛ historiφ, proto╛e dne╣nφ disky majφ vlastnφ opravnΘ mechanismy a uchovßvajφ ECC informace pro ka╛d² sektor samy. V polφch tohoto typu se stripovalo po jednotliv²ch sektorech a Φßst disk∙ pole byla vyhrazena pro uklßdßnφ ECC informacφ. JakΘkoliv Φtenφ i zßpis proto zpravidla zahrnovalo p°φstup ke v╣em disk∙m pole, co╛ bylo p°ekß╛kou vy╣╣φho v²konu zejmΘna u aplikacφch pracujφcφch se v∞t╣φmi kusy dat. Tento typ nenφ redundantnφ.

RAID 3 (Parallel array with parity)

TakΘ tento typ polφ se ji╛ nepou╛φvß, jednß se o p°edch∙dce RAIDu 4. Stripovalo se po sektorech, ale jeden disk byl vyhrazen jako paritnφ, co╛ zaji╣╗ovalo redundanci (princip zaji╣t∞nφ redundance je stejn² jako u RAIDu 4 a 5, kter² je popsßn nφ╛e). Proto╛e i v tomto p°φpad∞ se stripovalo po sektorech, jakΘkoliv Φtenφ i zßpis zpravidla zahrnovalo p°φstup ke v╣em disk∙m pole.

RAID 4 (Striped array with parity)

Raid 4 je redundantnφ pole, kterΘ se dnes ji╛ pou╛φvß mßlo. FunkΦn∞ je podobnΘ RAIDu 5, kter² je ale v²konn∞j╣φ. Funguje tak, ╛e jeden disk je vyhrazen jako tzv. paritnφ disk. Na paritnφm disku je zaznamenßn kontrolnφ souΦet (operace XOR p°es data stejnΘ pozice jednotliv²ch disk∙). Pokud tedy dojde k v²padku n∞kterΘho z datov²ch disk∙, lze data rekonstruovat z dat zbyl²ch disk∙ a parity ulo╛enΘ na paritnφm disku. RAID 4 je odoln² v∙Φi v²padku libovolnΘho jednoho disku a mß tedy p°φzniv² pom∞r cena/kapacita. Paritnφ disk ale p°edstavuje ·zkΘ hrdlo tΘto architektury p°i zßpisech, proto╛e ka╛d² zßpis znamenß takΘ zßpis na paritnφ disk. Mimimßlnφ poΦet disk∙ je 3.

RAID 5 (Striped array with rotating parity)

Tento typ poskytuje redundanci v∙Φi v²padku libovolnΘho jednoho disku s dobr²m pom∞rem cena/kapacita a v²konem. RAID 5 je vylep╣enß varianta RAIDu 4 v tom, ╛e parita nenφ ulo╛ena na jednom vyhrazenΘm disku, ale je rozmφst∞na rovnom∞rn∞ mezi v╣emi disky pole, Φφm╛ se odstranφ ·zkΘ hrdlo architektury RAIDu 4.

Paritu lze spoΦφtat bu∩ tak, ╛e skuteΦn∞ naΦteme a XORujeme data z odpovφdajφcφch datov²ch strip∙ v╣ech disk∙ (takto se parita poΦφtß p°i inicializaci pole, vy╛aduje to tedy p°φstup ke v╣em disk∙m). Ve druhΘm p°φpad∞ naΦteme p∙vodnφ data z datovΘho stripu, kterß se majφ zm∞nit, provedeme XOR s nov²mi daty a v²sledek je╣t∞ XORujeme s p∙vodnφ hodnotou parity (takto se parita poΦφtß na ji╛ inicializovanΘm b∞╛φcφm poli). Zßpis dat tedy p°edstavuje dvoje Φtenφ (dat a parity), v²poΦet parity a dvojφ zßpis (op∞t dat a parity). PoΦet p°φstup∙ na disk p°i zßpisu je v tomto p°φpad∞ konstantnφ bez ohledu na poΦet disk∙ v poli - p°istupuje se v╛dy ke dv∞ma disk∙m - a to takΘ mß za nßsledek ni╛╣φ v²kon tohoto typu pole ve srovnßnφ s redundantnφm RAIDem 1.

V degradovanΘm re╛imu (degradovan² re╛im znamenß stav, kdy je n∞kter² z disk∙ z pole vy°azen kv∙li hardwarovΘ chyb∞) se pak musejφ data ulo╛enß na vadnΘm disku odvodit z dat zb²vajφcφch disk∙ a parity. Na rozdφl od redundantnφho RAIDu 1, kde v²padek disku obvykle neznamenß v²razn² pokles v²konu, vykazuje RAID 5 v degradovanΘm re╛imu v²razn∞ snφ╛en² v²kon zejmΘna p°i Φtenφ. Minimßlnφ poΦet disk∙ pro tento typ diskovΘho pole jsou 3.

Kombinace vφce typ∙ polφ

Z definic v²╣e popsan²ch typ∙ polφ vypl²vß, ╛e redundantnφ pole nejsou tak rychlß, jak bychom si mohli p°ßt a naopak u RAIDu 0 nßm chybφ redundance. Existuje ov╣em mo╛nost, jak v²hody jednotliv²ch typ∙ diskov²ch polφ spojit. Tato metoda spoΦφvß ve vytvo°enφ kombinovan²ch polφ, kdy disky v poli urΦitΘho typu jsou samy tvo°eny poli jinΘho typu. P°φkladem m∙╛e b²t nap°. RAID 1+0, kdy jsou pole typu RAID 1 dßle slouΦeny do RAIDu 0. TakovΘ pole je pak redundantnφ (toleruje v²padek a╛ dvou disk∙), rychlej╣φ zejmΘna v zßpisech ne╛ samotn² RAID 1, a mß lep╣φ pom∞r cena/kapacita ne╛ RAID 1 (velikost je zde n/2 * disk a minimßlnφ poΦet disk∙ je pak 4. Dal╣φ mo╛nostφ je t°eba RAID 0+1, RAID 5+0, RAID 5+1 apod.

Jak RAID o╣et°φ v²padek disku

V╣echny typy redundantnφch polφ obvykle umo╛≥ujφ nakonfigurovat krom∞ aktivnφch disk∙ je╣t∞ 1 Φi vφce rezervnφch disk∙. Aktivnφmi disky zde rozumφme disky, kterΘ jsou souΦßstφ funkΦnφho pole. V p°φpad∞ v²padku n∞kterΘho z aktivnφch disk∙ pak m∙╛e systΘm mφsto vadnΘho disku okam╛it∞ zaΦφt pou╛φvat disk rezervnφ. Po aktivaci rezervnφho disku do pole systΘm provede na pozadφ (tedy bez naru╣enφ dostupnosti pole) rekonstrukci pole a jakmile je rekonstrukce hotova, je pole op∞t pln∞ redundantnφ. Rekonstrukcφ je mφn∞na bu∩ synchronizace obsahu novΘho disku s ostatnφmi aktivnφmi disky (v prφpad∞ RAIDu 1), anebo rekonstrukce obsahu p∙vodnφho vadnΘho disku na zßklad∞ redundantnφ informace (jednß-li se o RAID 4 nebo 5). Po dobu, ne╛ rekonstrukce prob∞hne, se pole nachßzφ v tzv. degradovanΘm re╛imu, kdy v zßvislosti na konfiguraci nemusφ b²t redundantnφ a v p°φpad∞ RAIDu 5 se to projevφ snφ╛en²m v²konem (odtud nßzev "degradovan² re╛im"). Je samoz°ejm∞ mo╛nΘ pole provozovat bez rezervnφch disk∙ a disk vym∞nit pozd∞ji manußln∞. Detailn∞ se na v²m∞nu disk∙ a rekonstrukci polφ je╣t∞ podφvßme pozd∞ji.

Redundantnφ pole neznamenajφ konec zßloh

Redundantnφ diskovß pole jsou odolnß pouze v∙Φi v²padk∙m urΦitΘho poΦtu disk∙. Neochrßnφ p°ed v²padkem napßjenφ, po╣kozenφm souborovΘho systΘmu p°i pßdu celΘho systΘmu nebo chybou administrßtora. Proto je pot°eba myslet i na dal╣φ metody ochrany dat - nap°. na zßlo╛nφ zdroje napßjenφ (UPS), ╛urnßlovacφ souborovΘ systΘmy apod. a v ka╛dΘm p°φpad∞ pravideln∞ zßlohovat.

Typy polφ podporovan²ch Linuxov²m ovladaΦem RAIDu

A╛ doposud jsme se zab²vali pouze teoriφ fungovßnφ diskov²ch polφ, podφvejme se tedy jak to vypadß se softwarov²m RAIDem v Linuxu. Softwarovß implementace RAIDu pod OS Linux podporuje 5 typy diskov²ch polφ:

  • Linear - toto v podstat∞ nenφ RAID, jednß se o mo╛nost "pospojovßnφ" vφce disk∙ do jednoho. Co se t²Φe rychlosti, neli╣φ se p°φli╣ od v²konu samostatn²ch disk∙. Nenφ redundantnφ, v²hodou v╣ak je nap°. oproti RAIDu 0 to, ╛e se v p°φpad∞ havßrie jednoho z disk∙ dajφ data ze zb²vajφcφch disk∙ snßze obnovit, proto╛e se nestripuje.
  • RAID 0 - zde je volitelnß velikost stripu; tato v²razn∞ (v zßvislosti na aplikaci) ovliv≥uje v²kon RAIDu.
  • RAID 1 - oproti klasickΘ definici RAIDu 1 kdy se disky spojujφ pouze do pßr∙, pod Linuxem m∙╛eme vytvo°it RAID 1 i z vφce ne╛ dvou aktivnφch disk∙.
  • RAID 4 - je sice implementovßn, ale funkΦn∞ nahrazen RAIDem 5
  • RAID 5 - op∞t je zde volitelnß velikost stripu, kterß ovliv≥uje v²kon RAIDu.

Typ       poΦet disk∙    kapacita      redundance   shrnutφ
--------------------------------------------------------------------------------
Linear    2 a vφce       n x disk      ne           nenφ raid, 
                                                    pouze slouΦenφ disk∙
			 
RAID 0    2 a vφce       n x disk      ne           maximßlnφ v²kon p°i Φtenφ 
                                                    i zßpisu
		  	
RAID 1    2 a vφce       disk          ano          maximßlnφ redundance,
                                                    bez v²raznΘ degradace 
                                                    v²konu p°i v²padku, 
                                                    rychlej╣φ Φtenφ,
                                                    vy╣╣φ cena
			
RAID 4    3 a vφce       (n-1) x disk  ano          nepou╛φvß se, 
                                                    nahrazen RAID 5
			 
RAID 5    3 a vφce       (n-1) x disk  ano          v²hodn² pom∞r cena/kapacita

tabulka: shrnutφ pou╛φvan²ch typ∙ SW RAIDu

Historie, dostupnost, omezenφ

P∙vodnφ ovladaΦ "MetaDisku" (odtud nßzev ovladaΦe - md) napsal Marc Zyngier. Implementace zpoΦßtku del╣φ dobu podporovala pouze typy linear, RAID 0 a RAID 1. Pozd∞ji ovladaΦ vyvφjeli zejmΘna Ingo Molnßr, Gadi Oxman a nynφ Neil Brown. P°ibyla podpora dal╣φch typ∙ polφ a podpora bootovßnφ z RAIDu 0 a 1. V souΦasnΘ dob∞ se m∙╛eme setkat se dv∞ma verzemi ovladaΦe: verzφ 0.42, kterou obsahujφ Φistß jßdra °ady 2.2.x a verzφ 0.90, kterß se nachßzφ v jßdrech °ady 2.4.x. Jßdra 2.2.x v∞t╣iny distribucφ ale obsahujφ podporu RAIDu verze 0.90, ovladaΦ tΘto verze pro jßdra 2.2.x je k dispozici ve form∞ zßplaty jßdra. K provozovßnφ softwarovΘho RAIDu je zapot°ebφ krom∞ jadernΘho ovladaΦe takΘ sada utilit raidtools (d°φve mdtools), kterΘ musejφ odpovφdat verzi jadernΘho ovladaΦe (raidtools 0.42 a raidtools 0.90).

OvladaΦe RAIDu jsou testovßny p°edev╣φm na platform∞ x86, ale lze je provozovat i na platformßch Sun Φi Alpha (a mo╛nß i dal╣φch, ov╣em na t∞chto exotiΦt∞j╣φch platformßch jsou mΘn∞ odlad∞ny). Pro jßdra °ady 2.2.x platφ urΦitß omezenφ, kterß vypl²vajφ z architektury tΘto °ady jader:

  • na redundantnφm poli (tedy RAID 1 a 5) nenφ mo╛no bezpeΦn∞ swapovat (a to ani do souboru) v pr∙b∞hu rekonstrukce pole;
  • na redundantnφ pole (tedy RAID 1 a 5) nenφ mo╛no provozovat ╛urnßlovacφ souborov² systΘm (lΘpe °eΦeno, pokud probφhß na RAIDu 1 rekonstrukce pole, nesmφ se pou╛φvat ╛urnßlovßnφ, na RAIDu 5 ╛urnßlovßnφ pou╛φt nelze v∙bec);
  • pole nelze libovoln∞ kombinovat (p°esn∞ji lze vytvo°it na prvnφ pohled funkΦnφ kombinovanΘ pole, ale v²padek disku m∙╛e zp∙sobit pßd celΘho pole). KonkrΘtn∞ je mo╛nΘ vytvß°it pole 0+1 a kombinace polφ 1,4 a 5. Nelze ale pou╛φt pole [145]+0.

Pro jßdra °ady 2.4 tato omezenφ neplatφ.

Konfigurace

Konfigurace RAIDu verze 0.90 pou╛φvß konfiguraΦnφ soubor /etc/raidtab (na rozdφl od verze 0.42, kde byla konfigurace ulo╛ena v /etc/mdtab), ve kterΘm se pou╛φvajφ nßsledujφcφ direktivy:
  • raiddev: touto direktivou definice pole zaΦφnß, nßsleduje oznaΦenφ pole. Svazky softwarovΘho RAIDu se oznaΦujφ md1 a╛ mdX.
  • raid-level: nßsleduje direktivu raiddev, uvßdφme zde typ pole (-1 = linear, 0 = RAID 0, 1 = RAID 1, 5 = RAID 5).
  • persistent-superblock: tato direktiva bude popsßna nφ╛e, t²kß se kompatibility se star╣φ verzφ RAIDu.
  • chunk-size: velikost stripu, maximßlnφ velikost je 4MB (co╛ je dßno konstantou MAX_CHUNK_SIZE ovladaΦe), udßvß se v kB.
  • nr-raid-disks: zde uvßdφme kolik diskov²ch oddφl∙ bude souΦßstφ pole (maximßlnφ poΦet je v jßdrech 2.2.x 12, ale jsou k dispozici zßplaty, kterΘ tento limit podstatn∞ zvy╣ujφ)
  • nr-spare-disks: poΦet rezervnφch disk∙ v poli
  • direktiva device jmΘno_oddφlu nßsledovanß jednou z direktiv raid-disk, spare-disk, parity-disk nebo failed-disk: tyto direktivy deklarujφ p°φslu╣nΘ oddφly, kterΘ budou souΦßstφ pole.
  • raid-disk: tento oddφl bude aktivnφm oddφlem.
  • spare-disk: tento oddφl bude slou╛it jako rezervnφ.
  • parity-disk: tento oddφl bude slou╛it jako paritnφ disk (RAID 4).
  • failed-disk: tento oddφl bude p°i inicializaci pole p°eskoΦen (mß v²znam pouze p°i sestavovßnφ pole v degradovanΘm stavu, viz diskuse nφ╛e).
  • parity-algorithm: specifikuje schΘma rozlo╛enφ parity u RAIDu 5 (mo╛nosti jsou: left-symmetric, right-symmetric, right-asymmetric; z podporovan²ch je obecn∞ nejrychlej╣φ left-symmetric).
Konfigurace softwarovΘho RAIDu je popsßna v p°φslu╣nΘm dokumentu HOWTO.

Star╣φ verze softwarovΘho RAIDu (0.40 a╛ 0.51) pou╛φvaly konfiguraΦnφ soubor /etc/mdtab. P°esto╛e tato star╣φ verze ovladaΦe je souΦßstφ "Φist²ch jader" 2.2.x, je zastaralß a nebudeme se jφ zde v∙bec zab²vat. Pro ·plnost je star╣φ verze RAIDu dokumentovanß v p°φslu╣nΘm HOWTO.

P°φklady konfiguracφ

P°φklad konfigurace pole linear. M∞jme pole typu linear slo╛enΘ ze dvou oddφl∙:

raiddev                 /dev/md0
raid-level              -1
persistent-superblock   1
nr-raid-disks           2
nr-spare-disks          0
device                  /dev/sda1
raid-disk               0
device                  /dev/sdb1
raid-disk               1

P°φklad konfigurace RAID 0. M∞jme diskovΘ pole RAID 0 slo╛enΘ ze dvou oddφl∙, sda1 a sdb1, velikost stripu je 16 kB:

raiddev                 /dev/md0
raid-level              0
persistent-superblock   1
chunk-size              16
nr-raid-disks           2
nr-spare-disks          0
device                  /dev/sda1
raid-disk               0
device                  /dev/sdb1
raid-disk               1

P°φklad konfigurace RAID 1. M∞jme diskovΘ pole RAID 1 slo╛enΘ ze dvou oddφl∙ a s jednφm rezervnφm oddφlem:

raiddev                 /dev/md1
raid-level              1
nr-raid-disks           2
nr-spare-disks          1
device                  /dev/sda1
raid-disk               0
device                  /dev/sdb1
raid-disk               1
device                  /dev/sdc1
spare-disk              0

P°φklad konfigurace pole RAID 5 s rozlo╛enφm parity "left-symmetric", velikostφ stripu 4 kB a jednφm rezervnφm oddφlem:

raiddev                 /dev/md2
raid-level              5
nr-raid-disks           3
chunk-size              4
parity-algorithm        left-symmetric
nr-spare-disks          1
device                  /dev/sda1
raid-disk               0
device                  /dev/sdb1
raid-disk               1
device                  /dev/sdc1
raid-disk               2
device                  /dev/sdc1
spare-disk              0

Obslu╛n² software - Raidtools

BalφΦek raidtools (nahrazuje star╣φ balφΦek mdtools urΦen² pro star╣φ verze ovladaΦe RAIDu) obsahuje obslu╛nΘ utility nezbytnΘ k manipulaci s diskov²mi poli:
  • mkraid: pro inicializaci polφ;
  • raidstart: pro spou╣t∞nφ diskov²ch polφ;
  • raidstop: pro vypnutφ diskov²ch polφ;
  • raidhotadd: p°idß nov² diskov² oddφl do aktivnφho diskovΘ pole (nßhradou za vadn² oddφl, pokud jsou v╣echny oddφly pole funkΦnφ, p°idß nov² oddφl jako rezervnφ - "spare-disk"). Nelze tedy pou╛φt pro roz╣φ°enφ kapacity pole;
  • raidhotremove: odejme vadn² diskov² oddφl z aktivnφho diskovΘho pole;
  • raidsetfaulty: oznaΦφ funkΦnφ diskov² oddφl jako vadn², tφm umo╛nφ jeho odejmutφ z pole p°φkazem raidhotremove (mo╛nΘ vyu╛itφ nap°. p°i testovßnφ nebo v²m∞nßch funkΦnφch disk∙); v poslednφch distribucφch Red Hat se pro tento ·Φel pou╛φvß utilita raidhotgenerateerror;
  • raid0run: utilita pro spou╣t∞nφ star╣φch polφ typu linear nebo RAID 0 bez perzistentnφch superblok∙ (viz nφ╛e "Perzistentnφ superbloky a RAID 0 / linear").

V budoucnu z°ejm∞ budou utility z balφΦku raidtools nahrazeny jedinou utilitou mdctl, kterou vyvφjφ Neil Brown. Prvnφ verze tΘto utility jsou ji╛ k dispozici. Utilita mdctl nemusφ pou╛φvat ╛ßdn² konfiguraΦnφ soubor, v╣e pot°ebnΘ lze zadat na p°φkazovΘ °ßdce, anebo to mdctl zjistφ anal²zou RAID superblok∙ ulo╛en²ch na discφch (podobn∞ funguje automatickΘ startovßnφ polφ jßdrem p°i bootu). Cφlem autora je tedy p°idat v²hody a robustnost, kterou poskytuje vlastnost raid autodetect jßdra a zßrov∞≥ se vyhnout potencißlnφm konflikt∙m mezi neaktußlnφ konfiguracφ v souboru raidtab a skuteΦnou konfiguracφ polφ, ke kter²m Φasem m∙╛e dojφt, pokud pou╛φvßme raidtools. Zatφm je utilita mdctl ve stavu v²voje, tak╛e jejφ ostrΘ pou╛itφ je╣t∞ nelze doporuΦit.

Poznßmka na vysv∞tlenou: Soubor raidtab odrß╛φ konfiguraci polφ v dob∞ jejich sestavenφ, ov╣em pokud t°eba pozd∞ji vym∞nφme nebo p°esuneme n∞kterΘ disky, nemusφ ji╛ odrß╛et skuteΦnou konfiguraci. Pokud tedy z n∞jakΘho d∙vodu pot°ebujeme pole znovu inicializovat anebo ho jen startujeme pomocφ raidstart, nesmφme zapomenout soubor raidtab ruΦn∞ upravit, abychom se u╣et°ili v budoucnu nep°φjemnostφ.

Inicializace polφ

Jakmile mßme odpovφdajφcφm zp∙sobem rozd∞lenΘ disky a p°ipraven² konfiguraΦnφ soubor /etc/raidtab, m∙╛eme pole inicializovat utilitou mkraid, kterß pole sestavφ a aktivuje. Pokud zaklßdßme pole s perzistentnφmi RAID superbloky (viz nφ╛e), pak mkraid vypφ╣e i pozici RAID superblok∙:

# mkraid  /dev/md5

handling MD device /dev/md5
analyzing super-block
disk 0: /dev/sda7, 20163568kB, raid superblock at 20163456kB
disk 1: /dev/sdb7, 20163568kB, raid superblock at 20163456kB

Po ·sp∞╣nΘ inicializaci bychom m∞li v souboru /proc/mdstat, kter² obsahuje informace a aktivnφch polφch vid∞t odpovφdajφcφ zßznam, nap°:

$ cat /proc/mdstat 

Personalities : [raid0] [raid1] [raid5] 
read_ahead 1024 sectors
md0 : active raid1 sdb1[1] sda1[0] 131968 blocks [2/2] [UU]

PotΘ nßm nic nebrßnφ pole zformßtovat nap°. pomocφ mke2fs, pokud chceme na poli provozovat souborov² systΘm ext2. Utilita mke2fs akceptuje volbu -R stride=X, kterß udßvß kolik blok∙ souborovΘho systΘmu obsahuje 1 "stripe" pole. Tφm pßdem je takΘ vhodnΘ zadat ruΦn∞ velikost bloku (parametr -b). Nap°. m∞jme pole typu RAID 0 s velikostφ stripu 16 kB. Pokud budeme chtφt pou╛φt velikost bloku souborovΘho systΘmu 4 kB, zadßme:

mke2fs /dev/md0 -b 4096 -R stride=4

Raid autodetect anebo raidstart?

Nynφ tedy mßme funkΦnφ diskovΘ pole. Zb²vß vy°e╣it zp∙sob, jak²m se bude pole vypφnat p°i vypnutφ systΘmu a zapφnat p°i startu systΘmu. Jednou mo╛nostφ je pou╛itφ utilit raidstart a raidstop. Pomocφ t∞chto utilit m∙╛eme pole aktivovat Φi zastavit kdykoliv, staΦφ tedy upravit p°φslu╣nΘ startovacφ skripty. (Pokud u╛ distribuce toto neobsahuje; nap°. distribuce Red Hat nenφ pot°eba upravovat, ze skriptu /etc/rc.d/rc.sysinit je raidstart volßn automaticky, existuje-li soubor /etc/raidtab a raidstop je volßn ze skriptu /etc/rc.d/init.d/halt.).

Disk /dev/sda: 255 heads, 62 sectors, 1124 cylinders
Units = cylinders of 15810 * 512 bytes

   Device Boot    Start       End    Blocks   Id  System
/dev/sda1             1        17    134354   fd  Linux raid autodetect
/dev/sda2            18        51    268770   fd  Linux raid autodetect
/dev/sda3            52       118    529635   fd  Linux raid autodetect
/dev/sda4           119      1124   7952430    5  Extended
/dev/sda5           119       152    268739   82  Linux swap
/dev/sda6           153       347   1541444   fd  Linux raid autodetect
/dev/sda7           348      1124   6142154   fd  Linux raid autodetect

v²pis fdisku: nastavenφ diskov²ch oddφl∙ pro autodetekci RAID polφ

Druhou, robustn∞j╣φ metodou je vyu╛itφ mo╛nosti automatickΘ aktivace polφ jßdrem p°i bootu. Aby mohla fungovat, je pot°eba v prvΘ °ad∞ pou╛φvat perzistentnφ RAID superbloky a v╣echny diskovΘ oddφly, kterΘ jsou souΦßstφ polφ, musejφ b²t v tabulce oddφl∙ oznaΦeny jako typ Linux raid autodetect (tedy hodnota 0xfd hexadecimßln∞). Viz v²pis fdisku - nastavenφ diskov²ch oddφl∙ pro autodetekci RAID polφ.

V²hodou tohoto °e╣enφ navφc je, ╛e jakmile je diskovΘ pole inicializovßno, nepou╛φvß se ji╛ pro op∞tovn² start / zastavenφ pole konfiguraΦnφ soubor /etc/raidtab. O sestavenφ a spu╣t∞nφ pole se postarß ovladaΦ RAIDu, kter² na v╣ech diskov²ch oddφlech typu Linux raid autodetect vyhledß RAID superbloky a na zßklad∞ informacφ v RAID superblocφch pole spustφ. Stejn∞ tak ovladaΦ RAIDu v╣echny pole korektn∞ vypne v zßv∞reΦnΘ fßzi ukonΦenφ b∞hu systΘmu potΘ, co jsou odpojeny souborovΘ systΘmy. I v p°φpad∞ zm∞ny jmen disk∙ nebo po p°enesenφ disk∙ na ·pln∞ jin² systΘm tedy pole bude korektn∞ sestaveno a nastartovßno, viz nßsledujφcφ ·ryvek systΘmovΘho logu po zßmen∞ disk∙ sdc za sdb a sdb za sda:

autorun ...
considering sdb6 ...
  adding sdb6 ...
  adding sda6 ...
created md4
bind<sda6,1>
bind<sdb6,2>
running: <sdb6><sda6>
now!
sdb6's event counter: 00000001
sda6's event counter: 00000001
md: device name has changed from sdc6 to sdb6 since last import!
md: device name has changed from sdb6 to sda6 since last import!
md4: max total readahead window set to 128k
raid1: device sdb6 operational as mirror 1
raid1: device sda6 operational as mirror 0
md: updating md4 RAID superblock on device
sdb6 [events: 00000002](write) sdb6's sb offset: 15332224
sda6 [events: 00000002](write) sda6's sb offset: 15332224

RAID superblok

Ka╛d² diskov² oddφl, kter² je souΦßsti raid svazku (v²jimku tvo°φ pouze svazky bez perzistentnφch superblok∙, viz nφ╛e) obsahuje tzv. RAID superblok. Tento superblok je 4kB Φßst RAID oddφlu vyhrazenß pro informace o p°φslu╣nosti danΘho oddφlu k urΦitΘmu poli a o stavu pole. Nßsleduje podrobn² popis superbloku, kter² se nßm bude pozd∞ji hodit p°i °e╣enφ n∞kter²ch problΘmov²ch situcacφ popsan²ch nφ╛e. ╚tenß°, kter² se nechce RAIDem zab²vat do hloubky, m∙╛e tuto Φßst p°eskoΦit.

/* Device "operational" state bits */
#define MD_DISK_FAULTY          0 /* disk is faulty / operational */
#define MD_DISK_ACTIVE          1 /* disk is running or spare disk */
#define MD_DISK_SYNC            2 /* disk is in sync with the raid set */
#define MD_DISK_REMOVED         3 /* disk is in sync with the raid set */

typedef struct mdp_device_descriptor_s { __u32 number; /* 0 Device number in the entire set */ __u32 major; /* 1 Device major number */ __u32 minor; /* 2 Device minor number */ __u32 raid_disk; /* 3 The role of the device in the raid set */ __u32 state; /* 4 Operational state */ __u32 reserved[MD_SB_DESCRIPTOR_WORDS - 5]; } mdp_disk_t;

#define MD_SB_MAGIC 0xa92b4efc /* Superblock state bits */ #define MD_SB_CLEAN 0 #define MD_SB_ERRORS 1

typedef struct mdp_superblock_s { /* Constant generic information */ __u32 md_magic; /* 0 MD identifier */ __u32 major_version; /* 1 major version to which the set conforms */ __u32 minor_version; /* 2 minor version ... */ __u32 patch_version; /* 3 patchlevel version ... */ __u32 gvalid_words; /* 4 Number of used words in this section */ __u32 set_uuid0; /* 5 Raid set identifier */ __u32 ctime; /* 6 Creation time */ __u32 level; /* 7 Raid personality */ __u32 size; /* 8 Apparent size of each individual disk */ __u32 nr_disks; /* 9 total disks in the raid set */ __u32 raid_disks; /* 10 disks in a fully functional raid set */ __u32 md_minor; /* 11 preferred MD minor device number */ __u32 not_persistent; /* 12 does it have a persistent superblock */ __u32 set_uuid1; /* 13 Raid set identifier #2 */ __u32 set_uuid2; /* 14 Raid set identifier #3 */ __u32 set_uuid3; /* 14 Raid set identifier #4 */ __u32 gstate_creserved[MD_SB_GENERIC_CONSTANT_WORDS - 16]; /* Generic state information */ __u32 utime; /* 0 Superblock update time */ __u32 state; /* 1 State bits (clean, ...) */ __u32 active_disks; /* 2 Number of currently active disks */ __u32 working_disks; /* 3 Number of working disks */ __u32 failed_disks; /* 4 Number of failed disks */ __u32 spare_disks; /* 5 Number of spare disks */ __u32 sb_csum; /* 6 checksum of the whole superblock */ __u64 events; /* 7 number of superblock updates (64-bit!) */ __u32 gstate_sreserved[MD_SB_GENERIC_STATE_WORDS - 9]; /* Personality information */ __u32 layout; /* 0 the array's physical layout */ __u32 chunk_size; /* 1 chunk size in bytes */ __u32 root_pv; /* 2 LV root PV */ __u32 root_block; /* 3 LV root block */ __u32 pstate_reserved[MD_SB_PERSONALITY_WORDS - 4]; /* Disks information */ mdp_disk_t disks[MD_SB_DISKS]; /* Reserved */ __u32 reserved[MD_SB_RESERVED_WORDS]; /* Active descriptor */ mdp_disk_t this_disk; } mdp_super_t;

v²pis: definice RAID superbloku: Φßst hlaviΦkovΘho souboru md_p.h

RAID superblok (o velikosti 4 kB) je ulo╛en na konci diskovΘho oddφlu. Jeho pozici zφskßme bu∩ ze systΘmovΘho logu (ovladaΦ RAIDu loguje updaty RAID superbloku):

md: updating md0 RAID superblock on device 
kernel: sdb1 [events: 000000e8](write) sdb1's sb offset: 8956096 

nebo ji takΘ m∙╛eme odvodit z velikosti diskovΘho oddφlu (komentß° zdrojovΘho k≤du balφΦku raidutils):

If x is the real device size in bytes, we return an apparent size of:
y = (x &  (MD_RESERVED_BYTES - 1)) - MD_RESERVED_BYTES
and place the 4kB superblock at offset y.

#define MD_RESERVED_BYTES  (64 * 1024)

Nejjednodu╣╣φ je ale podφvat se do /proc/mdstat, kde je uvedena velikost ka╛dΘho svazku v blocφch, nap°. u pole typu RAID 1:

md0 : active raid1 sdb1[1] sda1[0] 131968 blocks [2/2] [UU]

RAID superblok z diskovΘho oddφlu sdb1 pak zφskßme a ulo╛φme do souboru /tmp/superblok p°φkazem:

dd if=/dev/sdb1 of=/tmp/superblok bs=1k skip=131968 count=4

Jestli╛e se jednß o pole RAID 0, slo╛enΘ ze dvou disk∙, pak velikost zφskanou z /proc/mdstat vyd∞lφme 2 nap°:

md4 : active raid0 sdd1[1] sdc1[0] 17942272 blocks 16k chunks

pak superblok zkopφrujeme p°φkazem:

dd if=/dev/sdb1 of=/tmp/superblok bs=1k skip=8971136 count=4

ProhlΘdnout si jej m∙╛eme nap°. pomocφ utility od (s vhodn²mi parametry, nap°. od -Ax -tx4). Pro kontrolu, superblok v╛dy zaΦφnß "magick²m Φφslem" 0xa92b4efc. Superblok obsahuje zejmΘna nßsledujφcφ informace:

  • verzi ovladaΦe raidu, kter²m byl vytvo°en,
  • jedineΦn² identifikßtor pole,
  • typ RAIDu,
  • datum vytvo°enφ RAID svazku,
  • poΦty disk∙ (aktivnφch, rezervnφch apod.),
  • preferovanΘ vedlej╣φ Φφslo RAID za°φzenφ,
  • stav pole,
  • kontrolnφ souΦet superbloku,
  • poΦet updat∙ superbloku,
  • datum poslednφho updatu superbloku,
  • velikost stripu,
  • informace o stavu jednotliv²ch diskov²ch oddφl∙.

Perzistentnφ superbloky a RAID 0 / linear

Pokud provozujeme pole RAID 0 Φi linear, mßme mo╛nost zvolit variantu bez pou╛itφ perzistentnφho superbloku. Volba "persistent-superblock 0", znamenß, ╛e se RAID superblok nebude uklßdat na disk. Tato mo╛nost existuje z d∙vod∙ zachovßnφ kompatibility s polemi z°φzen²mi pomocφ star╣φ verzφ ovladaΦe RAIDu. Po vypnutφ takovΘho pole nez∙stane na svazku informace o konfiguraci a stavu pole. Proto je tato pole nutnΘ v╛dy znovu inicializovat p°i ka╛dΘm startu bu∩ utilitou mkraid, nebo pomocφ utility raid0run (co╛ je pouze symbolick² odkaz na mkraid) a nelze vyu╛φt automatickΘho startovßnφ polφ jßdrem p°i bootu.

Poznßmka: Na tuto volbu je t°eba dßvat pozor p°i konfiguraci - pokud p°i konfiguraci pole RAID 0 direktivu persistent-superblock vynechßme, pou╛ije se standardnφ hodnota 0, tedy pole bez perzistentnφch superblok∙!

Monitorovßnφ stavu pole

Aktußlnφ stav diskov²ch polφ zjistφme vypsßnφm souboru /proc/mdstat. Prvnφ °ßdek obsahuje typy polφ, kterΘ ovladaΦ podporuje (zßle╛φ na konfiguraci jßdra). U jednotliv²ch RAID svazk∙ je pak uvedeno kterΘ diskovΘ oddφly svazek obsahuje, velikost svazku, u redundantnφch polφ pak celkov² poΦet konfigurovan²ch oddφl∙ a z toho poΦet funkΦnφch, nßsledovan² schΘmatem funkΦnosti v hranat²ch zßvorkßch. Nßsledujφcφ p°φklad uvßdφ stav funkΦnφho pole RAID 1:

md0 : active raid1 hdc1[1] hda1[0] 136448 blocks [2/2] [UU]

Druh² p°φklad uvßdφ stav pole RAID 1 po v²padku jednoho disku, oddφl sdc1 je oznaΦen jako nefunkΦnφ (F=Failed mφsto Φφsla aktivnφho oddφlu):

md0 : active raid1 sdc1[F] sdd1[0] 8956096 blocks [2/1] [U_]

T°etφ p°φklad ukazuje stav pole RAID 1, kdy probφhß rekonstrukce:

md1 : active raid1 hdc2[1] hda2[0] 530048 blocks [2/2] [UU] \
resync=4% finish=6.7min

SouΦßstφ raidtools bohu╛el nenφ utilita k monitorovßnφ stavu diskov²ch polφ, tak╛e si administrßtor musφ vypomoci skriptem, kter² je pravideln∞ spou╣t∞n z cronu a kontroluje /proc/mdstat (jednodu╣e nap°. tak, ╛e si skript na disk ulo╛φ obsah /proc/mdstat nebo jeho MD5 souΦet a nßsledn∞ kontroluje, jestli se /proc/mdstat zm∞nil; v p°φpad∞ zm∞ny pak prost°ednictvφm e-mailu uv∞domφ administrßtora) anebo filtrem systΘmovΘho logu.

Rekonstrukce pole

Redundantnφ typy polφ je t°eba po inicializaci, po v²m∞n∞ disku, nebo po nahrazenφ vadnΘho disku rezervnφm (viz direktiva spare-disk v /etc/raidtab) rekonstruovat Φi synchronizovat. Ve v╣ech p°φpadech systΘm rekonstrukci spou╣tφ automaticky. Pr∙b∞h rekonstrukce je mo╛nΘ sledovat v /proc/mdstat (viz p°φklad o n∞kolik °ßdek v²╣e). Rekonstrukce probφhß s nφzkou prioritou, nezabere tedy Φas procesoru na ·kor jin²ch aplikacφ, ale bude se sna╛it vyu╛φt maximßlnφ prostupnosti I/O za°φzenφ. Proto m∙╛eme po dobu rekonstrukce pozorovat zpomalenφ diskov²ch operacφ. Maximßlnφ rychlost rekonstrukce ov╣em takΘ lze ovlivnit nastavenφm limitu v /proc/sys/dev/md/speed-limit, v²chozφ hodnota je 100 kB/sec. OvladaΦ RAIDu umφ souΦasn∞ spustit rekonstrukci na n∞kolika polφch souΦasn∞. Pokud jsou v╣ak oddφly jednoho disku souΦßstφ vφce polφ, kterΘ by se m∞ly synchronizovat souΦasn∞, provede se synchronizace polφ postupn∞ (z d∙vodu v²konu). V systΘmovΘm logu se pak objevφ ne╣kodnΘ hlß╣enφ typu "XX has overlapping physical units with YY":

md: syncing RAID array md1
md: minimum _guaranteed_ reconstruction speed: 100 KB/sec.
md: using maximum available idle IO bandwith for reconstruction.
md: using 128k window.
md: serializing resync, md2 has overlapping physical units with md1!
md: md1: sync done.
md: syncing RAID array md2
md: minimum _guaranteed_ reconstruction speed: 100 KB/sec.
md: using maximum available idle IO bandwith for reconstruction.
md: using 128k window.
md: md2: sync done.

V /proc/mdstat jsou ty svazky, na kter²ch je rekonstrukce pozastavena, oznaΦeny jako pln∞ funkΦnφ, ale je u nich poznßmka resync=DELAYED:

Personalities : [linear] [raid0] [raid1] [raid5] 
read_ahead 1024 sectors
md2 : active raid1 hdc3[1] hda3[0] 530048\
 blocks [2/2] [UU] resync=DELAYED
md1 : active raid1 hdc2[1] hda2[0] 530048\
 blocks [2/2] [UU] resync=4% finish=6.7min
md0 : active raid1 hdc1[1] hda1[0] 136448\
 blocks [2/2] [UU]

Pokud zformßtujeme a p°ipojφme Φerstv∞ z°φzenΘ redundantnφ pole, na kterΘm probφhß rekonstrukce, mohou se v systΘmovΘm logu objevit nßsledujφcφ ne╣kodnΘ hlß╣enφ (je to zp∙sobenΘ tφm, ╛e mke2fs, fsck a ovladaΦ FS pou╛φvajφ p°i p°φstupu jinou velikost bloku, ne╛ je v²chozφ velikost se kterou pracuje ovladaΦ raidu):

kernel: set_blocksize: b_count 1, dev md(9,3),\
 block 96765, from c014
kernel: set_blocksize: b_count 1, dev md(9,3),\
 block 96766, from c014
kernel: set_blocksize: b_count 2, dev md(9,3),\
 block 96767, from c014
kernel: md3: blocksize changed during write 
kernel: nr_blocks changed to 32 (blocksize 4096,\
 j 24160, max_blocks 385536)

Redundantnφ pole: v²m∞na disku, hot plug

Pokud p°i Φtenφ nebo zßpisu na n∞kter² z diskov²ch oddφl∙, kter² je souΦßstφ redundantnφho diskovΘho pole, dojde k chyb∞, je dotyΦn² oddφl oznaΦen jako vadn² a pole jej p°estane pou╛φvat. Pokud mßme v danΘm diskovΘm poli za°azen jeden nebo vφce rezervnφch disk∙ (direktiva spare-disk), je tento v p°φpad∞ v²padku automaticky aktivovßn, systΘm provede rekonstrukci pole a pr∙b∞h rekonstrukce zaznamenß do systΘmovΘho logu. V opaΦnΘm p°φpad∞ pole z∙stane v provozu v degradovanΘm re╛imu, pak to v systΘmovΘm logu bude vypadat zhruba takto:

kernel: SCSI disk error : host 0 channel 0\
 id 4 lun 0 return code = 28000002
kernel: [valid=0] Info fld=0x0, Current sd08:11:\
 sense key Hardware Error
kernel: Additional sense indicates\
 Internal target failure 
kernel: scsidisk I/O error:\
 dev 08:11, sector 2625928 
kernel: raid1: Disk failure on sdb1,\
 disabling device.  
kernel: Operation continuing on 1 devices 
kernel: md: recovery thread got woken up ... 
kernel: md0: no spare disk to reconstruct\
 array! - continuing in degraded mode
kernel: md: recovery thread finished ... 

P°φjemnou vlastnostφ diskov²ch polφ je takΘ mo╛nost v²m∞ny disku za chodu systΘmu. Samoz°ejm∞ k tomu pot°ebujeme v prvΘ °ad∞ hardware, kter² to umo╛≥uje. OvladaΦe slu╣n²ch SCSI °adiΦ∙ umo╛≥ujφ p°idßvßnφ Φi ubφrßnφ za°φzenφ, to ale samo o sob∞ nestaΦφ. Je zapot°ebφ pou╛φvat SCA disky urΦenΘ pro "hot swap" a odpovφdajφcφ SCSI subsystΘm s SCA konektory a elektronikou, kterß zajistφ stabilitu SCSI sb∞rnice p°i odebφrßnφ Φi p°idßvßnφ za°φzenφ.

M∞jme pole typu RAID 1, ve kterΘm do╣lo k chyb∞ na oddφlu sdc1. Disk sdc1 je p°ipojen ke kanßlu 0 SCSI °adiΦe 0 a mß ID rovno 4:

md0 : active raid1 sdc1[F] sdd1[0] 8956096 blocks [2/1] [U_]

Jak tedy probφhß v²m∞na vadnΘho disku, mßme-li k tomu pot°ebnΘ hardwarovΘ vybavenφ:

  • provedeme raidhotremove /dev/md0 /dev/sdc1, co╛ vy°adφ vadn² oddφl z pole md0,
  • provedeme echo "scsi remove-single-device 0 0 4 0">/proc/scsi/scsi, ovladaΦ SCSI °adiΦe "zapomene" na za°φzenφ na °adiΦi 0, kanßlu 0, ID 4, LUN 0,
  • vyjmeme vadn² disk sdc,
  • vlo╛φme nov² disk sdc,
  • vykonßme echo "scsi add-single-device 0 0 4 0" >/proc/scsi/scsi, co╛ nov² disk zp°φstupnφ systΘmu,
  • pomocφ utility fdisk vytvo°φme diskovΘ oddφly,
  • vykonßme raidhotadd /dev/md0 /dev/sdc1, Φφm╛ p°idßme oddφl sdc1 novΘho disku do pole md0 a na pozadφ se spustφ rekonstrukce pole.

Pokud nemßme hardware pot°ebn² k "hot-swap" v²m∞n∞ disk∙, musφme se smφ°it s vypnutφm systΘmu, v²m∞nou vadnΘho disku a op∞tovn²m zapnutφm systΘmu. Potom staΦφ pouze vytvo°it pomocφ fdisku odpovφdajφcφ diskovΘ oddφly a p°φkazem raidhotadd je za°adit do diskovΘho pole. P°φkazy pro p°idßvanφ a ubφrßnφ SCSI za°φzenφ jsou popsßny ve zdrojovΘm k≤du jßdra (soubor linux/drivers/scsi/scsi.c).

IDE nebo SCSI?

Doposud jsme se zb²vali obecn∞ fungovßnφm softwarovΘho RAIDu, ov╣em ve chvφli kdy se rozhodneme sestavit systΘm s RAIDem, musφme se zamyslet nad v²hodami a nev²hodami t∞chto rozhranφ, kterΘ s provozovßnφm diskov²ch polφ souvisejφ. Proto╛e tato problematika je sama o sob∞ rozsßhlß, uvedeme na tomto mφst∞ pouze n∞kolik zßsadnφch rozdφl∙:

Rozhranφ SCSI mß n∞kolik rys∙, kterΘ napomßhajφ vy╣╣φmu v²konu diskovΘho subsystΘmu:

  • Tagged command queing: SCSI za°φzenφ mohou p°ijmout souΦasn∞ vφce p°φkaz∙ (b∞╛nΘ SCSI °adiΦe a╛ 256, disky obvykle a╛ 64) a postupn∞ je zpracovat v libovolnΘm po°adφ (mo╛nost optimalizace). Toto je v²hodou zejmΘna u za°φzenφ s dostateΦnou cache (dne╣nφ disky majφ b∞╛n∞ 2 MB, p°φpadn∞ 4 MB i vφce).
  • Elevator sorting: po°adφ p°φkaz∙ je p°erovnßno takov²m zp∙sobem, aby se ztrßcelo co nejmΘn∞ Φasu p°esouvßnφm hlaviΦek disku.
  • Podpora Disconnect/Reconnect: SCSI za°φzenφ mohou uvolnit sb∞rnici pro komunikaci dal╣φm za°φzenφm, po dobu kdy nap°. zpracovßvajφ p°φkazy.
  • poΦet za°φzenφ, kter² lze k SCSI °adiΦ∙m p°ipojit je pom∞rn∞ vysok² (b∞╛n∞ 7 Φi 15 za°φzenφ na jeden kanßl, ov╣em musφme takΘ myslet na prostupnost).

Rozhranφ IDE mß naopak n∞kolik nedostatk∙, kterΘ komplikujφ jeho nasazenφ, zejmΘna:

  • na jednom kanßlu mohou b²t p°ipojena pouze 2 za°φzenφ,
  • maximßlnφ dΘlka kabelu je mnohem krat╣φ ne╛ u za°φzenφ SCSI,
  • IDE disky zpravidla nepodporujφ Disconnect/Reconnect, tedy po dobu provßd∞nφ p°φkazu dr╛φ sb∞rnici, co╛ zp∙sobuje zbyteΦnΘ prodlevy, pokud jsou na jednom kanßlu oba disky. Jedno za°φzenφ funguje jako tzv. "master" a druhΘ jako "slave". Zßvada za°φzenφ kterΘ je p°ipojenΘ jako "master" m∙╛e Φasto znep°φstupnit i druhΘ za°φzenφ, kterΘ je p°ipojeno jako "slave".

Je tedy jasnΘ, ╛e aΦkoliv maximßlnφ teoretickΘ propustnosti obou rozhranφ jsou dnes pom∞rn∞ vysokΘ, v prost°edφ, kde je kladen d∙raz na reßlnou vysokou propustnost nejen p°i sekvenΦnφm Φtenφ nebo zßpisu, je rozhranφ SCSI stßle volbou Φφslo jedna. Pokud se rozhodneme budovat systΘm na bßzi IDE, rozhodn∞ se vyplatφ obsazovat ka╛d² kanßl IDE pouze jednφm za°φzenφm. (A to jak z d∙vodu v²konu, tak stability, proto╛e pokud bychom nap°. sestavili pole RAID 5 z IDE disk∙ a disky by byly na kanßlech po dvou, riskujeme v p°φpad∞ v²padku n∞kterΘho z "master" disk∙ havßrii celΘho pole, proto╛e tφm mohou v krajnφm p°φpad∞ vypadnout disky oba - jak "master" tak i "slave"".)

Testovßnφ

Kdy╛ zprovoznφme redundantnφ diskovΘ pole, bude nßs zajφmat i zp∙sob, jak²m otestovat jeho odolnost proti v²padku disku. M∙╛eme k tomu pou╛φt utilitu raidsetfaulty, kterß simuluje v²padek disku a oznaΦφ jej jako vadn² (je pot°eba mφt dostateΦn∞ novou verzi balφΦku raidtools, ve star╣φch verzφch tatu utilita chybφ). Potom m∙╛eme disk vy°adit z pole p°φkazem raidhotremove, op∞t p°idat p°φkazem raidhotadd a sledovat pr∙b∞h rekonstrukce pole. Metodu testovßnφ tφm, ╛e za chodu vytßhneme konektor disku, rozhodn∞ nelze doporuΦit, proto╛e tφmto zp∙sobem m∙╛eme hardware vß╛n∞ po╣kodit.

Tipy

Nynφ u╛ mßme za sebou jak teorii fungovßnφ RAIDu, tak z velkΘ Φßsti i praxi softwarovΘho RAIDu pod Linuxem. V tΘto poslednφ Φßsti se zam∞°φme na mΘn∞ obvyklΘ postupy a tipy, jak °e╣it n∞kterΘ problΘmovΘ situace.

Jak zalo╛it redundantnφ pole v degradovanΘm re╛imu

Softwarov² RAID je pom∞rn∞ flexibilnφ. Pokud jsme nap°φklad v situaci, kdy pot°ebujeme p°evΘst systΘm b∞╛φcφ na samostatnΘm disku na redundantnφ pole RAID 1, nemusφme kv∙li tomu reinstalovat systΘm. M∙╛eme vyu╛φt toho, ╛e lze vytvo°it pole v degradovanΘm re╛imu. Dejme tomu, ╛e mßme instalovan² systΘm na diskovΘm oddφlu sda1 a pro zjednodu╣enφ je to jedin² oddφl na disku sda. Do poΦφtaΦe jsme p°idali disk stejn∞ velk² disk sdb a mßme p°ipraveno jßdro podporujφcφ sofwarov² RAID. Pomocφ fdisku vytvo°φme diskov² oddφl sdb1 obdobn∞ jako je na disku sda. Nynφ vytvo°φme konfiguraΦnφ soubor /etc/raidtab:

raiddev /dev/md0
raid-level                1
persistent-superblock     1
nr-raid-disks             2
nr-spare-disks            0
device                    /dev/sdb1
raid-disk                 0
device                    /dev/sda1
failed-disk               1

Pomocφ mkraid inicializujeme pole, vytvo°φme na n∞m souborov² systΘm (nap°. pomocφ mke2fs), p°φpojφme a zkopφrujeme na n∞j data z sda1. Odpovφdajφcφm zp∙sobem upravφme konfiguraΦnφ soubory na svazku md0 (/etc/fstab apod.). Po tΘ systΘm nabootujeme ze svazku md0 (t°eba pomocφ diskety anebo upravφme konfiguraci pro LILO), zkontrolujeme, ╛e je v╣e v po°ßdku a p°φkazem raidhotadd p°idßme oddφl sda1 do pole.

Jak p°idat t°etφ aktivnφ disk do pole RAID 1

Pokud mßme pole RAID 1 tvo°enΘ dv∞ma disky a rozhodneme se pro zv²╣enφ redundance p°idat je╣t∞ t°etφ, nestaΦφ na to pouze p°φkaz raidhotadd. Ten toti╛ disk do pole p°idß, ale pouze jako disk rezervnφ ("spare"). Pokud chceme, aby byl t°etφ disk takΘ aktivnφ, musφme si op∞t pomoci direktivou failed-disk v konfiguraΦnφm souboru /etc/raidtab. T°etφ disk oznaΦφme jako failed-disk a nezapomeneme zv²╣it celkov² poΦet aktivnφch disk∙ na 3 (nr-raid-disk):

raiddev /dev/md0
raid-level                1
persistent-superblock     1
nr-raid-disks             3
nr-spare-disks            0
device                    /dev/sda1
raid-disk                 0
device                    /dev/sdb1
raidd-disk   
device                    /dev/sdc1
failed-disk   

PotΘ pomocφ mkraid pole znovu inicializujeme a p°φkazem raidhotadd p°idßme oddφl sdc1. (Tφm, ╛e oznaΦφme nov² disk jako failed-disk zajistφme, ╛e jej mkraid p°i inicializaci p°eskoΦφ, ale pole bude poΦφtat se 3 disky, nßslednΘ spu╣t∞nφ raidhotadd pak zajistφ aktivaci.)

Kdy╛ z RAIDu 5 vypadne vφce disk∙

RAID 5 je odoln² v∙Φi v²padku jednoho disku. Proto╛e se stripuje, nejsou data z jednotliv²ch disk∙ samostatn∞ pou╛itelnß a tato situace je tΘm∞° ne°e╣itelnß. Co tedy d∞lat v p°φpad∞, kdy╛ k v²padku vφce ne╛ jednoho disku dojde? Pokud disky z∙staly po v²padku pole alespo≥ ΦßsteΦn∞ pou╛itelnΘ, m∙╛eme se pokusit o obnovenφ pole nßsledujφcφm zp∙sobem, op∞t s vyu╛itφm direktivy failed-disk. Utilita mkraid v podstat∞ pouze zapφ╣e na oddφly RAID svazku superbloky a nastartuje pole - nijak tedy nem∞nφ obsah oddφl∙. Teprve jadern² ovladaΦ RAIDu spou╣tφ rekonstrukci a tomu m∙╛eme zabrßnit tφm, ╛e pomocφ mkraid pole znovu inicializujeme, ale pouze v degradovanΘm re╛imu (upravφme raidtab). Pole pak m∙╛eme p°ipojit s p°φznakem pouze pro Φtenφ a zjistit, nakolik jsou data na svazku pou╛itelnß. Toto m∙╛eme podle pot°eby opakovat a postupn∞ z pole vynechat jin² z disk∙, kterΘ z pole v dob∞ havßrie vypadly, a╛ najdeme takovou kombinaci, p°i kterΘ je souborov² systΘm po╣kozen nejmΘn∞ (m∙╛eme zkusit spustit fsck). Potom m∙╛eme svazek p°ipojit i pro zßpis a pomocφ fsck souborov² systΘm naostro opravit. Na zßv∞r m∙╛eme p°idat i poslednφ chyb∞jφcφ disk pomocφ raidhotadd, co╛ vede ke spu╣t∞nφ rekonstrukce pole. Tato metoda ale p°edstavuje krajnφ °e╣enφ a rozhodn∞ od nφ nelze oΦekßvat zßzraky.

Kdy╛ se zm∞nφ po°adφ Φi jmΘna disk∙

Pokud se zm∞nφ po°adφ nebo jmΘna za°φzenφ (nap°. p°idßnφ dal╣φch disk∙ Φi periferiφ), kterΘ tvo°φ RAID svazek a nepou╛φvßme automatickΘ startovßnφ RAIDu jßdrem p°i bootu, musφme odpovφdajφcφm zp∙sobem upravit konfiguraΦnφ soubor /etc/raidtab a p°φpadn∞ pole znovu inicializovat pomocφ mkraid -force (pozor - pouze pro ty, kte°φ v∞dφ, co d∞lajφ). Pokud pou╛φvßme vlastnost "raid autodetect" jßdra, ovladaΦ RAIDu si poradφ sßm a pole sestavφ a spustφ podle informacφ ulo╛en²ch v RAID superblocφch diskov²ch oddφl∙.

Roz╣φ°enφ pole, konverze raidu na jin² typ

Utilita raidreconf, kterou p∙vodn∞ vyvφjel Jakob Oestergaard, nynφ vyvφjenß jako open source aktivita Connexem, umφ zmen╣ovat, zv∞t╣ovat RAID 0 a 5 svazky, p°evßd∞t svazky typu RAID 0 na RAID 5, p°idat nov² disk do RAIDu 1 a 5, vytvo°it pole RAID 0 ze samostatn²ch disk∙. Tato utilita ale nenφ dostateΦn∞ testovßna, tak╛e pozornΘ Φtenφ manußlu a zßloha je naprostou nutnostφ! Spolu s utilitou resize2fs je tedy mo╛nΘ tedy mo╛nΘ m∞nit i velikost polφ.

Boot raid

Je mo╛nΘ provozovat ko°enov² svazek na RAIDu, a to typu linear, RAID 0 a RAID 1. Konfigurace star╣φch verzφ LILa byla sice trochu problematickß, ale novΘ verze LILa ji╛ RAID podporujφ p°φmo, viz Software-RAID-0.4x-HOWTO (ke star╣φ verzi RAIDu), Boot+Root+Raid+LILO HOWTO (k novΘ verzi RAIDu).

Jak potlaΦit autodetekci RAID polφ

Pokud mßme jßdro s podporou autodetekce RAID polφ a z n∞jakΘho d∙vodu pot°ebujeme autodetekci doΦasn∞ vypnout, m∙╛eme jßdru p°i startu zadat parametr raid=noautodetect.

RAID a swap

V souvislosti s RAIDem se Φasto diskutuje o tom, zda mß smysl vytvß°et odklßdacφ oddφly na RAIDu a kdy╛ ano, tak jak² typ pole pou╛φt. Tady je zapot°ebφ vzφt v potaz omezenφ danß ovladaΦem RAIDu (viz v²╣e omezenφ platnß pro jßdra 2.2.x) a dßle se musφme rozhodnout, zda nßm jde o zrychlenφ swapovßnφ, nebo o robustnost systΘmu. Pokud nßm jde o rychlost, m∙╛eme jako odklßdacφ oddφl pou╛φt svazek RAID 0; ov╣em podobnΘho efektu m∙╛eme dosßhnout i bez pou╛itφ RAIDu a to tak, ╛e v /etc/fstab uvedeme u odklßdacφch oddφl∙ stejnou prioritu:

/dev/sda3     none    swap    sw,pri=1
/dev/sdb3     none    swap    sw,pri=1

Pou╛φvat pro swap RAID 0 je tedy v podstat∞ zbyteΦnΘ. Naopak v p°φpad∞, ╛e nßm jde o robustnost systΘmu, m∙╛eme pro odklßdacφ oddφl s v²hodou pou╛φt RAID 1 svazek. SystΘm pak s v²padkem disku nep°ijde o Φßst swapu.

V²kon a stabilita

Nejprve srovnejme v²kon softwarovΘho raidu pod jßdry 2.2 a 2.4: RAID 0 je rychlej╣φ u jader 2.4, RAID 1 je na tom zhruba stejn∞, RAID 5 byl na °ad∞ 2.4 z poΦßtku v²razn∞ pomalej╣φ, i kdy╛ toto se v poslednφ dob∞ rychle m∞nφ a nynφ je v²kon srovnateln² nebo lep╣φ. Pokud jde o srovnßnφ rychlosti softwarovΘho RAIDu a hardwarov²ch °e╣enφ, softwarov² RAID je oproti hardwarovΘ implementaci samoz°ejm∞ nßroΦn∞j╣φ na systΘmovΘ prost°edky, ale na druhou stranu b²vß mnohdy rychlej╣φ (v²razn∞ rychlej╣φ b²vß zejmΘna RAID 0). (Poznßmka: pro vylep╣enφ v²konu RAIDu 1 p°i Φtenφ existuje zßplata ovladaΦe RAIDu "readbalance".)

Pokud jde o robustnost implementace, stabilita RAIDu typ∙ linear, RAID 0 a 1 je pom∞rn∞ vysokß, naopak nasazenφ RAIDu 5 v ostrΘm provozu je╣t∞ nelze doporuΦit. V tΘto souvislosti je╣t∞ zmφnφm jednu vlastnost LinuxovΘ implementace softwarovΘho RAIDu: V p°φpad∞ jakΘkoliv I/O chyby ovladaΦ RAIDu okam╛it∞ dan² diskov² oddφl z RAIDu vy°adφ, bez ohledu na to, jestli se jednß o chybu fatßlnφ, anebo o p°φpad, kdy by t°eba staΦilo danou I/O operaci zopakovat. Jin²mi slovy disk, kter² obΦas vrßtφ n∞jakou chybu, ale je nadßle vφce mΘn∞ schopn² fungovat (a kter² by systΘm nadßle pou╛φval, pokud by nebyl souΦßstφ RAID svazku, ale byl p°ipojen² jako samostatn² oddφl), linuxov² ovladaΦ p°estane pou╛φvat. Tφm se zbyteΦn∞ sni╛uje robustnost RAIDu, proto╛e snadn∞ji m∙╛e dojφt k situaci, kdy z pole vypadne postupn∞ i vφce disk∙, ne╛ kolik je k provozu danΘho pole t°eba a pole zhavaruje. Proto lze doporuΦit pou╛itφ rezervnφch disk∙ a vyhnout se shßn∞nφ rezervnφho disku na poslednφ chvφli, kdy u╛ pole mezitφm b∞╛φ v degradovanΘm re╛imu. Ze srovnßnφ softwarov²ch RAID implementacφ Linuxu, Windows 2000 a Solarisu vypl²vß, ╛e linuxov² RAID ve v²chozφm nastavenφ provßdφ rekonstrukci se snφ╛enou prioritou a limitovanou rychlostφ, tak╛e probφhajφcφ rekonstrukce mnohem mΘn∞ negativn∞ ovliv≥uje v²kon systΘmu po dobu rekonstrukce. (Poznßmka: V odkazovanΘm srovnßnφ ov╣em auto°i opakovan∞ chybn∞ uvßd∞jφ absenci n∞kter²ch vlastnostφ linuxovΘ softwarovΘ implementace RAIDu.)

Zßv∞rem

Softwarov² RAID je cenov∞ lßkavou alternativou nßkladn²ch hardwarov²ch °e╣enφ. Dal╣φ v²hodou je flexibilita (nap°. mo╛nost sestavenφ pole v degradovanΘm re╛imu, mo╛nost eventußlnφ ΦßsteΦnΘ zßchrany dat v p°φpad∞ v²padku celΘho pole, proto╛e je znßmß struktura dat v diskovΘm poli, konverze RAID svazk∙ z jednoho typu RAIDu na jin²). N∞kterΘ z t∞chto mo╛nostφ jsou ale spφ╣e experimentßlnφho rßzu. Za spolehlivΘ lze oznaΦit implementace RAIDu typu linear, RAID 0 nebo RAID 1. Softwarov² RAID je nßroΦn∞j╣φ na systΘmovΘ prost°edky ne╛ hardwarovß °e╣enφ, n∞kterΘ typy (zejmΘna RAID 0) ov╣em mohou b²t v²razn∞ rychlej╣φ ne╛ hardwarovΘ varianty. Je tedy na adminstrßtorovi, aby zvß╛il v²hody a nev²hody sofwarovΘho Φi hardwarovΘho RAIDu vzhledem k aktußlnφm podmφnkßm.

Tento Φlßnek ani v nejmen╣φm nenahrazuje dokumentaci k ovladaΦi LinuxovΘho softwarovΘho RAIDu Φi obslu╛n²m utilitßm - proto zde a╛ na v²jimky zßm∞rn∞ nejsou komentovßny p°epφnaΦe obslu╛n²ch utilit. D∙kladnΘ Φtenφ dokumentace (nebo v p°φpad∞ nejasnostφ studium zdrojovΘho k≤du - dokumentace bohu╛el stßle nenφ ·plnß) by m∞lo b²t samoz°ejmostφ, rovn∞╛ existuje konference linux-raid s prohledßvateln²m archφvem. A je╣t∞ ·pln∞ poslednφ poznßmka na zßv∞r: nezapomφnejme, ╛e (redundantnφ) RAID chrßnφ pouze p°ed v²padkem urΦitΘho poΦtu disk∙ a rozhodn∞ nenahrazuje nutnost pravidelnΘho zßlohovßnφ dat. *


- p°edchozφ Φlßnek - nßsledujφcφ Φlßnek - obsah - ·vodnφ strßnka -