RAID (synchronizace pole)

Z DCEwiki
Skočit na navigaci Skočit na vyhledávání

Synchronizace se spouští automaticky po vytvoření nového RAID pole. Je to však proces, který může trvat u velkých a pomalých blokových zařízení i několik hodin a každá další IO operace jej ještě víc zpomalí. Proto je dobré vědět jakým způsobem lze proces synchronizace dat řídit, a jakým způsobem jej lze urychlit.

Průběh synchronizace RAID zařízení lze řídit zápisem příslušné hodnoty do souboru sync_action příslušného RAID zařízení.

Zastavení probíhající synchronizace

Poznámka Pokud chceme u zařízení /dev/md1 proces synchronizace odložit na pozdější dobu, zapíšeme do souboru /sys/block/md1/md/sync_action hodnotu idle
stroj~#  echo idle > /sys/block/md1/md/sync_action

Vytvoření nového RAID pole bez automatického spuštění synchronizace

Automatickému spuštění synchronizace, bezprostředně po vytvoření RAID pole, můžeme zabránit, pokud při jeho vytvoření použijeme parametr --assume-clean. Tím se nastaví, aby zápis nových dat probíhal pouze do těch oblastí PRIMÁRNÍHO disku, které nejsou synchronizovány.

Poznámka
stroj~# mdadm --create --assume-clean --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1

Jak zabránit spouštění synchronizace po přidání nového disku do běžícího pole

Za normálních okolností se synchronizace dat automaticky spouští, je-li do pole přidáno chybějící blokové zařízení. Tomu lze zabránit tím, že se pole přepne do režimu, kdy používá tzv. bitmapu

Bitmapa obsahuje informace o aktuálním stavu synchronizace dat v RAID poli a zajišťuje, aby se nová data nezapisovala do těch míst disku, kde by mohlo dojít ke kolizi s nesynchronizovanými daty na ostatních discích.

Bitmapa se používá především tehdy, pokud potřebujeme pracovat s RAID polem kterého z nějakého důvodu prošlo zhroucením a při automatické synchronizaci dat by mohlo dojít k jejich poškození. Následná rekonstrukce pole po vypnutí bitmapy pak rovněž proběhne rychleji, protože se budou synchronizovat pouze rozhozená data, nikoliv celý disk.

Při použití bitmapy, je sice výkon RAID pole mírně degradován, ale bloková zařízení lze přidávat a odebírat bez toho, aniž by se pokaždé automaticky spustila zdlouhavá rekonstrukce pole.

Upozornění Při použití bitmapy se data zapisují pouze na primary disk!. Je-li tedy nastaveno použití bitmapy na čerstvě vytvořené RAID pole, nebude žádná replikace probíhat a přidaný disk zůstane čistý!
Poznámka Použití bitmapy může být také zbytečné, pokud během výpadku zařízení nemohlo v neúplném RAID poli dojít k nějakým změnám. Typicky když došlo k zastavení celého stroje v jeden okamžik - např. při náhlém přerušení el. proudu, atp.

Zapnutí bitmapy

Poznámka
stroj:~# cat /proc/mdstat 
Personalities : [raid1] 
md1 : active raid1 sdb2[0] sda2[1]
      29302464 blocks [2/2] [UU]
stroj:~# mdadm --grow --bitmap=internal /dev/md1
stroj:~# cat /proc/mdstat                       
Personalities : [raid1] 
md1 : active raid1 sdb2[0] sda2[1]
      29302464 blocks [2/2] [UU]
      bitmap: 1/1 pages [4KB], 65536KB chunk

Vypnutí bitmapy

Po ukončení manipulace s polem lze použití bitmapy vypnout a odstartovat rekonstrukci pole

Poznámka
stroj:~# mdadm --grow --bitmap=none /dev/md1
stroj:~# echo check > /sys/block/md1/md/sync_action 
stroj:~# cat /proc/mdstat                           
Personalities : [raid1] 
md1 : active raid1 sdb2[0] sda2[1]
      29302464 blocks [2/2] [UU]
      [>....................]  check =  0.4% (137856/29302464) finish=7.0min speed=68928K/sec
      
unused devices: <none>

Spuštění synchronizace

Jak se má přistupovat k rozhozeným datům při synchronizaci lze určit hodnotou, která se stejně jako když synchronizaci pozastavujeme, zapíše do souboru sync_action.

Poznámka V případě zařízení /dev/md1 odstartujeme synchronizaci pole zapsáním hodnoty resync do souboru /sys/block/md1/md/sync_action
stroj~#  echo resync > /sys/block/md1/md/sync_action

Po skončení synchronizace dat se automaticky změní hodnota v souboru na idle.

Poznámka Pokud disk synchronizaci nepotřebuje, tak se nestane nic a synchronizace pole se ihned přepne do stavu idle

Chceme-li nejprve zjistit, jak dalece je pole rozhozené, můžeme použít hodnotu check

Poznámka V případě zařízení /dev/md1 zapíšeme hodnotu check do souboru /sys/block/md1/md/sync_action
stroj~#  echo check > /sys/block/md1/md/sync_action

Provede se synchronizace pouze těch datových bloků, které nejsou v konfliktu. V případě rozhozených bloků se pokusí pokusí RAID o obnovu z disku, který má "čerstvější" data. Tzn. že pokud se při synchronizaci narazí na data, která nejsou synchronizována, zapíše se na ostatní disky datový blok z upřednostňovaného disku. V případě že se data nepodaří zesynchronizovat, je blok ignorován. Jak dalece je RAID pole rozhozené, se pak můžete dozvědět z obsahu souboru mismatch_cnt, který najdete na stejném místě jako sync_action, kterým se proces synchronizace řídí. Pokud proběhla synchronizace dobře bude hodnota v tomto souboru nulová.

Poznámka
stroj~# cat /sys/block/md1/md/mismatch_cnt

Při spuštění synchronizace hodnotou repair budou při synchronizaci datové bloky, které se nepodaří opravit vynulovány, s tím že se o opravu poškozených dat pak musí postarat soborovým systém nad RAID polem.

Poznámka V případě zařízení /dev/md1 zapíšeme hodnotu repair do souboru /sys/block/md1/md/sync_action
stroj~#  echo repair > /sys/block/md1/md/sync_action

Nastavení rychlosti synchronizace dat

Synchronizace dat má defaultně stanovené limity, které však lze změnit a tím i ovlivnit, jak dlouho potrvá. Tyto limity vymezují kolik IO operací za sekundu se má provést. Jde o hodnoty, které zajišťují že za normálních okolností nebude synchronizace příliš zatěžovat řadič a tím i zpomalovat ostatní IO operace. Za určitých okolností však může být žádoucí synchronizaci urychlit na úkor ostatních IO operací (např. při obnově havarovaného systému). V takovém případě zvedněte hodnotu minimálního limitu (který je defaultně nastaven na 1000, zatímco maximální limit je defaultně nastaven na 200000) zapsáním nové hodnoty do souboru /proc/sys/dev/raid/speed_limit_min

Poznámka
stroj:~# echo 200000 > /proc/sys/dev/raid/speed_limit_min