A RAID (angolul Redundant Array of Inexpensive Disks vagy Redundant Array of Independent Disks) tárolási technológia, mely segítségével az adatok elosztása vagy replikálása több fizikailag független merevlemezen, egy logikai lemez létrehozásával lehetséges. (RAID - Wikipédia)
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