RAID: livelli, ridondanza, prestazioni e Software RAID Linux con mdadm

RAID 0, 1, 5, 6 e 10 spiegati in modo pratico: capacità, tolleranza ai guasti, rebuild, rischi, mdadm, monitoraggio e perché RAID non è backup.

RAID significa Redundant Array of Independent Disks. L’idea è combinare più dispositivi a blocchi in un unico volume logico per ottenere, a seconda del livello scelto, più prestazioni, più capacità, ridondanza oppure una combinazione di queste proprietà.

La parola più importante è però ridondanza, e va interpretata correttamente. Un RAID può mantenere disponibile un filesystem quando uno o più dischi si guastano. Non protegge invece da cancellazioni, corruzione logica, ransomware, furto del server o errori applicativi. Per questi eventi serve un backup separato.

Hardware RAID e Software RAID

Nel RAID hardware la logica viene gestita da un controller dedicato che presenta al sistema operativo uno o più volumi virtuali. Nel Software RAID Linux, invece, il kernel gestisce direttamente i dispositivi attraverso il driver md e lo strumento amministrativo più comune è mdadm.

Il Software RAID moderno non va considerato automaticamente una soluzione di serie B. Ha il vantaggio di essere trasparente, documentabile e indipendente da uno specifico controller. Il RAID hardware mantiene invece vantaggi in alcuni scenari enterprise, ma introduce anche una dipendenza dal controller, dal suo firmware e dalla disponibilità di hardware compatibile in caso di guasto.

Striping, mirroring e parità

I livelli RAID combinano tre idee fondamentali:

  • striping: i blocchi vengono distribuiti su più dischi, aumentando parallelismo e capacità;
  • mirroring: gli stessi blocchi vengono conservati in più copie;
  • parità: informazioni aggiuntive permettono di ricostruire i dati mancanti dopo il guasto di uno o più dischi.

RAID 0

RAID 0 usa striping puro. Con N dischi della stessa dimensione S, la capacità utile è circa N × S. Non esiste ridondanza: il guasto di un solo componente rende l’array inutilizzabile.

È utile soltanto quando prestazioni e capacità sono più importanti della disponibilità oppure quando i dati possono essere ricreati facilmente. Chiamarlo “RAID ridondante” sarebbe quasi ironico: è l’unico livello comune in cui la R dell’acronimo non si applica.

RAID 1

RAID 1 conserva copie speculari dei dati. Nel caso tipico di due dischi, la capacità utile equivale alla dimensione del disco più piccolo e l’array sopravvive al guasto di uno dei due. La lettura può beneficiare della presenza di più copie; la scrittura deve invece raggiungere tutte le repliche necessarie.

È semplice da capire, semplice da ricostruire e molto adatto a piccoli server quando la capacità persa rispetto al numero di dischi è accettabile.

RAID 5

RAID 5 distribuisce dati e parità tra almeno tre dischi. Con N dischi uguali la capacità utile è approssimativamente (N - 1) × S e l’array tollera il guasto di un singolo dispositivo.

Il vantaggio è un buon rapporto capacità/ridondanza. Lo svantaggio emerge soprattutto durante le scritture e i rebuild: la parità deve essere calcolata e, quando un disco manca, i dati devono essere ricostruiti leggendo gli altri componenti. Su array grandi il periodo degradato può durare a lungo, aumentando l’esposizione a un secondo problema.

RAID 6

RAID 6 aggiunge una seconda informazione di ridondanza distribuita. Richiede almeno quattro dischi, offre una capacità utile di circa (N - 2) × S e può sopportare la perdita di due componenti.

Paghiamo questa sicurezza con più overhead di scrittura e due dischi equivalenti dedicati alla ridondanza. Su array capienti può essere preferibile a RAID 5 proprio perché il rebuild di dischi moderni di grande capacità può essere lungo.

RAID 10

