La parità (e il RAID5) per dummies

Spesso sentiamo parlare di RAID (e non é un insetticida contro i bug dei pc) come sistema per la messa in sicurezza dei nostri dati sui dischi. Quando poi si arriva al tipo 5 di RAID sentiamo termini come parità distribuita. Qui vorrei provare a spiegare che cos'é la parità, in maniera veramente semplice. Non voglio approfondire il discorso né cercare di spiegare tutto il sistema RAID, ma solo far comprendere ai meno esperti cosa si nasconde dietro questo termine.
Come si sa il RAID é un sistema per creare un insieme di dischi fissi che vengono letti dal computer come uno solo. In particolare il RAID 5 scrive un file su più dischi dividendolo in "blocchi" della stessa dimensione e creando un codice che permette di ricreare i dati in caso di rottura di un (e uno solo) disco dopo reinserimento di uno nuovo nell'array (o insieme di dischi).
Il codice che viene creato per la ricostruzione dei dati viene scritto su uno solo dei dischi ma a rotazione. Questo "codice" é proprio il cosiddetto parity check o controllo di parità.
Praticamente si tratta di dividere tutti i nostri dati tra più dischi in modo che se uno si rompe, uno degli altri (o proprio lo stesso, in questo caso si ricreerà la parità qui) contiene le informazioni per ricreare quelle porzioni dei nostri dati che si sono perse.

Il termine "parità" in informatica si riferisce ad un tipo di controllo che viene effettuato sui dati per prevenire errori di trasmissione o, nel nostro caso, per ricostruire i dati corrotti.
Per comprendere la parità si deve però avere capito come funziona il sistema binario. Senza approfondire e rimandando a fonti più autorevoli di me, voglio solo dire che é il sistema su cui si basano i moderni calcolatori ed é un sistema che si contrappone a quello metrico decimale dove abbiamo 10 numeri. Qui si hanno solo lo 0 e l'1 e la combinazione sequenziale di questi due valori permettere di esprimere tutto ciò che immagazziniamo nei nostri pc.
Sfruttando una particolarità di questo sistema binario noi sappiamo che una sequenza di 0 e 1 che rappresenta ad esempio una parola contiene un numero esatto di "1" che può essere pari o dispari. Ad esempio la parola "bue" avrà (invento) 10 "0" e 11 "1".
Se prendiamo questa sequenza e sommiamo con il sistema binario XOR tutti questi "0" ed "1" partendo dal primo con il secondo e così via, arriviamo sempre ad uno "0" o ad un "1".
Il sistema XOR é molto semplice, senza spiegarlo nel dettaglio, basta sapere che sommando due "0 o due "1" il risultato é "0", sommando 1 e 0 oppure 0 e 1 il risultato é sempre "1".
Un esempio é meglio: prendiamo la sequenza 1 0 1 0 1, sommiamo il primo 1 con lo 0, abbiamo come risultato 1, sommiamolo al terzo numero che é 1 ed abbiamo 0, sommiamolo al quarto 0 e fa 0, sommiamolo all'ultimo 1 e fa 1. Il nostro codice sarà ora 1 0 1 0 1 (1), cioé la sequenza di prima più il risultato della somma che abbiamo effettuato.
Mettiamo che il terzo numero da sx, l'1, si perda avremo 1 0 x 0 1 1. Eseguiamo la somma XOR senza la x (ma con il bit di parità) ed otterremo 1, proprio il numero perso. Anche senza eseguire la somma XOR possiamo comunque trovare il bit di parità contando gli "1". In realtà é meglio sottolineare che la parità di controllo può essere pari o dispari. Infatti la parità pari si otterrà aggiungendo un "1" alla nostra sequenza se contiene dispari "1", ciò il nostro bit di parità pari che aggiungiamo servirà ad avere un totale di "1" pari. Se la sequenza contiene invece un numero già pari di "1", il bit di parità che si aggiunge sarà uno "0". La parità dispari é il contrario. Nel caso della somma XOR e, quindi, nel sistema RAID, la parità usata é pari.
Nel nostro esempio la parola "bue" aveva 11 "1" quindi il bit di parità sarà un "1" ed avremo così un numero pari di "uno" nella parola "bue", completa di questo controllo.
Perché facciamo ciò? Perché questa parola "bue" che in computerese é una sequenza di 0 e 1, completa del bit di parità, ora é al sicuro da errori (ad esempio di trasmissione).
Come nell'esempio fatto sopra, se si perde un bit (uno degli zero o degli uno della parola "bue"), con il bit di parità sarà possibile ricreare il bit perduto.

