Software RAID Linux alatt
(Bővítés 2007: v0.2) |
|||
4. sor: | 4. sor: | ||
== [[RAID]]-tömbök == |
== [[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. |
+ | 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 [[RAID#RAID0|RAID0]] fölött [[RAID#RAID1|RAID1]]-et vagy fordítva, ahogyan jól esik). |
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 [[RAID#RAID0|RAID0]] fölött [[RAID#RAID1|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") |
+ | Többféle szuperblokk-verzió van, az alábbi előnyökkel/hátrányokkal: |
+ | |||
+ | * 0.90: |
||
+ | ** a kernel össze tudja rakni a tömböket boot közben |
||
+ | ** nem hordozható architektúrák között |
||
+ | ** az eszköz végén van |
||
+ | ** előfordulhat, hogy egy diszk és a rajta levő utolsó partíció RAID-szuperblokkja ugyanoda esik |
||
+ | ** legfeljebb 28 elemű tömböket támogat |
||
+ | |||
+ | * 1.[012]: |
||
+ | ** csak userspace-ből rakhatók össze a tömbök |
||
+ | *** vagyis ha RAIDről akarunk bootolni, initrd vagy initramfs kell |
||
+ | ** lehet az eszköz elején és végén is |
||
+ | ** 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. |
||
=== [[RAID]]-szintek === |
=== [[RAID]]-szintek === |
||
16. sor: | 16. sor: | ||
* [[RAID#RAID0|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. |
* [[RAID#RAID0|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. |
** Egy csík (stripe) itt egy valamennyi fizikai eszközre kiterjedő, logikailag folytonos blokkcsoportot jelent. |
||
+ | ** Az egy diszkre eső csíkszelet neve ''chunk''. |
||
** Jelenleg nem bővíthető. |
** Jelenleg nem bővíthető. |
||
* [[RAID#RAID1|RAID1]]: minden diszken pontosan ugyanaz van. |
* [[RAID#RAID1|RAID1]]: minden diszken pontosan ugyanaz van. |
||
+ | ** Párhuzamosan ír minden eszközre. |
||
+ | ** 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). |
||
** 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ő). |
** 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. |
** "Bővíthető": ha az összes diszket nagyobbra cseréljük benne (szép sorban), akkor a tömb is megnőhet. |
||
− | * [[RAID#RAID4|RAID4]]: mint a [[RAID#RAID0|RAID0]], de egy külön eszközön van a csíkok paritása. |
+ | * [[RAID#RAID4|RAID4]]: mint a [[RAID#RAID0|RAID0]], de egy külön eszközön (az utolsó aktívon) 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. |
** 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. |
+ | ** Nem érdemes használni (kivéve, ha az egyik diszk sokkal gyorsabb, mint a többi). |
** Jelenleg nem bővíthető (csak mint a [[RAID#RAID1|RAID1]]). |
** Jelenleg nem bővíthető (csak mint a [[RAID#RAID1|RAID1]]). |
||
* [[RAID#RAID5|RAID5]]: mint a [[RAID#RAID4|RAID4]], de a paritást is csíkozza. |
* [[RAID#RAID5|RAID5]]: mint a [[RAID#RAID4|RAID4]], de a paritást is csíkozza. |
||
34. sor: | 37. sor: | ||
** 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. |
** 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 ([[RAID#RAID0|RAID0]]-hoz nem, [[RAID#RAID1.2B0|RAID1+0]]-hoz sem, [[RAID#RAID0.2B1|RAID0+1]]-hez pedig legalább kettő kellene). |
** Lehet hozzá hotspare-t adni ([[RAID#RAID0|RAID0]]-hoz nem, [[RAID#RAID1.2B0|RAID1+0]]-hoz sem, [[RAID#RAID0.2B1|RAID0+1]]-hez pedig legalább kettő kellene). |
||
− | ** Kétféle replika-elhelyezési módszert tud: |
+ | ** Háromféle replika-elhelyezési módszert tud: |
*** near: egy csíkban (vagyis egymáshoz közel) helyezi el a replikákat. |
*** 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. |
*** far: egymástól távol helyezi el a replikákat. |
||
**** Előnye: jobb szekvenciális olvasási teljesítmény. |
**** Előnye: jobb szekvenciális olvasási teljesítmény. |
||
**** Hátránya: lassúbb írás. |
**** 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.'' |
||
** A replika-elhelyezési módszerek keverhetők: kérhetünk pl. egy near és egy far replikát. ''Jó ez valamire?'' |
** 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ő. |
** Jelenleg nem bővíthető. |
||
46. sor: | 53. sor: | ||
* Alapesetben írás előtt dirtynek jelöli a tömböt |
* Alapesetben írás előtt dirtynek jelöli a tömböt |
||
* A tömb leállításakor clean lesz |
* A tömb leállításakor clean lesz |
||
+ | ** 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 |
||
+ | ** 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: |
* Ha indításkor dirty, resync: |
||
** RAID1: az első diszkről a többire másolja a tartalmat |
** RAID1: az első diszkről a többire másolja a tartalmat |
||
54. sor: | 64. sor: | ||
** sysfs, procfs: <tt>speed_limit_min</tt>, <tt>speed_limit_max</tt> |
** sysfs, procfs: <tt>speed_limit_min</tt>, <tt>speed_limit_max</tt> |
||
* Ha már nincs redundancia, akkor a 2.6-os kernel a dirty arrayt nem is hajlandó automatikusan elindítani |
* 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 í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 |
* 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. |
* 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. |
||
+ | ** Ez jól hangzik, de nem biztos, hogy a gyakorlatban is jó - lehet, hogy jobb lenne cserélni azt a diszket. |
||
=== Bitmap write-intent logging === |
=== Bitmap write-intent logging === |
||
62. sor: | 73. sor: | ||
* 2.6.13 óta az md driver egy bitmap-naplóban jelzi, hogy hova fog írni |
* 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 |
* 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 |
+ | * 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 nem történik több írás, a vonatkozó bitet törli |
+ | * 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 nem törli |
+ | * Ha kiveszünk egy diszket a tömbből, a biteket a többin sem törli már |
Így: |
Így: |
||
− | # Tápvesztés után nem kell teljes resync, csak a bitmap alapján piszkos részekhez kell nyúlni |
+ | # Tápvesztés és dirty indulá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 |
# 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. |
||
+ | |||
+ | === Write-mostly === |
||
+ | |||
+ | * [[RAID#RAID1|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 |
||
=== Write-behind === |
=== Write-behind === |
||
75. sor: | 94. sor: | ||
* 2.6.14 óta |
* 2.6.14 óta |
||
* [[RAID#RAID1|RAID1]]-en |
* [[RAID#RAID1|RAID1]]-en |
||
− | * A tömb elemein beállíthatjuk a "write-behind" jelzést, aminek két hatása van: |
+ | * Csak write-mostly tömbelemen |
− | ** Az md driver lehetőleg nem olvas az eszközről |
+ | * Hatása: az adott eszközre aszinkron módon ír |
− | ** 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 még annyira sem lassítja a rendszer működését, mint a write-mostly esetén |
− | * É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ú (szaturált) kapcsolat esetén persze nem jó |
− | ** Túl lassú kapcsolat esetén persze nem jó |
||
=== Újracsíkozás === |
=== Újracsíkozás === |
||
97. sor: | 116. sor: | ||
* 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_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 md''n'' a megadott eszközökből állítandó össze boot közben. |
* md=n,dev,dev,...: az md''n'' a megadott eszközökből állítandó össze boot közben. |
||
+ | * A szinkronizálás sebessége állítható a <tt>/sys/block/mdX/md/sync_speed_{max,min}</tt> á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: <tt>echo idle >/sys/block/md1/md/sync_action</tt>. Ekkor az md1 szinkronizálása felfüggesztődik és helyette a sorban következő tömbé kezdődik meg. |
||
== Az mdadm használata == |
== Az mdadm használata == |
||
118. sor: | 139. sor: | ||
# Misc |
# Misc |
||
#* "Egyéb": pl. RAID szuperblokk törlése; információkérés |
#* "Egyéb": pl. RAID szuperblokk törlése; információkérés |
||
+ | #** 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: |
||
+ | |||
+ | === Új tömb létrehozása === |
||
− | Csináljunk magunknak játszóteret: |
||
<pre> |
<pre> |
||
− | # mkdir /tmp/raidtest |
+ | mdadm --create -l1 -n2 -x1 /dev/md0 /dev/sd[abc]1 # RAID 1, 1 spare |
− | # cd /tmp/raidtest |
+ | mdadm --create -l5 -n3 -x1 /dev/md0 /dev/sd[abcd]1 # RAID 5, 1 spare |
− | # modprobe loop max_loop=64 |
+ | mdadm --create -l6 -n4 -x1 /dev/md0 /dev/sd[abcde]1 # RAID 6, 1 spare |
− | # for i in {0..63}; do dd if=/dev/zero of=loop$i seek=1G bs=1 count=1; done |
+ | </pre> |
− | # 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 |
+ | === Degradált tömb létrehozása === |
− | mdadm: array /dev/md0 started. |
||
− | # cat /proc/mdstat |
+ | ("Féllábúnak" vagy hiányosnak is mondják.) |
− | 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> |
+ | A tényleges eszköznév helyére írjuk azt, hogy "missing": |
− | # mdadm --stop /dev/md0 |
+ | <pre> |
+ | mdadm --create -l5 -n3 /dev/md0 /dev/sda1 missing /dev/sdb1 |
||
+ | mdadm --create -l6 -n4 /dev/md0 /dev/sda1 missing /dev/sdb1 missing |
||
+ | </pre> |
||
− | # cat /proc/mdstat |
+ | === Tömb összeillesztése === |
− | Personalities : [raid1] |
||
− | unused devices: <none> |
||
+ | * Ha már egyszer korábban létrehoztuk, de a kernel még nem inicializálta: |
||
+ | |||
+ | <pre> |
||
+ | mdadm --assemble --auto=yes /dev/md0 /dev/sd[abc]1 |
||
</pre> |
</pre> |
||
+ | |||
+ | * Ha hiányos, nem indul el magától, kell a <tt>--run</tt>: |
||
+ | |||
+ | <pre> |
||
+ | mdadm --assemble --auto=yes --run /dev/md0 /dev/sd[ab]1 |
||
+ | </pre> |
||
+ | |||
+ | * Vagy összerakás után külön elindíthatjuk: |
||
+ | |||
+ | <pre> |
||
+ | mdadm --run /dev/md0 |
||
+ | </pre> |
||
+ | |||
+ | * A <tt>/etc/mdadm/mdadm.conf</tt>-ban felsorolt összes tömb összeillesztése és elindítása (ilyesmit csinál az <tt>initramfs/initrd</tt>: |
||
+ | |||
+ | <pre> |
||
+ | mdadm --assemble --auto=yes --scan |
||
+ | </pre> |
||
+ | |||
+ | * Hiányos, piszkos tömb összeillesztése és elindítása (a konzisztencia így nem biztosított!): |
||
+ | |||
+ | <pre> |
||
+ | mdadm --assemble --auto=yes --force /dev/md0 /dev/sd[ab]1 |
||
+ | mdadm --run /dev/md0 |
||
+ | </pre> |
||
+ | |||
+ | === Tömbök leállítása === |
||
+ | |||
+ | </pre> |
||
+ | mdadm --stop /dev/md0 |
||
+ | </pre> |
||
+ | * Vagy az összesé, ami a configban van: |
||
+ | <pre> |
||
+ | mdadm --stop --scan |
||
+ | </pre> |
||
+ | |||
+ | === Tömbelemek hozzáadása === |
||
+ | |||
+ | * Ha már fut a tömb: |
||
+ | <pre>mdadm --add /dev/md0 /dev/sdc1</pre> |
||
+ | * Ha többet adunk hozzá, mint ahányból létrehozáskor állt, a többletből melegtartalék lesz. |
||
+ | |||
+ | === Tömbelemek eltávolítása === |
||
+ | |||
+ | * Először jelöljük hibásnak, amit ki akarunk venni: |
||
+ | <pre>mdadm --fail /dev/md0 /dev/sdb1</pre> |
||
+ | * Ekkor elkezdi szinkronizálni a(z egyik) melegtartalékot |
||
+ | * Szedjük is ki a tömbből a hibásnak jelölt eszköz: |
||
+ | <pre>mdadm --remove /dev/md0 /dev/sdb1</pre> |
||
+ | |||
+ | === Hibás diszk cseréje === |
||
+ | |||
+ | Ha a /dev/sdb failed állapotban van: |
||
+ | |||
+ | <pre> |
||
+ | mdadm --remove /dev/md0 /dev/sdb |
||
+ | halt # ha nem hot-swappable... |
||
+ | # diszkcsere |
||
+ | mdadm --add /dev/md0 /dev/sdb |
||
+ | </pre> |
||
+ | |||
+ | === Új aktív diszk hozzáadása RAID1-hez === |
||
+ | |||
+ | * Már fusson a tömb, és: |
||
+ | <pre> |
||
+ | mdadm --grow -n3 /dev/md0 |
||
+ | mdadm --add /dev/md0 /dev/sdc1 |
||
+ | </pre> |
||
+ | |||
+ | === Aktív diszkek számának csökkentése RAID1-ben === |
||
+ | <pre> |
||
+ | mdadm --fail /dev/md0 /dev/sdc1 |
||
+ | mdadm --remove /dev/md0 /dev/sdc1 |
||
+ | mdadm --grow -n2 /dev/md0 |
||
+ | </pre> |
||
+ | |||
+ | === Meglevő fájlrendszer RAID1-esítése === |
||
+ | |||
+ | # Bebootolunk egy live CD-ről (hogy biztosan ne írjon semmi a fájlrendszerbe, miközben másoljuk) |
||
+ | # Létrehozunk egy új, féllábú RAID1-et a második diszken |
||
+ | # Rámásoljuk az adatokat |
||
+ | # Hozzáadjuk a tömbhöz az első diszket |
||
+ | # Rebootolunk a szép új RAIDes fájlrendszerünkkel |
||
+ | |||
+ | Ha a <tt>/dev/sda1</tt> a meglevő fájlrendszer és a <tt>/dev/sdb1</tt> az új diszk, akkor: |
||
+ | |||
+ | <pre> |
||
+ | mdadm --create /dev/md0 -l1 -n2 /dev/sdb1 missing |
||
+ | mkfs -t <type> /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 |
||
+ | </pre> |
||
+ | |||
+ | * 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. |
||
+ | |||
+ | === Meglevő fájlrendszer RAID5/6-ra helyezése === |
||
+ | * Kb. mint fent, de: |
||
+ | |||
+ | <pre> |
||
+ | # 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 <type> /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 |
||
+ | </pre> |
||
+ | |||
+ | * RAID5/6-ról egyetlen elterjedt bootloader sem tud bootolni, úgyhogy a kernel-image-et tartalmazó fs legfeljebb RAID1 legyen... |
||
+ | |||
+ | === Tömb sorszámának átírása === |
||
+ | |||
+ | Ha a /dev/mdX-ből mondjuk /dev/md4-et szeretnénk csinálni: |
||
+ | <pre> |
||
+ | mdadm --assemble /dev/md4 /dev/sd[abc]1 |
||
+ | </pre> |
||
+ | |||
+ | * 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 |
||
== Potenciális zh-kérdések == |
== Potenciális zh-kérdések == |
||
149. sor: | 308. 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. |
||
− | *** 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? |
* 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 2007. október 2., 00:22-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.
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 (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:
- a kernel össze tudja rakni a tömböket boot közben
- nem hordozható architektúrák között
- az eszköz végén van
- előfordulhat, hogy egy diszk és a rajta levő utolsó partíció RAID-szuperblokkja ugyanoda esik
- legfeljebb 28 elemű tömböket támogat
- 1.[012]:
- csak userspace-ből rakhatók össze a tömbök
- vagyis ha RAIDről akarunk bootolni, initrd vagy initramfs kell
- lehet az eszköz elején és végén is
- többszáz tömbelemet támogat
- csak userspace-ből rakhatók össze a tömbök
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.
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.
- Az egy diszkre eső csíkszelet neve chunk.
- Jelenleg nem bővíthető.
- RAID1: minden diszken pontosan ugyanaz van.
- Párhuzamosan ír minden eszközre.
- 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).
- 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 (az utolsó aktívon) 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 (kivéve, ha az egyik diszk sokkal gyorsabb, mint a többi).
- 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).
- 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.
- 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
- 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
- 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:
- 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 í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
- 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.
- Ez jól hangzik, de nem biztos, hogy a gyakorlatban is jó - lehet, hogy jobb lenne cserélni azt 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, é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:
- Tápvesztés és dirty indulá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
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.
1.4 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
1.5 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
- Túl lassú (szaturált) kapcsolat esetén persze nem jó
1.6 Újracsíkozás
- Restriping, reshaping
- A tömb újraírása a struktúra megváltoztatása érdekében, pl:
- 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.
- 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.
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
- akkor kell törölni a szuperblokkot, ha végleg el akarunk távolítani egy eszközt egy tömbből
- "Egyéb": pl. RAID szuperblokk törlése; információkérés
Néhány tipikus felhasználás:
3.1 Ú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
3.2 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
3.3 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
3.4 Tömbök leállítása
</pre> mdadm --stop /dev/md0 </pre>
- Vagy az összesé, ami a configban van:
mdadm --stop --scan
3.5 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.
3.6 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
3.7 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
3.8 Ú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
3.9 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
3.10 Meglevő fájlrendszer RAID1-esítése
- Bebootolunk egy live CD-ről (hogy biztosan ne írjon semmi a fájlrendszerbe, miközben másoljuk)
- Létrehozunk egy új, féllábú RAID1-et a második diszken
- Rámásoljuk az adatokat
- Hozzáadjuk a tömbhöz az első diszket
- 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 <type> /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.
3.11 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 <type> /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...
3.12 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
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.
- 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ó?