1   RAID

1.1   Introduzione alla gestione dei RAID sotto Gnu/Linux

Author: Andrea Manni
Copyright: GFDL
Version: 1

Generato il 2010-01-20 con: http://docutils.sourceforge.net/rst.html

La sigla RAID indica un Redundant Array of Independent Disks oppure un Redundant Array of Inexpensive Disks, e' un sistema informatico basato su un insieme di block devices tra loro indipendenti (tipicamente hard disks) che lavorano insieme per rendere in fine disponibile al sistema operativo un solo block device che, a seconda del tipo di RAID scelto (quindi della struttura dell'array) offrira' particolari caratteristiche come ridondanza dei dati, controllo di parita', o un miglioramento delle prestazioni di accesso e scrittura dei dati.

I RAID vengono distinti in vari livelli, tra questi si differenziano sostanzialmente per:

  • Capacita' di storaggio resa disponibile in rapporto alla somma delle dimensioni dei singoli elementi
  • Ridondanza dei dati
  • Velocita' di lettura dei dati
  • Velocita' di scrittura dei dati
  • Controllo di parita' sui dati

1.2   Un RAID non sostituisce il back-up

E' importante notare fin da subito che la presenza di un RAID non e' un alibi valido per non tenere un back-up dei dati: i RAID non sono un back-up.

In caso di cancellazione accidentale di dati importanti, o compromissione di questi da parte di eventi come virus o attacchi esterni, l'evento si ripeterebbe infatti su tutto l'array senza nessuna possibilita' di recuperare lo stato precedente.

2   Terminologia

Identifichiamo alcuni dei termini comuni nei RAID.

Array (RAID):
L'insieme di piu' block device che compongono il sistema (array) RAID.
Spare disk:
Un elemento dell'array (quindi un disco rigido in genere) che non viene usato inizialmente per lo storaggio dati, ma resta disponibile per sostituire un eventuale altro elemento che dovesse presentare dei malfunzionamenti.
Parita':
Calcolo eseguito mediante una funzione logica XOR che permette di estrapolare il contenuto di un elemento dell'array non piu' funzionante. Se su quattro dischi rigidi (in un RAID di tipo stripe) si aggiunge un quinto supporto per la parita', in caso di rottura di uno qualsiasi (ma uno solo!) dei supporti sara' possibile calcolare il valore mancante e garantire il funzionamento dello stripe.

Link: http://en.wikipedia.org/wiki/RAID#Parity_calculation.3B_rebuilding_failed_drives

HOT (swap):
Possibilita' di sostituzione a caldo (senza dover spegnere il computer e interrompere i servizi da questo erogati) di un elemento dell'array.

3   RAID 1 Mirror

Scema: http://www.acnc.com/04_01_01.html

Il Raid mirror privilegia la ridondanza dei dati, in modo da mantenere la disponibilita' del filesystem ospitato sul raid in caso di rottura di uno dei device fisici componenti l'array. Il costo di questa tolleranza ai guasti e' una riduzione alla meta' della capacita' di storaggio dell'array a confronto della somma dei singoli elementi.

E' uno dei RAID piu' semplici dal punto dell'implementazione, tant'e' che dovrebbe essere possibile utilizzare il filesystem ospitato su uno dei (due o piu') membri dell'array autonomamente in caso di compromissione dell'intero array.

Al fine di aumentarne ulteriormente l'affidabilita' e' possibile introdurre un elemento spare nell'array.

4   RAID 0 Stripe

Schema: http://www.acnc.com/04_01_00.html

Migliora le prestazioni sia in scrittura che in lettura ma aumentano proporzionalmente al numero di devices le probabilita' di rottura dell'array. In caso di rottura di un singolo elemento si perde l'intero array (praticamente tutti i dati!).

Permette di sfruttare pienamente la capacita' di storaggio di tutti gli elementi.

Non prevede la possibilita' di usare uno spare, ma si consiglia caldamente di avere un back-up dei dati o di utilizzarlo solo per dati sostituibili come la cache di un proxy server HTTP o un mirror di materiali comunque disponibili altrove.

5   Schema: la parita'

Parita':

