A RAID kezelése

Raid beállítása 1

Miért sw raid ha van a sata kártyán/vezérlőn is raid támogatás?

Sajnos a SATA vezérlők nem valódi hw-es raid-et csinálnak, azt szoktak mondani, hogy az is egy sw raid, csak be van égetve egy chip-be. Tesztekkel igazolható, hogy a gyorsaságuk is elmarad az elvárttól. Nem mellékesen pedig ezen okokból kifolyólag linux nagy részüket nem támogatja(azért akad kivétel).

Persze az, hogy a raid megoldásaikat nem támogatja, nem jelenti azt, hogy a kártyának nem kell driver. A kernelben be kell állítani a kártyát, amit a scsi eszközöknél! fogunk megtalálni. A régebbi verziókban volt még az ide eszközök között is egy megoldás, ami megatlálható a kernelben, de scsi-s megoldás kiforrottabnak bizonyult.

Egyszóval kernelben benne kell lenni a kártya és a sata(+scsi) támogatásnak.

Ha minden igaz a dmesg-ben vagy kernel logjában látni is fogjuk az eszközöket. Ha nem akkor valamelyik modul esteleg nincs betöltve vagy a támoagatás hiányzik a kernelből.

Ezután már csak az mdadm és raidtools(debian alatt) csomagok kellenek.

A raidtools semmi mást nem csinál csak elindítja a raid-et ha kell és monitorozza.

A lényeg az mdadm. Ez kezeli a raid-et.
Első körben hozzunk létre egy raid particiót az eszközökön(cfdisk /dev/sdx).

Ha ez megvan máris rátérhetünk a raid beállításra. Én most egy mirrort(raid1-et) állíítok be.

mdadm -C /dev/md0 -l1 -n2 /dev/sda1 /dev/sdb1

Magyarázat :
- C (create azaz létrehozás)
- /dev/mdx (a létrehozandó eszköz neve x = 0…1…2…stb.)
- l1 (raid levelt adja meg 1=mirror)
- n2 ( eszközök száma, mirrornál legalább 2)
- /dev/sd[xy] /dev/sd[zv] a részt vevő ezsközök definiálása, lehet megadni az egyik helyett “missing” kapcsolót így csak egy féloldalas raid-et kapunk, de később egy sima (mdadm -A /dev/md0 /dev/sd[xy] -al) hozzá adhatjuk az új eszközt.

Ezzel kész is a raid.
A /dev/md0-ként tudjuk használni, mint egy normál eszközt(pl mkfs.ext3 /dev/md0, de tovább is particionálható…).

Állapot információkat találunk a /proc/mdstat file-ban.

Ha induláskor automatikusan el akarjuk indítani debian alatt az
mdadm –detail –scan > /etc/mdadm/mdadm.conf
parancsot adjuk ki illetve a file elejére egy sort szúrjunk be:
DEVICES /dev/sdx /dev/sdy
(ezek a részt vevő eszközök felsorolása….)

Ennyi :)

Raid Wiki
RAID-tömbök

Linux alatt a RAID-tömböknek is lehet szuperblokkja; ez a tömböt alkotó blockdevice végén (vagy elején) található, és a tömb (automatikus) összerakásához nyújt segítséget. Ebből adódóan a RAID-tömbök tetszőleges mélységben egymásba ágyazhatók (vagyis olyan elrendezésben csinálunk RAID0 fölött RAID1-et vagy fordítva, ahogyan jól esik).

Többféle szuperblokk-verzió van, az alábbi előnyökkel/hátrányokkal:

* 0.90:
o a kernel össze tudja rakni a tömböket boot közben
o nem hordozható architektúrák között
o az eszköz végén van
o előfordulhat, hogy egy diszk és a rajta levő utolsó partíció RAID-szuperblokkja ugyanoda esik
o legfeljebb 28 elemű tömböket támogat

* 1.[012]:
o csak userspace-ből rakhatók össze a tömbök
+ vagyis ha RAIDről akarunk bootolni, initrd vagy initramfs kell
o lehet az eszköz elején és végén is
o többszáz tömbelemet támogat

A szuperblokk nem minden konfigurációhoz szükséges (de a redundánsokhoz speciális esetektől eltekintve igen).

A /dev/md* eszközökön keresztül érhetjük el a RAID-tömbjeinket, miután “elindítottuk” őket (l. később). (md=”multiple device”)

