RAID Software : Proteggere i dati con l’aiuto del kernel (1 di 5)

linux

In questo saggio verranno analizzate le diverse tipologie di RAID esistenti e come queste possano essere implementate in Linux attraverso il kernel ed il programma mdadm.
Attraverso poi l’illustrazione di due storie di successo, verranno presentate delle soluzioni di RAID che permettano di gestire dei backup programmati e di avere sistemi ad alta affidabilità che gestiscano quantità di dati nell’ordine dei TeraByte.
In questa prima parte verranno illustrate le diverse tipologie di RAID ed analizzati i concetti di parità per la gestione della ridondanza.

RAID : Redundant Array of Inexpensive Disks

Quando si parla di RAID, in italiano “batteria ridondante di dischi a basso costo”, si intende una collezione di due o più dischi sui quali vengono registrati dei dati secondo determinati livelli logici. Tali livelli sono generalmente gestiti attraverso hardware specifico, in alcuni casi integrato nelle schede madri ed in altri presente in schede esterne denominate controller.
Meno frequente è l’impiego di sistemi RAID gestiti via software. Tali sistemi, grazie alla rapida evoluzione dei software non rappresentano più qualcosa di pionieristico e con l’abbassamento del costo dell’hardware, studiare soluzioni affidabili che impieghino RAID software è sicuramente una scelta vincente.
Linux può funzionare da controller RAID software nella stessa maniera in cui funzionano quelle hardware. Tutto questo è reso possibile oltre che dalla struttura del kernel, anche dall’elevata potenza di calcolo dei moderni processori (anche di fascia medio-bassa) che consentono di gestire i dati registrati sui dischi non riducendo in maniera sensibile le performance del sistema.
Ma lo sfruttamento delle potenzialità del kernel Linux non si ferma qui. Esistono progetti Opensource che consentono estendere le funzionalità di RAID verso obiettivi insperati. E’ il caso del progetto “DRBD”, che consente la creazione di RAID su computer diversi connessi in rete (in soluzioni ad alta affidabilità).
Come tutto questo sia applicabile alla realtà verrà illustrato nelle prossime pagine.

I livelli di RAID disponibili in Linux

I livelli di RAID implementabili via software attraverso il kernel Linux sono essenzialmente quattro. Quale livello utilizzare dipende essenzialmente da tre fattori che sono la disponibilità di dischi, la sicurezza e le prestazioni. Definita l’importanza di questi fattori, si potrà proseguire nell’analisi delle soluzioni disponibili.

RAID 0 (Striping)

Viene impiegato laddove si hanno a disposizione un minimo di due dischi approssimativamente della stessa grandezza. La capacità di memoria viene combinata tramite la suddivisione in blocchi dei dati su dischi diversi. L’accesso ai blocchi può avvenire parallelamente, garantendo performances ottimali. Inconveniente di questo tipo di RAID è che non esiste ridondanza, che significa perdita dei dati in caso di malfunzionamento di uno dei dischi.

Figura1

Figura1

RAID 1 (Mirroring)

Viene scelto generalmente quando non si può prescindere dall’integrità dei dati. La struttura prevede l’esistenza di due dischi, l’uno replica esatta dell’altro. Il dato viene scritto su entrambi i dischi e se uno dei due cessa di funzionare, l’informazione rimane comunque disponibile sull’altro. A sfavore di questa scelta sono la limitazione dello spazio disponibile (in pratica quello di un solo disco) e la perdita di performances in caso di massicce scritture.

Figura2

Figura2

RAID 4 (Dedicated parity)

