Raid software con User Mode Linux

Condividi:

In questo articolo abiliteremo il RAID software su User Mode Linux. Compileremo il driver nel kernel della macchina virtuale, creeremo i file per alcuni dispositivi virtuali, installeremo il software per l’amministrazione degli array e testeremo varie tipologie RAID supportate. Utilizzeremo il root_fs di una virtual machine già creata con sufficiente spazio disco per l’installazione del software necessario ed il supporto di rete per eseguire apt

Ambiente di lavoro

Supponiamo di avere preparato il root_fs per la virtual machine di test nel file uml-ubda nella cartella ~/uml/uml-raid

Per la compilazione del kernel abbiamo bisogno di alcuni pacchetti

Supporto RAID

Il supporto multi device non è abilitato nella versione normalmente distribuita con il pacchetto debian di user mode linux, quindi lo compiliamo monoliticamente all’interno del file linux che usiamo per eseguire le virtual machine. Visualizziamo la versione di kernel utilizzata dall’ uml che abbiamo installato

Quindi scarichiamo da kernel.org l’archivio con lo stesso numero di versione salvandolo in una cartella di lavoro, decomprimiamo l’archivio ed entriamo nella cartella

Creiamo una configurazione di default

Ora modifichiamo la configurazione

Ci troviamo nella root del menù di configurazione

Entriamo in “Device Drivers”, spostiamoci su “Multiple devices driver support (RAID and LVM)” ed abilitiamo il supporto con Y

Entriamo nel menù, abilitiamo con Y il menù “RAID support” e tutte le voci che si aprono sotto di esso, sempre con Y

Usciamo dando 3 volte Exit e salviamo la configurazione

Avviamo la compilazione

Terminata la compilazione, copiamo l’eseguibile linux risultante nella cartella in cui abbiamo preparato la macchina virtuale da utilizzare per i test. Per avviare la virtual machine, dovremo lanciare questo eseguibile al posto di quello distribuito con il pacchetto uml. Copiamo quindi l’eseguibile rinominandolo in modo da distinguerlo da quello originale

Preparazione dei dischi

Prepariamo i file per i dischi virtuali che ci servono. Per i nostri test creiamo 4 file di cui uno da 100 MB e tre da 200 MB per mostrare le differenze tra i vari livelli di array

Avvio della Virtual Machine

Avviamo la nostra uml, assegnandole il nome uml-raid con il supporto di rete di navigazione tramite l’host sull’ interfaccia eth0 che avremo già opportunamente configurato al suo interno

In un secondo terminale entriamo nella vm facendo login

Nella vm possiamo vedere che in /dev è presente il dispositivo multi device md0 ed i 5 dischi virtuali

Creiamo altri due device md che ci serviranno per i test con alcune configurazioni ibride

Installiamo il software per l’amministrazione dei dispositivi raid

Creiamo una cartella in cui montare il raid

Test dei livelli RAID supportati

Eseguiamo alcune prove sui livelli di RAID supportati dal driver. Ogni volta che costruiremo un array, ripuliremo prima i dischi utilizzati dai meta-dati contenuti in questo modo

Dopo aver costruito l’array, formatteremo il device /dev/md0 a cui è collegato in ext2 senza creare prima una partizione al suo interno. E’ un passaggio inutile ai fini dei test, servirebbe solo se volessimo montare quella partizione al boot della vm

Monteremo il device sul mount point  /mnt/raid

Dopo aver eseguito i test lo smonteremo e lo fermeremo l’array in modo da liberare i dischi per il test successivo

RAID 0 ( striping )

Questo livello di raid crea un dispositivo con una capienza che è la somma dello spazio disponibile ai dischi montati nell’ array. Non viene riservato spazio per la ridondanza, ed i blocchi vengono distribuiti tra tutti i nodi. Questo permette una lettura in parallelo tra tutti i nodi incrementando la velocità in lettura e scrittura, ma il guasto ad un solo nodo compromette la coerenza di tutto il raid

Utilizziamo i primi due dischi, quello da 100 MB e quello da 200 MB passando a mdadm rispettivamente /dev/ubdb e /dev/ubdc

Il raid presenta queste caratteristiche

Creiamo il filesystem in /dev/md0, montiamo il device su /mnt/raid e visualizziamo lo spazio disponibile

Nel raid ci sono circa 300 MB

Smontiamo il device, terminiamo l’array e ripuliamo i dischi, dopodiché ripetiamo le stesse operazioni con 2 dischi da 200MB, ad esempio ubdbc ed ubdd. Riformattiamo il device /dev/md0 e verifichiamo lo spazio disponibile

La capienza ora è di quasi 400 MB

Aggiungendo altri dischi, la capacità totale continua a crescere

RAID 1 ( mirroring )