Amúgy az mdadm kezeli az ún. multipath konfigurációkat is (amikor redundáns útvonalak vannak a gép és a háttértár között), de ezzel itt nem foglalkozunk.
[szerkesztés] RAID-szintek

A Linux a következő RAID-szinteket támogatja:

* LINEAR: csak összefűzi az eszközöket, nincs se csíkozás, se redundancia; cserébe bővíthető.
* RAID0: csíkozás. Ha nem egyforma nagyok az eszközök, akkor is az összes helyet használhatjuk, legfeljebb a végére nem lesz annyíra csíkos.
o Egy csík (stripe) itt egy valamennyi fizikai eszközre kiterjedő, logikailag folytonos blokkcsoportot jelent.
o Az egy diszkre eső csíkszelet neve chunk.
o Jelenleg nem bővíthető.
* RAID1: minden diszken pontosan ugyanaz van.
o Párhuzamosan ír minden eszközre.
o Az olvasásokat igyekszik elosztani az eszközök között (ennek főleg többszálú I/O esetén van érezhető hatása).
o Ha nem minden diszk egyforma nagy, a nagyobbak pluszkapacitását nem tudjuk kihasználni (a tömbben levő logikai hely annyi lesz, mint a tömb legkisebb elemén levő).
o “Bővíthető”: ha az összes diszket nagyobbra cseréljük benne (szép sorban), akkor a tömb is megnőhet.
* RAID4: mint a RAID0, de egy külön eszközön (az utolsó aktívon) van a csíkok paritása.
o Itt is minden eszközből csak annyi kapacitás hasznosul, amennyi a tömb legkisebb elemén rendelkezésre áll.
o Nem érdemes használni (kivéve, ha az egyik diszk sokkal gyorsabb, mint a többi).
o Jelenleg nem bővíthető (csak mint a RAID1).
* RAID5: mint a RAID4, de a paritást is csíkozza.
o A legújabb kernelek (2.6.17+) már tudják bővíteni (ehhez a teljes tömböt újra kell írni, úgyhogy nem egyszerű és nem gyors művelet, de legalább lehetséges).
* RAID6: mint a RAID5, de kétféle paritást tárol, így nem egy, hanem két diszk kiesését viseli el.
o Általában kicsit lassúbb a RAID5-nél (két diszk kiesése esetén sokkal lassúbb, de legalább még működik).
o Kb. 2007. nyarától bővíthető, mint a RAID5.
* RAID10: egy absztrakciós szinten megvalósított RAID1+0.
o Csíkoz, és minden adatot legalább n példányban tárol.
o Csinálhatunk pl. 5 diszkből álló csíkozott tömböt, amelynek nettó kapacitása 2,5 diszknyi, és minden adatot két példányban tárol, vagyis egy tetszőleges diszk kiesését túléli.
o De csinálhatunk az 5 diszkből két diszk kiesését túlélő tömböt is, 5/3-ad diszknyi kapacitással.
o Lehet hozzá hotspare-t adni (RAID0-hoz nem, RAID1+0-hoz sem, RAID0+1-hez pedig legalább kettő kellene).
o Háromféle replika-elhelyezési módszert tud:
+ near: egy csíkban (vagyis egymáshoz közel) helyezi el a replikákat.
+ far: egymástól távol helyezi el a replikákat.
# Előnye: jobb szekvenciális olvasási teljesítmény.
# Hátránya: lassúbb írás.
+ offset: egy adat másolata a következő csíkban, a következő eszközön kap helyet. (2.6.18-as kerneltől)
# Előnye: a far-ral összemérhető szekvenciális olvasási teljesítmény.
# Kevesebb fejmozgatással megúszható a replikák kiírása, vagyis kevésbé lassul az írás.
+ Ezeknek a hatását persze igazából ki kéne mérni.
o A replika-elhelyezési módszerek keverhetők: kérhetünk pl. egy near és egy far replikát. Jó ez valamire?
o Jelenleg nem bővíthető.

[szerkesztés] A konzisztencia biztosítása, hibakezelés