RAID 10 combina mirroring e striping. Nella configurazione classica con quattro dischi, le coppie vengono replicate e i dati distribuiti tra i mirror. La capacità utile è normalmente circa la metà della capacità grezza.

La tolleranza ai guasti non si riassume semplicemente con “due dischi”: dipende da quali componenti si rompono. Possiamo perdere più dischi se appartengono a copie differenti, ma non possiamo perdere tutte le repliche dello stesso blocco. Questo è uno dei motivi per cui bisogna capire il layout reale invece di fermarsi al nome “RAID10”.

Tabella riassuntiva

LivelloMinimo dischiCapacità indicativaTolleranza
RAID 02N × Snessun guasto
RAID 12S nel mirror classicouna o più copie, dipende dal numero di repliche
RAID 53(N – 1) × S1 disco
RAID 64(N – 2) × S2 dischi
RAID 104circa N/2 × Sdipende dalla distribuzione dei guasti

Il momento più delicato: il rebuild

Quando sostituiamo un disco guasto l’array deve ricostruire le informazioni mancanti. In questa fase gli altri dischi vengono letti intensamente e il sistema resta degradato. Il rischio operativo non è quindi soltanto “si è rotto un disco”, ma anche “quanto tempo resteremo senza la ridondanza prevista e quanto stress subiranno gli altri componenti?”.

Per questo un array non va semplicemente creato e dimenticato. SMART, stato md, alert e controlli periodici devono far parte della gestione.

Software RAID Linux con mdadm

Linux implementa il Software RAID attraverso il driver md. Prima di qualsiasi comando distruttivo identifichiamo con precisione i dispositivi:

lsblk -o NAME,SIZE,MODEL,SERIAL,FSTYPE,MOUNTPOINTS
cat /proc/mdstat

mdadm --detail --scan
mdadm --detail /dev/md0

La creazione di un array cancella o rende inaccessibili i dati presenti sui dispositivi coinvolti. Gli esempi seguenti sono quindi da laboratorio o da utilizzare soltanto dopo aver verificato più volte i device.

# Esempio RAID1
mdadm --create /dev/md0   --level=1   --raid-devices=2   /dev/sdb1 /dev/sdc1

# Esempio RAID10 classico a 4 dischi
mdadm --create /dev/md0   --level=10   --raid-devices=4   /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

La sincronizzazione iniziale può essere osservata da /proc/mdstat:

watch -n 2 cat /proc/mdstat
mdadm --detail /dev/md0

Configurazione e assemblaggio al boot

Su Debian/Ubuntu possiamo aggiornare la configurazione mdadm con l’array rilevato e rigenerare initramfs quando necessario:

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

update-initramfs -u

Prima di aggiungere automaticamente l’output controlliamo sempre che mdadm.conf non contenga già la stessa definizione. Duplicare righe non migliora la ridondanza, migliora soltanto il disordine.

Scrub e controllo di consistenza

Gli array md espongono un controllo di consistenza. Il comando seguente avvia una verifica senza effettuare volutamente una riparazione:

echo check > /sys/block/md0/md/sync_action
watch -n 5 cat /proc/mdstat

cat /sys/block/md0/md/mismatch_cnt

Questi controlli vanno pianificati tenendo conto del carico I/O. Su un server molto occupato uno scrub può influire sulle prestazioni.

RAID non è backup

Se un utente cancella una directory, il RAID replica perfettamente la cancellazione. Se un ransomware cifra i file, il mirror conserva più copie cifrate. Se il server viene rubato, anche tutti i dischi dell’array spariscono insieme.

RAID serve soprattutto a continuità e disponibilità durante alcuni guasti hardware. Per recuperare uno stato precedente serve una strategia di backup con retention e almeno una copia separata. La guida successiva è Backup: come e perché implementarlo.

Per l’implementazione dettagliata di un array RAID10 Linux e per la sostituzione di un componente puoi proseguire con Software RAID 10 e Sostituire un disco RAID.

Riferimenti

mdadm(8) · md(4).