Software RAID Linux alatt

A Unix/Linux szerverek üzemeltetése wikiből
(Változatok közti eltérés)
(linkesítés)
a (RAID-szintek: RAID6 is bővíthető)
28. sor: 28. sor:
 
* [[RAID#RAID6|RAID6]]: mint a [[RAID#RAID5|RAID5]], de kétféle paritást tárol, így nem egy, hanem két diszk kiesését viseli el.
 
* [[RAID#RAID6|RAID6]]: mint a [[RAID#RAID5|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).
 
** Á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 [[RAID#RAID1|RAID1]]).
+
** Kb. 2007. nyarától bővíthető, mint a [[RAID#RAID5|RAID5]].
 
* [[RAID#RAID10|RAID10]]: egy absztrakciós szinten megvalósított [[RAID#RAID1.2B0|RAID1+0]].
 
* [[RAID#RAID10|RAID10]]: egy absztrakciós szinten megvalósított [[RAID#RAID1.2B0|RAID1+0]].
 
** Csíkoz, és minden adatot legalább ''n'' példányban tárol.
 
** Csíkoz, és minden adatot legalább ''n'' példányban tárol.

A lap 2007. szeptember 27., 23:37-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).
    • Kb. 2007. nyarától bővíthető, mint a RAID5.
  • 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:

  1. Tápveszté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

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:

  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


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.
      • User-contributed válasz:
      • 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ó?
Személyes eszközök