Calcolo eseguito mediante una funzione logica XOR che permette di estrapolare il contenuto di un elemento dell'array non piu' funzionante. Se su quattro dischi rigidi (in un RAID di tipo stripe) si aggiunge un quinto supporto per la parita', in caso di rottura di uno qualsiasi (ma uno solo!) dei supporti sara' possibile calcolare il valore mancante e garantire il funzionamento dello stripe.

Link: http://en.wikipedia.org/wiki/RAID#Parity_calculation.3B_rebuilding_failed_drives

Alcuni schemi decisamente comprensibili per comprendere come un solo elemento dedicato alla parita' possa permettere di mantenere in caso di rottura la consistenza dell'intera struttura dati dell'array permettendo di ricalcolare il contenuto di uno qualunque tra 4 device facenti parte dell'array.

4 device funzionanti e 1 di parita'
                         Parita'
|-1-| |-1-| |-0-| |-1-|   |-1-|
|-0-| |-1-| |-1-| |-1-|   |-1-|
|-1-| |-0-| |-1-| |-0-|   |-0-|
|-0-| |-1-| |-0-| |-1-|   |-0-|
|---| |---| |---| |---|   |---|
|---| |---| |---| |---|   |---|
|---| |---| |---| |---|   |---|
|---| |---| |---| |---|   |---|
|---| |---| |---| |---|   |---|

-------------------------------------
        Rotto il device n a
                         Parita'
|-1-| |-1-| |-0-| |-x1|   |-1-|
|-0-| |-1-| |-1-| |-x1|   |-1-|
|-1-| |-0-| |-1-| |-x0|   |-0-|
|-0-| |-1-| |-0-| |-x1|   |-0-|
|---| |---| |---| |-x-|   |---|
|---| |---| |---| |-x-|   |---|
|---| |---| |---| |-x-|   |---|
|---| |---| |---| |-x-|   |---|
|---| |---| |---| |-x-|   |---|

-------------------------------------
        Rotto  il device n 2
                         Parita'
|-1-| |-x1| |-0-| |-1-|   |-1-|
|-0-| |-x1| |-1-| |-1-|   |-1-|
|-1-| |-x0| |-1-| |-0-|   |-0-|
|-0-| |-x1| |-0-| |-1-|   |-0-|
|---| |-x-| |---| |---|   |---|
|---| |-x-| |---| |---|   |---|
|---| |-x-| |---| |---|   |---|
|---| |-x-| |---| |---|   |---|
|---| |-x-| |---| |---|   |---|

6   RAID 4

Schema: http://www.acnc.com/04_01_04.html

E' il primo tipo di RAID a prevedere il calcolo della parita'. Il problema principale e' il collo di bottiglia costituito dalla parita' essendo questa tenuta su un unico device, che deve essere quindi utilizzato piu' spesso degli altri.

Altamente consigliato l'uso di uno spare disk.

Non viene praticamente mai utilizzato preferendogli un RAID 5.

7   RAID 5

Schema: http://www.acnc.com/04_01_05.html

Sostanzialmente un RAID 4 in cui la parita' viene distribuita su tutti gli elementi dell'array: sara' comunque opportuno avere uno spare disk.

8   Caratteristiche

Si consideri un caso di - n supporti di storaggio - della dimensione di 1GB l'uno - Velocita' di 20MB/s (read / write)

Qualita RAID 0 RAID 1 RAID 4 Raid 5
Storaggio n*Dm n*Dm/n (n-1)*Dm n-1(Dm)
Ridondanza NO Y Y Y
V Lettura n*Vm ~20MB Vm*(n-1) Vm(n-1)
V Scrittura n*Vm ~10MB Vpar Vm(n-1)
Stripe NO SI SI SI
Vm:
Velocita' minima del supporto
Dm:
Dimensione dell'elemento piu' piccolo dell'array (nel caso siano di misure differenti tra loro)
Vpar:
Velocita' HD di parita'.

9   Controller raid

I raid possono essere gestiti sia in hardware che in software, per ulteriori approfondimenti :

10   RAID software in Linux: mdadm

11   Storia dell'esercitazione in aula

Storia dell'esercitazione in aula:

# Storia del RAID di Andrea

