Software RAID Linux alatt
(Potenciális zh-kérdések hozzáadva) |
Aron (vitalap | szerkesztései) (→potenciális megoldás javaslat) |
||
158. sor: | 158. sor: | ||
** Linux softraidet szeretnénk használni. |
** Linux softraidet szeretnénk használni. |
||
** Legalább egy diszkünk legyen hotspare. |
** Legalább egy diszkünk legyen hotspare. |
||
+ | |||
+ | *** ha RAID10-et készítünk 5 diszkből, 1 hotspare, akkor ippeg 2,5 diszknyi kapacitást kapunk, valamint minden adat pontosan két példányban, két különböző diszken lesz jelen, sőt még csíkoz is |
||
+ | *** ha RAID5-öt készítünk 5 diszkből, 1 hotspare, akkor mintegy 4 diszknyi kapacitást kapunk, feltehetőleg ez sem rossz megoldás |
||
+ | *** ha RAID6-ot készítünk 5 diszkből, 1 hotspare, talán még akkor is több, mint 2,5 diszknyi kapacitást kapunk, és ez két kiesett diszk hibát is tolerál |
||
+ | |||
* Mit csinál a Linux újraszinkronizáláskor RAID1, RAID5, RAID6 ill. RAID10 esetén? |
* Mit csinál a Linux újraszinkronizáláskor RAID1, RAID5, RAID6 ill. RAID10 esetén? |
||
* Mi a bitmap write intent logging, és mire jó? |
* Mi a bitmap write intent logging, és mire jó? |
A lap 2006. november 13., 23:28-kori változata
Linux alatt két programcsomag hivatott a szoftveres RAID kezelésére: a raidtools2 és az mdadm. Mi most csak az mdadm-mal foglalkozunk, mert a raidtools2 kihalófélben van: ha valaki akarja, házi feladatként bemutathatja.
Tartalomjegyzék |
1 RAID-tömbök
Linux alatt a RAID-tömböknek is lehet szuperblokkja; ez a tömböt alkotó blockdevice végé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).
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 devices")
1.1 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.
- Egy csík (stripe) itt egy valamennyi fizikai eszközre kiterjedő, logikailag folytonos blokkcsoportot jelent.
- Jelenleg nem bővíthető.
- RAID1: minden diszken pontosan ugyanaz van.
- 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ő).
- "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 van a csíkok paritása.
- Itt is minden eszközből csak annyi kapacitás hasznosul, amennyi a tömb legkisebb elemén rendelkezésre áll.
- Nem érdemes használni.
- Jelenleg nem bővíthető (csak mint a RAID1).
- RAID5: mint a RAID4, de a paritást is csíkozza.
- 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.
- Á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).
- Jelenleg nem bővíthető (csak mint a RAID1).
- RAID10: egy absztrakciós szinten megvalósított RAID1+0.
- Csíkoz, és minden adatot legalább n példányban tárol.
- 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.
- 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.
- Lehet hozzá hotspare-t adni (RAID0-hoz nem, RAID1+0-hoz sem, RAID0+1-hez pedig legalább kettő kellene).
- Kétfé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.
- A replika-elhelyezési módszerek keverhetők: kérhetünk pl. egy near és egy far replikát. Jó ez valamire?
- Jelenleg nem bővíthető.
1.2 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
- Ha indításkor dirty, resync:
- RAID1: az első diszkről a többire másolja a tartalmat
- RAID4, RAID5, RAID6: a diszken található adatokból újraszámolja a paritást és azt írja a paritásblokkba
- RAID10: minden adat első replikáját rámásolja a többire
- Resync közben a tömb írható és olvasható
- Igyekszik úgy ütemezni, hogy a resyncre ne nagyon kelljen várnia a többi processznek
- 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 I/O 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
- 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.
1.3 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
- Ez a "szándéknapló" utólag is hozzáadható működő tömbhöz
- Ha az adott területre nem történik több írás, a vonatkozó bitet törli
- Ha kiveszünk egy diszket a tömbből, a biteket nem törli
Így:
- Tápvesztés után nem kell teljes resync, csak a bitmap alapján piszkos részekhez kell nyúlni
- Ha egy diszket kiveszünk a tömbből, majd visszarakjuk, nem az egész tömböt kell újraszinkronizálni
1.4 Write-behind
- 2.6.14 óta
- RAID1-en
- A tömb elemein beállíthatjuk a "write-behind" jelzést, aminek két hatása van:
- Az md driver lehetőleg nem olvas az eszközről
- Ha van write-intent bitmap is, akkor 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 nem lassítja a rendszer működését
- Túl lassú kapcsolat esetén persze nem jó
1.5 Újracsíkozás
- Restriping, reshaping
- A tömb újraírása a struktúra megváltoztatása érdekében, pl:
- Diszkek számának növelése ("szélesebb" csíkok)
- Blokkméret csökkentése ("sekélyebb" csíkok)
- Blokkméret növelése ("mélyebb" csíkok)
- 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
- Ráadásul a művelet biztonságos is, ha közben elmegy az áram, nem vesztünk adatot (l. man mdadm)
2 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.
3 Az mdadm használata
Üzemmódjai:
- Assemble
- "Elindítja" (láthatóvá teszi) a megadott tömböt
- 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
- Create
- Új (szuperblokkos) tömb létrehozása
- Follow/Monitor
- A megadott tömbök állapotát figyeli, reagál a változásokra
- Csak redundánds tömbökre van értelme
- Grow
- Újracsíkozás
- Manage
- Eszköz hozzáadása tömbhöz, kiszedése, hibásnak jelölése stb
- Misc
- "Egyéb": pl. RAID szuperblokk törlése; információkérés
Csináljunk magunknak játszóteret:
# mkdir /tmp/raidtest # cd /tmp/raidtest # modprobe loop max_loop=64 # for i in {0..63}; do dd if=/dev/zero of=loop$i seek=1G bs=1 count=1; done # for i in {0..63}; do losetup -f loop$i; done # mdadm --create /dev/md0 --auto yes --level=1 --raid-devices=2 --spare-devices=1 /dev/loop0 /dev/loop1 /dev/loop2 mdadm: array /dev/md0 started. # cat /proc/mdstat Personalities : [raid1] md0 : active raid1 loop2[2](S) loop1[1] loop0[0] 1048512 blocks [2/2] [UU] [=====>...............] resync = 26.9% (282880/1048512) finish=5.8min speed=2176K/sec unused devices: <none> # mdadm --stop /dev/md0 # cat /proc/mdstat Personalities : [raid1] unused devices: <none>
4 Potenciális zh-kérdések
- Hasonlítsa össze a RAID0+1 és a RAID1+0 elrendezést! Miért jobb az egyik, mint a másik? Esetleg egyformán jók?
- A RAID0, a RAID1, a RAID5, a RAID6, a RAID10, RAID1 over RAID0 és a RAID0 over RAID1 elrendezés közül melyikhez lehet értelmesen hozzáadni egy darab hotspare-t? (Tegyük fel, hogy a RAIDx over RAIDy esetében az egymás fölött megvalósított RAID-tömbök nem tudnak egymásról.)
- Milyen RAID-elrendezést választana, ha a következő feltételeknek kell megfelelni?
- 6 darab egyforma nagyságú diszkünk van.
- Minden adatot legalább két példányban akarunk tárolni, két különböző diszken.
- Legalább 2,5 diszknyi kapacitásra van szükségünk.
- Linux softraidet szeretnénk használni.
- Legalább egy diszkünk legyen hotspare.
- ha RAID10-et készítünk 5 diszkből, 1 hotspare, akkor ippeg 2,5 diszknyi kapacitást kapunk, valamint minden adat pontosan két példányban, két különböző diszken lesz jelen, sőt még csíkoz is
- ha RAID5-öt készítünk 5 diszkből, 1 hotspare, akkor mintegy 4 diszknyi kapacitást kapunk, feltehetőleg ez sem rossz megoldás
- ha RAID6-ot készítünk 5 diszkből, 1 hotspare, talán még akkor is több, mint 2,5 diszknyi kapacitást kapunk, és ez két kiesett diszk hibát is tolerál
- Mit csinál a Linux újraszinkronizáláskor RAID1, RAID5, RAID6 ill. RAID10 esetén?
- Mi a bitmap write intent logging, és mire jó?
- Mi a write-behind a linuxos softraid kontextusában, és mire jó?