* Alapesetben írás előtt dirtynek jelöli a tömböt
* A tömb leállításakor clean lesz
o Tehát bootkor elvileg mindig clean
* De RAID1, RAID4, RAID5, RAID6 és RAID10 esetén legalább két írás kell a konzisztens állapot megőrzéséhéz, és ezek nem biztos, hogy pontosan egyszerre mennek végbe
o Vagyis van egy időablak, ami alatt ha eltűnik a táp, inkonzisztens (dirty) lesz a tömb
* Ha indításkor dirty, resync:
o RAID1: az első diszkről a többire másolja a tartalmat
o RAID4, RAID5, RAID6: a diszken található adatokból újraszámolja a paritást és azt írja a paritásblokkba
o RAID10: minden adat első replikáját rámásolja a többire
* Resync közben a tömb írható és olvasható
o Igyekszik úgy ütemezni, hogy a resyncre ne nagyon kelljen várnia a többi processznek
o sysfs, procfs: speed_limit_min, speed_limit_max
* Ha már nincs redundancia, akkor a 2.6-os kernel a dirty arrayt nem is hajlandó automatikusan elindítani
* Ha írás közben hibát észlel egy tömb egy elemén, azt az elemet hibásnak (faulty) jelöli, és nem használja
* Ha van hotspare (tartalék), azonnal elkezd rá szinkronizálni
o Ha nincs, de ugyanebben a spare groupban van másik tömb, és abban van, akkor onnan “ellopja”
* Ha olvasási hiba van, először megpróbálja javítani úgy, hogy az oda való adatot kiszámítja és kiírja, majd megpróbálja visszaolvasni. Ha ez nem megy, akkor jelöli hibásnak a diszket.
o Ez jól hangzik, de nem biztos, hogy a gyakorlatban is jó - lehet, hogy jobb lenne cserélni azt a diszket.
o Persze ha csak tranziens bithiba volt, akkor mégiscsak jó.

[szerkesztés] Bitmap write-intent logging

* 2.6.13 óta az md driver egy bitmap-naplóban jelzi, hogy hova fog írni
* 2.6.13-ban RAID1, 2.6.15-től a többi RAID-hez is megvan
o 2.6.22-ben még előfordulhatott deadlock RAID5+bitmap esetén; nem biztos, hogy már javították
* Ez a “szándéknapló” utólag is hozzáadható működő tömbhöz, és el is távolítható belőle
* Ha az adott területre hosszabb ideig nem történik több írás, a vonatkozó bitet törli
* Ha kiveszünk egy diszket a tömbből, a biteket a többin sem törli már

Így:

1. Tápvesztés és dirty indulás után nem kell teljes resync, csak a bitmap alapján piszkos részekhez kell nyúlni
2. Ha egy diszket kiveszünk a tömbből, majd visszarakjuk, nem az egész tömböt kell újraszinkronizálni

Persze az írási sebesség valamennyivel biztos kisebb, ha a szándéknaplót is frissítgetni kell; ki kellene mérni, mekkora a különbség.
[szerkesztés] Write-mostly

* RAID1-en
* Ha így jelölünk meg egy tömbelemet, akkor a kernel arról csak akkor fog olvasni, ha muszáj, de írni ír rá
* Így nem lassul le (annyira) a tömb, ha pl. hálózaton át is mirrorozunk

[szerkesztés] Write-behind

* 2.6.14 óta
* RAID1-en
* Csak write-mostly tömbelemen
* Hatása: az adott eszközre aszinkron módon ír
* Értelme: ha aránylag lassú elérésű (mondjuk hálózati) diszk is van a tömbben, az is nagyjából szinkronban lesz, de még annyira sem lassítja a rendszer működését, mint a write-mostly esetén
o Túl lassú (szaturált) kapcsolat esetén persze nem jó

[szerkesztés] Újracsíkozás

* Restriping, reshaping
* A tömb újraírása a struktúra megváltoztatása érdekében, pl:
o Diszkek számának növelése (”szélesebb” csíkok)
o Blokkméret csökkentése (”sekélyebb” csíkok)
o Blokkméret növelése (”mélyebb” csíkok)
o Adat- és/vagy paritásstruktúra megváltoztatása (pl. áttérés RAID1-ről RAID5-re vagy RAID5-ről RAID6-ra)
* 2.6.17-től a Linux a RAID5-öt tudja újabb diszkkel bővíteni; a többi műveletet is tervezik
o Ráadásul a művelet biztonságos is, ha közben elmegy az áram, nem vesztünk adatot (l. man mdadm)