Il passo successivo é quello di distribuire tutta la sequenza di 0 ed 1, più il bit di parità, su più dischi in modo da avere, se si dovesse rompere un disco, la possibilità di ricreare il bit mancante che era sul disco rotto e metterlo su quello nuovo che ricostruirà l'insieme di dischi RAID su cui abbiamo messo i nostri dati.
Il vantaggio del RAID, in particolare il 5, é quello di potere scrivere i pezzetti di file su più dischi contemporaneamente in modo da velocizzare il processo. Questi pezzetti di file, chiamati STRIP, tradotto "striscia", o anche STRIPE UNIT, sono un insieme più o meno lungo di bit. Ci sono molte informazioni su come dimensionare la lunghezza dei pezzetti e che tralascio qui di approfondire, ma é importante capire come utilizzo dei pezzi lunghi molti bit nel concetto di parità come sopra spiegato.
Quella che segue é un'immagine di come potrebbe essere visto un file. Prendiamo ad esempio l'idraulico del disegno che per i computer si tratta di una sequenza di 0 ed 1. Per semplicità ho ipotizzato che il disegno sia una sequenza di 18 bit, considerando irrealisticamente che una porzione del disegno sia rappresentata da un solo bit.

Quando il RAID deve scrivere un file come questo sui dischi provvederà a splittarlo in blocchi. Nell'esempio ogni blocco é rappresentato da una striscia verticale del disegno. Se il controller é stato impostato per dividere i file in pezzi da 128kb, ogni "striscia" del disegno sarebbe lunga 128kb. Nell'esempio ogni striscia é lunga 6 bit.
Ora vediamo come il controller RAID scrive questi dati sui dischi. Ricordo che un file é una sequenza di bit, paragonabile ad una striscia (infatti si parla di "stripe") e dividere questo file significa dividere una striscia in segmenti.
Il controller prende un pezzetto di striscia e la scrive sul primo disco, poi prende il pezzetto successivo e lo scrive su un altro disco e così via.

Facciamo l'esempio di un file di 2048kb e poniamo di avere configurato il RAID5 per dividere i file in blocchi (o STRIPE UNIT o STRIP) di 128kb. Si avranno così 16 blocchi di 128kb ciascuno in sequenza (1-16).

Nell'immagine sopra si vedono i quatto dischi di esempio con differenti colori ed i blocchi dall'1 al 16 che vengono scritti su ciascun disco, Quindi il blocco 1 sul disco 1, il blocco 2 sul disco 2, il blocco 3 sul disco 3, il blocco 4 sul disco 4 e poi il blocco 5 di nuovo sul disco 1 e così via.
Abbiamo ogni disco contenente 4 blocchi, alternati ogni 4: sul disco 1 ad esempio finiranno i blocchi 1, 5, 9 e 13.
L'ultima tabella dell'immagine mostra la struttura a matrice dei blocchi. Il taglio orizzontale dei primi 4 blocchi (per esempio), distribuiti su ogni disco, mostra la cosiddetta STRIPE (banda) o STRIPE WIDTH (larghezza della striscia). Questa STRIPE, propriamente detta, é la somma orizzontale di quattro STRIP da 128kb e, quindi, corrisponde a 512kb di dati. In fin dei conti una STRIPE equivale alla STRIP per il numero dei dischi. Ricordiamoci che il controller RAID scriverà sempre una STRIPE completa, anche se i dati da scrivere fossero solo 128kb, come nell'esempio (alla fine parlo di questa ipotesi).

Ma il concetto di RAID é che più dischi vengono considerati uno solo. Quindi ogni disco, nel momento di scrivere o leggere, deve comportarsi come se fosse un livello di un unico disco. Come nei dischi rigidi (tipo classico con testina) composti da più dischi sovrapposti, ogni testina si trova nella stessa posizione delle altre e la porzione di disco é in realtà un cilindro, così nel RAID abbiamo la stessa posizione contemporaneamente delle singole testine.
Per questo motivo ho preparato la figura sottostante.