471  cfdisk /dev/hda
472  cfdisk /dev/hdd
473  reboot
474  cat /proc/partitions
475  cat /proc/partitions | grep 10
476  apt-get install mdadm
477  mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/hda10 /dev/hdd10
478  cat /proc/mdstat
479  mkfs.ext3 /dev/md0
480  mkdir /mnt/mirror
481  mount /dev/md0 /mnt/mirror/
482  cat /proc/mdstat
483  mount | grep mirro
484  discus
485  cp -r /etc /mnt/mirror/
486  ls -l /mnt/mirror/
487  man mdadm
488  mdadm /dev/md0  --fail /dev/hdd10
489  cat /proc/mdstat
490  cd /mnt/mirror/
491  ls
492  ls etc/
493  cd /mnt/mirror/
494  cat /proc/mdstat
495  mdadm /dev/md0  --remove /dev/hdd10
496  cat /proc/mdstat
497  mdadm /dev/md0  --add /dev/hdd10
498  cat /proc/mdstat
499  cat /proc/mdstat
500  mkdir pippo
501  touch pippo/poopopopo
502  cat /proc/mdstat
505  cd
506  umount /mnt/mirror
507  cat /proc/mdstat
508  vim /etc/mdadm/mdadm.conf
510  mdadm --detail --scan
511  mdadm --detail --scan /dev/hda
512  mdadm --detail --scan /dev/hda10
513  mdadm --detail --scan /dev/md0
514  dpkg-reconfigure mdadm
515  vim /etc/mdadm/mdadm.conf
516  cat /proc/mdstat
517  mdadm -S /dev/md0
518  cat /proc/mdstat
519  mdadm -s /dev/md0
520  mdadm --start /dev/md0
521  mdadm -As /dev/md0
522  mdadm -A /dev/md0 /dev/hda10 /dev/hdd10
523  cat /proc/mdstat
524  mdadm -As /dev/md0
525  mdadm -s /dev/md0
526  mdadm -S /dev/md0
527  cat /proc/mdstat
528  mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/hda10 /dev/hdd10
529  cat /proc/mdstat
530  mkfs.ext3 /dev/md0
531  cat /proc/mdstat
532  cat /proc/mdstat
533  mkdir /mnt/stripe
534  mount /dev/md0 /mnt/stripe/
535  cp -r /etc /mnt/stripe/
536  ls /mnt/stripe/
537  apt-get install hdparm
538  hdparm -t /dev/hda
539  hdparm -T /dev/hda
540  hdparm -t /dev/hda
541  hdparm -t /dev/hda5
542  hdparm -t /dev/md0
543  hdparm -t /dev/md0
544  cat /proc/mdstat

12   Altri strumenti utili

Elenco di alcuni strumenti utili nella gestione dei RAID

12.1   Sfdisk

Per tenere una copia dello schema di partizionamento di un disco rigido e partizionare al volo un nuovo supporto secondo questo si utilizzi sfdisk:

# Visualizzare a schermo lo schema di partizionamento
root@conny:~# sfdisk -l /dev/sda

Disk /dev/sda: 9730 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
/dev/sda1   *      0+   3823    3824-  30716248+   7  HPFS/NTFS
/dev/sda2       3824    6255    2432   19535040   83  Linux
                start: (c,h,s) expected (1023,254,63) found (1023,0,1)
/dev/sda3       6256    6317      62     498015   82  Linux swap / Solaris
                start: (c,h,s) expected (1023,254,63) found (1023,0,1)
/dev/sda4       6318    9729    3412   27406890    5  Extended
                start: (c,h,s) expected (1023,254,63) found (1023,0,1)
/dev/sda5       6318+   6353      36-    289138+  fd  Linux raid autodetect
                start: (c,h,s) expected (1023,254,63) found (1023,1,1)
/dev/sda6       6354+   9729    3376-  27117688+  fd  Linux raid autodetect
                start: (c,h,s) expected (1023,254,63) found (1023,1,1)

# slavare lo schema di partizionamento su un file
root@conny:~# sfdisk -d /dev/sda > sda.out

# Partizionare un nuovo supporto secondo lo schema preparato:
root@conny:~# sfdisk /dev/sda < sda.out

# Partizionare /dev/sda come /dev/sdb :
root@conny:~# sfdisk -d /dev/sdb | sfdisk /dev/sda