[szerkesztés] Kernel-paraméterek

* raid=noautodetect: ne ismerje fel és indítsa el automatikusan a 0xfd típusú partíciókat
* raid=partitionable: particionálható tömböket szeretnénk
* md_mod.start_dirty_degraded=1: akkor is elindítja a tömböt, ha degradált is és dirty is - hasznos, ha ez a root filerendszer.
* md=n,dev,dev,…: az mdn a megadott eszközökből állítandó össze boot közben.
* A szinkronizálás sebessége állítható a /sys/block/mdX/md/sync_speed_{max,min} átírásával (van/volt /proc tunable is hozzá, de ezen a héten a sysfs-t szeretjük jobban)
* A szinkronizálás sorrendjét befolyásolhatjuk így: echo idle >/sys/block/md1/md/sync_action. Ekkor az md1 szinkronizálása felfüggesztődik és helyette a sorban következő tömbé kezdődik meg.

[szerkesztés] Az mdadm használata

Üzemmódjai:

1. Assemble
* “Elindítja” (láthatóvá teszi) a megadott tömböt
2. Build
* Szuperblokkmentes tömböt rak össze
* Ilyenkor természetszerűen az első létrehozás és a későbbi újbóli elindítás ugyanaz a művelet
3. Create
* Új (szuperblokkos) tömb létrehozása
4. Follow/Monitor
* A megadott tömbök állapotát figyeli, reagál a változásokra
* Csak redundánds tömbökre van értelme
5. Grow
* Újracsíkozás
6. Manage
* Eszköz hozzáadása tömbhöz, kiszedése, hibásnak jelölése stb
7. Misc
* “Egyéb”: pl. RAID szuperblokk törlése; információkérés
o akkor kell törölni a szuperblokkot, ha végleg el akarunk távolítani egy eszközt egy tömbből

Néhány tipikus felhasználás:
[szerkesztés] Új tömb létrehozása

mdadm –create -l1 -n2 -x1 /dev/md0 /dev/sd[abc]1 # RAID 1, 1 spare
mdadm –create -l5 -n3 -x1 /dev/md0 /dev/sd[abcd]1 # RAID 5, 1 spare
mdadm –create -l6 -n4 -x1 /dev/md0 /dev/sd[abcde]1 # RAID 6, 1 spare

[szerkesztés] Degradált tömb létrehozása

(”Féllábúnak” vagy hiányosnak is mondják.)

A tényleges eszköznév helyére írjuk azt, hogy “missing”:

mdadm –create -l5 -n3 /dev/md0 /dev/sda1 missing /dev/sdb1
mdadm –create -l6 -n4 /dev/md0 /dev/sda1 missing /dev/sdb1 missing

[szerkesztés] Tömb összeillesztése

* Ha már egyszer korábban létrehoztuk, de a kernel még nem inicializálta:

mdadm –assemble –auto=yes /dev/md0 /dev/sd[abc]1

* Ha hiányos, nem indul el magától, kell a –run:

mdadm –assemble –auto=yes –run /dev/md0 /dev/sd[ab]1

* Vagy összerakás után külön elindíthatjuk:

mdadm –run /dev/md0