Questa tipologia di RAID si rifà al concetto di parità dedicata. Su uno dei tre, o più dischi impiegati, verranno registrate le informazioni di parità, ossia le informazioni che servono a preservare la ridondanza dei dati.
Ad esempio utilizzando tre dischi (Figura3), i dati verranno distribuiti sui primi due mentre il terzo conterrà le parità. In caso di rottura di uno dei tre dischi, se questo è uno dei due contenente i dati, una volta sostituito, potrà essere ricostruito partendo dalle informazioni di parità. Se invece a rompersi sarà il disco di parità, i dati saranno ancora accessibili, ma nel nuovo disco andranno ricalcolate le stesse.
La sicurezza è legata, quindi, all’affidabilità dei dischi ed in particolare al disco di parità, rotto quello, il RAID assume uno stato instabile. Le prestazioni sono elevate in quanto è possibile l’accesso parallelo a blocchi su dischi differenti. Lo spazio disponibile sarà la somma delle dimensioni di tutti i dischi escluso quello di parità.

Figura3

Figura3

RAID 5 (Distributed parity)

Il RAID 5 differisce dal RAID 4 solo nel fatto che le informazioni di parità anziché essere registrate su di un disco a parte sono invece distribuite su tutti i dischi facenti parte dell’array. Anche in questo caso devono esserci un minimo di tre dischi, ed in caso di rottura di uno dei tre, i dati contenuti in questo saranno ricostruiti partendo dalle informazioni di parità presenti negli altri due (Figura4).
Il livello garantisce sicurezza e performances, ma sono necessari un minimo di tre dischi per la sua realizzazione. 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).

Figura4

Figura4

Oltre ai livelli illustrati, Linux rende disponibile anche il livello Linear che prevede la concatenazione dei dischi sulla linea del Raid 0 ma senza scritture parallele (in pratica quando un disco viene riempito, si passa al successivo) ed il livello 6, un livello 5 con parità raddoppiata. E’ difficile vedere entrambi impiegati in ambienti di produzione e pertanto non verranno trattati negli esempi.

Il calcolo delle parità

Prima di proseguire è necessario approfondire il discorso relativo al calcolo delle parità.
La parità viene ottenuta attraverso il risultato di un’operazione di XOR sui bit che fanno parte dell’informazione. Un’operazione di XOR tra due bit fornisce risultato 0 quando i due bit hanno uguale valore (cioè sono entrambi 1 o entrambi 0), mentre restituisce 1 quando i bit hanno valori opposti (il primo 1 ed il secondo 0, o viceversa).
Si supponga che A, B, C e D rappresentino quattro dischi impiegati in un ipotetico Raid4 mentre “P” rappresenti il disco contenente le parità :

A B C D  P
1 0 0 1  0
0 0 0 1  1
0 0 1 1  0
0 1 1 0  0

Il valore contenuto nella colonna P è il risultato delle operazioni di XOR. Nella prima riga il bit di A è 0, in XOR con il bit di B 0 che risulta 1, che in XOR con il bit C 0 risulta 1, che in XOR con il bit di D 1 risulta 0. 0 è il bit di parità. La verifica immediata la si ottiene facendo il percorso inverso. Simulando cioè un disco in stato “failure” che viene rimpiazzato :

A B C D  P
1 0 X 1  0
0 0 X 1  1
0 0 X 1  0
0 1 X 0  0

il valore del bit C sarà il seguente :

C = (((P XOR D) XOR B) XOR A)

Per la prima riga ad esempio :

C = (((0 XOR 1) XOR 0) XOR 1) = 0

Compreso questo si capisce come l’informazione di parità consenta di ricostruire il dato presente sul disco guasto partendo dal confronto con il dato associato ancora presente.
L’applicazione di quanto dimostrato è visibile in Figura3 e Figura4.

Conclusioni

Terminata la panoramica teorica delle soluzioni RAID, nel prossimo articolo queste verranno applicate alla realtà di Linux.

Note

Questa serie di articoli è apparsa in origine nel libro edito da Duke Italia Clustering e raid software allegato all’edizione italiana di Linux Journal dell’Ottobre 2006.

Da sempre appassionato del mondo open-source e di Linux nel 2009 ho fondato il portale Mia Mamma Usa Linux! per condividere articoli, notizie ed in generale tutto quello che riguarda il mondo del pinguino, con particolare attenzione alle tematiche di interoperabilità, HA e cloud.
E, sì, mia mamma usa Linux dal 2009.

Tags: , , , ,