Questo livello di array è dotato di ridondanza. I nodi che partecipano all’ array, che possono essere dischi o array raid, sono uno lo specchio degli altri. Questo implica che la capacità totale dell’array è limitata dal nodo di dimensioni inferiori. Utilizziamo l’opzione –level=1 e montiamo i primi due dischi

Nella fase di creazione dell’ array il driver ci avverte che i due dischi sono di dimensioni molto diverse, cosa che con il raid 0 non succede.

Dopo le operazioni viste prima, visualizziamo le caratteristiche del raid e lo spazio disponibile

Ora sono disponibili quasi 100MB  limitati dal disco ubdb. Ripetiamo l’operazione utilizziamo due dischi da 200 MB

Visualizziamo lo spazio disponibile

Ora ci sono quasi 200M

Ripetiamo l’operazione includendo tutti i 4 dischi, vediamo che ubdb limita lo spazio di tutto l’array poichè solo 100 MB possono essere replicati

RAID 4

Il Raid 4 è molto simile al Raid 0 perchè distribuisce i blocchi tra i nodi sommando le capacità di ciascuno, la differenza è che utilizza l’ultimo dei rami per memorizzare i blocchi di parità.

Ogni blocco di parità viene calcolato tramite una XOR tra tutti i corrispondenti blocchi dati sugli altri rami, questo significa che detto N il numero di nodi, e D la dimensione del ramo più piccolo, la capacità dell’array sarà dell’ ordine di ( N – 1 ) * D

In questo modo nel caso in cui uno dei dischi si dovesse rompere è sempre possibile ricostruirne il contenuto grazie agli altri

E’ veloce in lettura perchè può sfruttare il parallelismo su rami diversi, però in scrittura è leggermente più lento perchè il driver oltre a scrivere il blocco, deve leggere i blocchi sugli altri rami, calcolare e poi scrivere la parità. La capacità viene limitata dal ramo di dimensione minore, invece se i sono tutti della stessa dimensione, vengono sommate le capacità di tutti i rami dedicati ai dati

Possiamo creare l’array con soli 2 dischi, come prima proviamo con due dischi di dimensioni diverse, utilizziamo quello da 100 MB per i dati e quello da 200MB per la parità

Lo spazio disponibile è di circa 100 MB

Aggiungiamo un terzo disco da 200 MB

Lo spazio disponibile è passato a 2 * 100 MB = 200 MB ( circa )

Aggiungiamo il quarto disco da 200MB

Lo spazio disponibile è passato a 3 * 100 MB = 300 MB ( circa )

RAID 5

E’ molto simile al raid 4, solo che i blocchi di parità sono distribuiti tra tutti i nodi cosa che permette di sfruttare meglio il parallelismo in lettura ed in scrittura tra i rami. Eseguire questi test sul raid 5 darebbe gli stessi risultati

RAID 6

Questo livello è simile al 5, però utilizza 2 rami per la parità quindi permette il guasto simultaneo fino a 2 nodi

Come prima, detto N il numero di nodi, e D la dimensione del ramo più piccolo, la capacità dell’array sarà dell’ ordine di ( N – 2 ) * D

Se prendiamo l’esempio del livello 4 con 4 dischi e creiamo un array di livello 6, vediamo che la capacità totale scende a circa 200 MB, ma possiamo perdere fino a 2 dischi senza perdere i dati contenuti

( 4 – 2 ) * 100MB = 200 MB ( circa )

RAID 10 ( mirrored striping )

Anche detto raid 1+0 è una combinazione dei due livelli, dove ogni blocco dati viene duplicato un certo numero di volte e distribuito sui diversi rami

Avendo i blocchi dati e di mirror distribuiti su tutti i nodi dell’array, questa configurazione è molto performante sia in lettura che in scrittura ed è particolarmente indicata nello storage dei database

Dopo aver montato il raid con uno dei dischi da 100 MB vediamo come si presenta e lo spazio disponibile

Se invece utilizziamo i 4 dischi da 200MB

Dopo aver montato il raid con uno dei dischi da 100 MB vediamo come si presenta e lo spazio disponibile

Configurazioni ibride

Montando assieme raid diversi, possiamo creare diverse configurazioni in modo da sfruttare tutte le caratteristiche dei vari livelli raid. La più banale che si può implementare è il raid 10, combinando due raid 1 ed un raid 0. Per farlo utilizziamo i due device /dev/md1 e /dev/md2 creati all’inizio

La situazione è identica a quella mostrata per il raid 10, solo che l’array viene gestito con un totale di 3 raid, uno per lo striping e due per il mirroring in cui è contenuto un disco mirror per ciascun ramo

In questo modo possiamo anche creare configurazioni atipiche, ad esempio un raid 0 che fa striping su un raid 1 ed un raid 5

Combina la capacità di 100 MB del raid 1 con un disco da 100 MB con quella da 400 MB del raid 5, i due rami hanno un disco di mirror ed un disco di parità