In un ipotetico RAID5 composto da 4 dischi vediamo che il primo blocco (STRIP) in cui era diviso il file viene scritto sul disco 1 nella posizione (inventata) XF00A00EDW. Le altre due STRIP vengono scritte sugli altri due dischi nella medesima posizione XF00A00EDW. Il quarto disco in questo esempio scriverà il blocco di parità, anch'esso nella stessa posizione.
Adesso che dovrebbe essere chiaro come avviene la scrittura dei blocchi sui dischi, vediamo come lavora la parità di controllo, o meglio, il legame tra blocco di parità e bit di parità.
Infatti, se il nostro controller ha spezzato il file in 16 blocchi di 128kb ciascuno, per effettuare il controllo di parità dobbiamo però lavorare sulla somma XOR di un certo numero di bit.
Qui di seguito un altro disegno per comprendere come avviene ciò.

In figura sono rappresentati 4 dischi di un RAID5, ogni disco é spezzato in blocchi. I blocchi azzurri sono quelli dei dati, i rossi sono i blocchi di parità. Nella figura più a destra si vede la parte relativa ad un solo gruppo di blocchi, la propriamente detta STRIPE. Si tratta di una sequenza di blocchi o strip ripetuta sui dischi. Nel nostro esempio del file immagine (che abbiamo ipotizzato diviso in tre soli blocchi) il controller scriverà il primo blocco sul primo disco, il secondo blocco sul secondo disco, il terzo blocco sul terzo disco ed il blocco di parità sul quanto disco.
Per capire cos'é un blocco di parità consideriamo il primo blocco di dati (nel nostro esempio costituito da soli 6 bit), come detto si tratta di una sequenza di bit quindi avremo scritto, sul primo disco: 1mo bit del primo blocco, 2do bit del primo blocco e così via. Sul secondo disco, dove verrà scritto il secondo blocco, avremo la stessa struttura, cioé 1mo bit del secondo blocco, 2do bit del secondo blocco,....
Dopo aver scritto tutti i primi n (numero di dischi -1) blocchi dei dati, viene il momento di scrivere il blocco di parità che sarà costituito da 1mo bit di parità cioé somma XOR di tutti i 1mi bit dei tre blocchi di dati, dal 2do bit di parità e così via fino all'nmo bit di parità dello stesso blocco. Tutto questo si ripete per n blocchi fino a quando tutto il file suddiviso più i rispettivi blocchi di parità saranno scritti sul sistema di dischi in RAID5 (ricordo che il disco che ospita il blocco di parità nel RAID5 non é sempre lo stesso ma uno dell'insieme, a rotazione).
Uno dei concetti basilari dei sistemi RAID é che ogni scrittura o accesso ai dati sui dischi avviene in contemporanea nel medesimo punto esatto di ogni disco. Questo é anche il motivo per cui in un sistema RAID ogni disco, anche se di dimensioni differenti, viene visto come una copia esatta degli altri.
Quindi nel disegno dell'idraulico abbiamo che i "secondi bit", per esempio, dei tre blocchi sono: 1 0 0 parità 1. Mettiamo che l'occhio dell'idraulico che é finito nel secondo blocco ed é rappresentato da uno "0" cambi, anziché essere nero diventa azzurro. Ipotizziamo per estrema semplicità che da "0" diventi "1". Il controller RAID5 scriverà quindi il 2do bit a 1 invece di zero su quel preciso blocco e ricalcolerà la parità che sarà ora "0".
Per ultimo riconsideriamo il file immagine dell'esempio: é composto da 3 blocchi di 6 bit ciascuno e, quindi, 18 bit completano il file interamente. In realtà un file non é quasi mai un multiplo esatto dei bit che compongono ciascun blocco. Per esempio, cosa succede al nostro idraulico se oltre ai 18 bit che vediamo ne aggiungiamo altri 6? Come si comporterà il controller RAID?
Ricordate la STRIPE, la sequenza orizzontale di blocchi distribuiti sui dischi del RAID? Ogni volta che un controller RAID deve splittare e scrivere i blocchi sui diversi dischi, scriverà sempre una STRIPE completa cioé, se i dischi sono 3, scriverà sempre 3 blocchi consecutivi per poi passare alla serie successiva di blocchi. Nell'esempio sopra, abbiamo la parte finale del file con un solo blocco di 6 bit da scrivere su tre dischi più uno per la parità. Il controller scriverà il primo blocco composto dai bit relativi all'immagine ed aggiungerà altri due blocchi con solo "0". Il blocco di parità sarà una somma XOR dei bit del primo blocco con i bit a "0" degli altri blocchi. Il bit di parità servirà sempre a ricreare la porzione di blocco che sarà stata corrotta. Spero che quanto detto possa servire a comprendere il sistema RAID e mi scuso per eventuali errori o banalità.