* A /etc/mdadm/mdadm.conf-ban felsorolt összes tömb összeillesztése és elindítása (ilyesmit csinál az initramfs/initrd:

mdadm –assemble –auto=yes –scan

* Hiányos, piszkos tömb összeillesztése és elindítása (a konzisztencia így nem biztosított!):

mdadm –assemble –auto=yes –force /dev/md0 /dev/sd[ab]1
mdadm –run /dev/md0

[szerkesztés] Tömbök leállítása

mdadm –stop /dev/md0

* Vagy az összesé, ami a configban van:

mdadm –stop –scan

[szerkesztés] Tömbelemek hozzáadása

* Ha már fut a tömb:

mdadm –add /dev/md0 /dev/sdc1

* Ha többet adunk hozzá, mint ahányból létrehozáskor állt, a többletből melegtartalék lesz.

[szerkesztés] Tömbelemek eltávolítása

* Először jelöljük hibásnak, amit ki akarunk venni:

mdadm –fail /dev/md0 /dev/sdb1

* Ekkor elkezdi szinkronizálni a(z egyik) melegtartalékot
* Szedjük is ki a tömbből a hibásnak jelölt eszköz:

mdadm –remove /dev/md0 /dev/sdb1

[szerkesztés] Hibás diszk cseréje

Ha a /dev/sdb failed állapotban van:

mdadm –remove /dev/md0 /dev/sdb
halt # ha nem hot-swappable…
# diszkcsere
mdadm –add /dev/md0 /dev/sdb

[szerkesztés] Új aktív diszk hozzáadása RAID1-hez

* Már fusson a tömb, és:

mdadm –grow -n3 /dev/md0
mdadm –add /dev/md0 /dev/sdc1

[szerkesztés] Aktív diszkek számának csökkentése RAID1-ben

mdadm –fail /dev/md0 /dev/sdc1
mdadm –remove /dev/md0 /dev/sdc1
mdadm –grow -n2 /dev/md0

[szerkesztés] Meglevő fájlrendszer RAID1-esítése

1. Bebootolunk egy live CD-ről (hogy biztosan ne írjon semmi a fájlrendszerbe, miközben másoljuk)
2. Létrehozunk egy új, féllábú RAID1-et a második diszken
3. Rámásoljuk az adatokat
4. Hozzáadjuk a tömbhöz az első diszket
5. Rebootolunk a szép új RAIDes fájlrendszerünkkel

Ha a /dev/sda1 a meglevő fájlrendszer és a /dev/sdb1 az új diszk, akkor:

mdadm –create /dev/md0 -l1 -n2 /dev/sdb1 missing
mkfs -t /dev/md0
mount /dev/sda1 /mnt/sda1
mount /dev/md0 /mnt/md0
rsync -aHSA /mnt/sda1/. /mnt/md0/
vim /mnt/md0/etc/fstab
vim /mnt/md0/boot/grub/menu.lst
umount /mnt/md0
umount /mnt/sda1
mdadm –add /dev/md0 /dev/sda1

* Ezt amúgy lehetne helyben is, ha úgy 1 MB-tal összezsugorítanánk előtte a fájlrendszert, de azért nem ajánlott.

[szerkesztés] Meglevő fájlrendszer RAID5/6-ra helyezése

* Kb. mint fent, de:

# RAID5:
mdadm –create /dev/md0 -l5 -n3 /dev/sdb1 /dev/sdc1 missing
# _vagy_ RAID6:
mdadm –create /dev/md0 -l6 -n4 /dev/sdb1 /dev/sdc1 /dev/sdd1 missing
mkfs -t /dev/md0
mount /dev/sda1 /mnt/sda1
mount /dev/md0 /mnt/md0
rsync -aHSA /mnt/sda1/. /mnt/md0/
vim /mnt/md0/etc/fstab
vim /mnt/md0/boot/grub/menu.lst
umount /mnt/sda1
umount /mnt/md0
mdadm –add /dev/md0 /dev/sda1

* RAID5/6-ról egyetlen elterjedt bootloader sem tud bootolni, úgyhogy a kernel-image-et tartalmazó fs legfeljebb RAID1 legyen…

[szerkesztés] Tömb sorszámának átírása

Ha a /dev/mdX-ből mondjuk /dev/md4-et szeretnénk csinálni:

mdadm –assemble /dev/md4 /dev/sd[abc]1

* Ezt meg fogja jegyezni, a továbbiakban az a tömb magától is md4 lesz
* … legalábbis 2.6-os kernel és legalább RAID1 esetén

Raid, ahogy én csináltam

cfdisk létrehozni a két raides particiót
mdadm –create /dev/md0 –level=1 –raid-devices=2 /dev/sdb1 /dev/dbc1
mdadm –detail –scan>/etc/mdadm/mdadm.conf
majd a /etc/mdadm/mdadm.conf elso sorába: DEVICES /dev/sdb /dev/sdc
létrehozzuk a filerendszert: mkfs -t ext3 /dev/md0
mount /dev/md0 /server
Kész
Irtam egy mountmd.sh scriptet /etc/myscripts alatt van, ott az mdadm –assemble…
Ide kell másolni: /etc/init.d alá. majd az előző initscript szerint

Ha második md akarsz hozzáfüzni, akkor az cfdisk után az mdadm –create nem fogja megtalálni a /dev/md1 filét. Ekkor létre kell hozni azt, így
mknod /dev/mdx b 9 x , ahol az x a md száma, md1-nél 1, stb