RAID Software su Linux

Postato il Aggiornato il

raid iconPutroppo i dischi rigidi si guastano frequentemente, e se non si dispone di backup recenti, le conseguenze di un guasto su di un server posso essere anche disastrose.
La tecnologia RAID (Redundant Array of Indipendent Disks) permette di creare sistemi, che replicano e/o distribuiscono  i dati su più dischi, che sono in grado di prevenire la perdita dei dati stessi in caso di guasti.
Questa tecnologia non solo contribuisce a evitare la perdita dei dati (ridondanza dei dati), ma serve anche a  ridurre il tempo necessario al ripristino del sistema in caso di guasto hardware, e in alcuni casi contribuisce anche a miglioramento della capacità di lettura e scrittura sui dischi, incrementando così le prestazioni.
I sistemi RAID sono tipicamente soluzioni hardware ma in Linux è possibile realizzarli anche a livello software, utilizzando hardware standard molto meno costoso.Mi è capitato, in passato, che su un server importante si guastasse un controller dei dischi, e nonostante fosse implementata una configurazione RAID hardware, il danneggiamento del controller aveva distrutto i dati su tutti i dischi.
Fortunatamente esisteva un backup, e dopo un lungo processo di ripristino dei dati, il server è stato ripristinato ed ora gestisce lo stesso RAID ma a livello software tramite il kernel linux, eliminando così la possibilità di un nuovo guasto del controller hadware RAID.
Prima di entrare nei dettagli occorre dedicare un approfondimento sul concetto Linux di “dispositivo a blocchi“, ovvero un dispositivo di archiviazione che può essere letto e scritto blocco per blocco, e un disco rigido ne è l’esempio più lampante.
All’interno del kernel linux è presente il “device mapper” che permette di costruire strutture “mappando” dispositivi a blocchi su altri, ed è usato appunto per creare dispositivi software RAID, formando un concatenamento di dischi al fine di ottenere l’insieme dei dischi come un singolo disco.
La best practice per implementare  il raid software è avere 2 o più dischi identici, collegati a controller hardware separati.
Le configurazioni raid sono diverse e qui tratteremo quella più diffusa ovvero il RAID 5 detto anche “a parità distribuita”.
Nel RAID 5, durante la scrittura dei dati sul disco, i dati vengono separati in blocchi e distribuiti, ovvero effettua lo “striping” dei dati su più unità diverse. La componente di parità è automaticamente generata e viene scritta anch’essa, secondo un algoritmo che di volta in volta ne calcola la posizione. La parità è un valore calcolato che viene utilizzato per ricostruire i dati danneggiati.
raid5

Questa configurazione necessita almeno di 3 dischi, ed effettua lo striping sia dei dati sia delle informazioni di parità, creando così una struttura ridondante (può sopportare la perdita di un disco), e contemporaneamente riduce i tempi di lettura e scrittura.
Inoltre permette anche l’ottimizzazione nell’utilizzo dello spazio disco:
ad esempio in un Raid 5, composto da 5 dischi, solo il 20% dello spazio è utilizzato per la memorizzazione delle informazioni ridondanti.
Quindi nel Raid 5, in caso di rottura di uno dei dischi, i dati contenuti in questo saranno ricostruiti partendo dalle informazioni di parità presenti negli altri.
Lo spazio disponibile sarà anche in questo caso la somma delle dimensioni di tutti i dischi meno uno (che rappresenta le parità distribuite tra i dischi).
In Linux il RAID viene gestito dal device mapper, uno strato software all’interno del kernel tramite lo strumento mdadm.
Può darsi che il programma mdadm non sia installato di default quindi per prima cosa occorre installarlo.
Su Debian:

sudo apt-get install mdadm

Nell’esempio supponiamo di avere 5 dischi, uno di sistema sda e gli altri quattro sdb, sdc, sdd, sde, ognuno da 10GB, per costruire un array RAID5.
Costruiamo il RAID5 con il seguente comando dove “n” è il numero di dischi e “l” è il tipo di RAID:

mdadm -C /dev/md0 -n4 /dev/sdb /dev/sdc /dev/sdd /dev/sde -l5

La risposta a questo comando:

mdadm: Defaulting to version 1.2 metadata

mdad: array /dev/md0 started

con il comando seguente è possibile verificare lo stato dell’array:

mdadm -D /dev/md0/

        Version : 1.2
  Creation Time : Sat Feb  2 23:49:15 2013
     Raid Level : raid5
     Array Size : 31452672 (30.00 GiB 32.21 GB)
  Used Dev Size : 10484224 (10.00 GiB 10.74 GB)
   Raid Devices : 4
  Total Devices : 4
    Persistence : Superblock is persistent
    Update Time : Sat Feb  2 23:51:46 2013
          State : clean
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0
         Layout : left-symmetric
     Chunk Size : 512K
           Name : debian:0  (local to host debian)
           UUID : 0c174040:69eaeaf4:185b6db1:a130d8a1
         Events : 34
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        2      active sync   /dev/sdd
       4       8       64        3      active sync   /dev/sde

Ora è possibile  creare un filesystem sul dispositivo raid appena creato come si farebbe per un disco qualunque:

mke2fs -j /dev/md0

Una volta creato l’array, viene anche automaticamente attivato, ma nei successivi riavvi del sistema, sarà necessario attivare esplicitamente l’array.
Occore inanzitutto creare un file di configurazione, tipicamente /etc/mdadm.conf, che contenga la configurazione.
Ecco, seguendo il nostro esempio, i comandi per crearlo:

echo DEVICE /dev/sdb /dev/sdc /dev/sdd /dev/sde > /etc/mdadm.conf

mdadm –detail –scan >> /etc/mdadm.conf

possiamo vedere il contenuto del file con il comando:

cat /etc/mdadm.conf

con il seguente risultato:

DEVICE /dev/sdb /dev/sdc /dev/sdd /dev/sde
ARRAY /dev/md0 metadata=1.2 name=debian:0UUID=0c174040:69eaeaf4:185b6db1:a130d8a1

Ora mdadm può leggere questo file in fase di avvio e di arresto per la gestione dell’array
Per fare in modo che l’array venga attivato all’avvio con il file /etc/mdadm.conf, appena creato, utilizziamo il comando:

mdadm -As /dev/mdo

Altri comandi utili

Stoppare un Array:

mdadm -S /dev/md0

 Aggiungere un disco all’array md0, per esempio supponiamo di aggiungere il disco sdh all’array md0:

mdadm /dev/md0 –add /dev/sdh

Rimuovere un disco dall’array md0, per esempio supponiamo di rimuovere il disco sdh dall’array md0:

 mdadm /dev/md0 –fail /dev/sdh –remove /dev/sdh

 Monitoraggio e Troubleshooting di un Array.

Esaminare un array:

mdadm -E /dev/sdb1

Monitorare un array:

mdadm –monitor –delay=300 /dev/md0

Ottenere informazioni sugli array in esecuzione:

cat /proc/mdstat

Per un monitoraggio del raid possiamo utilizzare anche strumenti di tipo enterprise come Nagios che ha un apposito plug-in.
Per altre informazioni consultare le pagine man di mdadm oppure il sito http://raid.wiki.kernel.org
Per il calcolo del raid esiste questa comoda utility online http://www.ibeast.com/content/tools/RaidCalc/RaidCalc.asp

IZ

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...