Su un server o una workstation (e a volte nel comunissimo PC) l'utilizzo del RAID è diventato un esigenza fondamentale, soprattutto grazie alla sua efficienza e affidabilità. Esistono vari tipi di RAID, ognuno con pregi e difetti, ma in questa breve guida si farà riferimento solo al RAID 1 (mirroring) che è quello che offre un ottimo compromesso fra risorse necessarie, affidabilità, prestazioni e semplicità di gestione.
Realizzare e gestire un RAID 1 software su FreeBSD è molto semplice (molto più semplice anche rispetto a linux), ma senz'altro qualcuno si starà chiedendo perché utilizzare un RAID software quando esiste hardware dedicato che svolge la stessa funzione. Innanzitutto vi è una differenza di costi: un controller dedicato ha un prezzo che varia dalle centinaia alle migliaia di euro, mentre l'implementazione via software è praticamente a costo zero (escludendo hard disk, accessori e cassetti hotswap). C'è anche un discorso di compatibilità: infatti alcuni controller non sono supportati da FreeBSD, oppure non esiste il software per la gestione dei dischi per FreeBSD. Sul versante delle prestazioni qualcuno potrebbe far notare che un controller hardware dedicato è più veloce di una gestione via software, questo può essere vero (in parte) con qualche precisazione: gestire il mirroring dei dischi consuma una percentuale di risorse molto bassa e praticamente non impatta sulle prestazioni complessive della macchina. La richiesta di risorse è più alta solo nel caso si sia facendo una ricostruzione dell'array dopo aver sostituito o aggiunto un nuovo disco. Il RAID software che descritto in questa guida non è un semplice esempio di utilizzo, ma viene utilizzato in produzione su numerosi server (sia web server, mail server, file server, ecc.).
Caratteristiche e Strumenti base
Il RAID 1 che andremo a realizzare avrà tutti le funzioni necessarie e utilizzando dischi SATA o SCSI avrà anche le funzioni di hot-plug in modo che si possano sostituire i dischi a macchina accesa; attenzione però: se vengono utilizzati componenti che non supportanto l'hot-plug (come i dischi EIDE) ogni volta che si deve sostituire un disco occorre riavviare la macchina. Un piccolo consiglio: nel caso si realizzi il RAID con dischi EIDE, è caldamente consigliato collegare i dischi come Master su canali IDE differenti, per evitare di penalizzare le prestazioni dell'array. Per lavorare con l'array abbiamo bisogno solo del comando gmirror, gia presente nell'installazione base di FreeBSD e almeno due dischi della stessa capacità (possibilmente identici). Possiamo creare l'array su un sistema funzionante già installato oppure in fase di installazione del sitema operativo.
Creazione su un sistema esistente
Attenzione a come sono chiamati i dischi, in questo esempio abbiamo utilizzato dischi SATA riconosciuti dal sistema come /dev/ad0 e /dev/ad2, e ovviamente è consigliabile eseguire un back-up dei dati più importanti (la prudenza non è mai troppa!). Prima di creare l'array la prima cosa da fare è abilitare il debugging e i devices:
# sysctl kern.geom.debugflags=17
Fatto questo creiamo subito l'array (e con un solo comando!):
# gmirror label -v -b round-robin gm0 /dev/ad0 Metadata value stored on /dev/ad0. Done.
Con questo comando abbiamo creato il disco virtuale gm0 a cui appartiene il disco fisico ad0. gmirror label crea il mirror, il parametro -v indica la modalità verbose e il parametro -b round-robin indica l'algoritmo di bilanciamento del carico fra i dischi; attualmente l'algoritmo round-robin è quello che da le prestazioni migliori. Adesso bisogna far in modo che durante l'inizializzazione del sistema venga caricato il modulo del kernel che gestisce il mirror:
# echo 'geom_mirror_load="YES"' >> /boot/loader.conf
Non resta che modificare il file /etc/fstab in modo che le partizioni vengano montate correttamente. Inizialmente avremo un file /etc/fstab del tipo:
# Device Mountpoint FStype Options Dump Pass# /dev/ad0s1b noneswap sw 0 0 /dev/ad0s1a / ufs rw 1 1 /dev/ad0s1e /tmp ufs rw 2 2 /dev/ad0s1f /usr ufs rw 2 2 /dev/ad0s1d /var ufs rw 2 2
Occorrerà modificarlo così:
# Device Mountpoint FStype Options Dump Pass# /dev/mirror/gm0s1b none swap sw 0 0 /dev/mirror/gm0s1a / ufs rw 1 1 /dev/mirror/gm0s1e /tmp ufs rw 2 2 /dev/mirror/gm0s1f /usr ufs rw 2 2 /dev/mirror/gm0s1d /var ufs rw 2 2
Dopo queste operazioni il RAID è pronto, quindi riavviare il sitema:
# shutdown -r now
Dopo il riavvio lanciare il comando mount per verifcare il funzionamento del RAID; se l'output è simile a quello sottostante l'array è in funzione, diversamente bisogna rivedere i passaggi precedenti.
# mount /dev/mirror/gm0s1a on / (ufs, local) devfs on /dev (devfs, local) /dev/mirror/gm0s1e on /tmp (ufs, local, soft-updates) /dev/mirror/gm0s1f on /usr (ufs, local, soft-updates) /dev/mirror/gm0s1d on /var (ufs, local, soft-updates)
Adesso non resta che aggiungere il secondo disco all'array:
# gmirror insert gm0 /dev/ad2
Automaticamente partirà il rebuild dell'array e quindi verrà fatta una copia perfetta del primo disco sul nuovo. Durante la fase di rebuild, che a seconda della capacità dei dischi può durare anche alcune ore, potrebbe verificarsi un temporaneo calo di prestazioni del sitema (soprattutto in caso di alti carichi di lavoro), ma ritornerà tutto normale alla fine del processo.
Creazione durante installazione nuovo sistema
Esiste un'altra possibilità, per così dire "non documentata": creare il mirror durante la fase di installazione standard di FreeBSD da cdrom, identica comunque alla precedente a meno di un passaggio. Prima di tutto bisogna eseguire una regolare installazione con sysinstall (con regolare partizionamento e installazione di tutto ciò che serve). Dopo aver eseguito tutte le operazioni post-installazione non bisogna riavviare subito il sistema, ma occorre entrare nella shell; lo si può fare in due modi: o dal menù iniziale di sysinstall selezionando la voce Fixit -- Repair mode with CDROM/DVD/floppy or start shell, oppure premendo semplicemente ALT-F4. A questo punto non resta altro che seguire i passi precedentemente illustrati e riavviare il sistema; al primo avvio della nuova installazione il mirror sarà pronto e funzionante.
Troubleshotting
Normalmente tutto dovrebbe funzionare senza problemi, ma in qualche configurazione, soprattutto se si utilizza un kernel compilato con una configurazione personalizzata, potrebbe succedere che il sistema si rifiuta di avviarsi e restuisce il messaggio di errore: ffs_mountroot: can't find rootvp Root mount failed: 6 mountroot> Niente panico! Potrebbe essere un problema risolvibile facilmente: resettare il computer e al menù del bootmanager di FreeBSD selezionare l'opzione sei, si verrà portati sulla riga di comando del loader. A questo punto inserire i comandi:
OK? load geom_mirror OK? boot
Se così si avvia normalmente, vuol dire che per qualche ragione il modulo geom_mirror non viene caricato; occorre modificare il file di configurazione del kernel inserendo la seguente riga:
options GEOM_MIRROR
Ricompilare il kernel e riavvire la macchina. Adesso tutto dovrebbe funzionare regolarmente. Gestione dell'array Non resta che vedere come gestire e mantenere funzionale l'array. In ogni momento è possibile controllare l'integrità dell'array tramite il comando gmirror list, il quale nel caso tutto sia in ordine darà un output del tipo:
# gmirror list Geom name: gm0 State: COMPLETE Components: 2 Balance: round-robin Slice: 4096 Flags: NONE GenID: 0 SyncID: 1 ID: 3169249990 Providers: 1. Name: mirror/gm0 Mediasize: 80026361344 (75G) Sectorsize: 512 Mode: r5w5e6 Consumers: 1. Name: ad0 Mediasize: 80026361856 (75G) Sectorsize: 512 Mode: r1w1e1 State: ACTIVE Priority: 0 Flags: NONE GenID: 0 SyncID: 1 ID: 1136449837 2. Name: ad2 Mediasize: 80026361856 (75G) Sectorsize: 512 Mode: r1w1e1 State: ACTIVE Priority: 0 Flags: NONE GenID: 0 SyncID: 1 ID: 2298770902
Oppure è possibile utilizzare il comando gmirror status che restituisce un output più sintetico. Se malauguratamente un disco dell'array dovesse guastarsi, questi viene automaticamente disabilitato dal sistema operativo, scomparendo dalla lista dei dischi dell'array, il quale passerebbe allo status di "DEGRADED". Per rigenerare l'array occorre sostituire il disco difettoso con uno di pari pari capacità, o preferibilmente identico, e se i dischi non sono hot-plug, o il kernel non riconosce l'hot-plug (non tutte le configurazioni sono uguali, soprattutto nel caso di kernel personalizzati) occorre riavviare il sistema con un: # shutdown -r now Infine reinseriamo il disco sostitutivo nell'array (supponiamo che sia ad2), il rebuild partirà subito e il sistema sarà come nuovo:
# gmirror forget gm0 # gmirror insert gm0 /dev/ad2
Il comando gmirror forget serve per "far dimenticare" al sistema operativo che nell'array esiste un disco difettoso, quindi l'array passerà dallo stato "DEGRADED" allo stato "COMPLETED". Esistono altre operazioni che possono essere sull'array, per esempio: Forzare il sistema ad eseguire il rebuild dell'array
# gmirror rebuild gm0
Disattivare un disco dell'array (attenzione, questa operazione fa passare allo stato "DEGRADED" l'array):
# gmirror deactivate gm0 /dev/ad0
Riattivare un disco disabilitato:
# gmirror activate gm0 /dev/ad0
Rimuovere un disco dall'array:
#gmirror remove gm0 /dev/ad2
Per le altre opzioni è consigliabile leggere le pagine man di gmirror.
Consigli e note finali
Al fine di aumentare la ridondanza e quindi l'affidabilità è consigliabile installare su sistemi critici più di due dischi in mirroring (3 o 4 possono andar bene), ma attenzione al degrado delle prestazioni: se con pochi dischi il sistema non risente della gestione del RAID software, con molti dischi il calo delle prestazioni diviene piuttosto visibile. Una curiosità del mirroring via software che usa come algoritmo di bilanciamento round-robin è che con ambienti multitasking/multithreading le prestazioni di lettura su disco aumentano rispetto ad un singolo disco, ad esempio MySQL o PostgreSQL hanno buone prestazioni nel caso di query di SELECT multiple. Tutto ciò nasce dal fatto che se un disco è occupato per un operazione di lettura di un processo, ad un processo viene assegnato un altro disco per effettuare un'altra lettura. Le prestazioni in fase di scrittura sull'array, invece, sono pressoché identiche alla velocità di scrittura di un singolo disco. Un'altra particolarità di gmirror è che è possibile creare un array misto con dischi di diversa capacità, velocità e interfaccia, ma questa pratica comporta tre grossi svantaggi: la prestazioni dell'array sono vincolate dal disco più lento, la capacità massima dell'array è quella del disco più piccolo e la gestione di un siffatto array è parecchio problematica. Una configurazione del genere è comunque fortemente sconsigliata; un sistema in produzione deve avere i dischi tutti uguali (possibilmente stesso produttore e modello).
