Storage con DRBD
Articolo del 06-05-2009
Riferimenti: guida utente online di DRBD (www.drbd.org)

Distributed Replicated Block Device (DRBD) è un modulo software del kernel di Linux che consente di replicare il contenuto di dispositivi a blocchi (ad es. hard disk) tra due server. La replica (o mirror) avviene attraverso la rete in real-time, in modo trasparente, sincrono o asincrono.


I tool di amministrazione a riga di comando di DRBD sono tre, ma solo il primo (drbdadm) in genere viene usato per tutte le operazioni, rappresentando sostanzialmente una interfaccia di alto livello per gli altri due:
drbdadm è il più utilizzato ed è una interfaccia per drbdsetup e drbdmeta
drbdsetup configura il modulo DRBD caricato nel kernel
drbdmeta gestisce i meta-dati dei dispositivi replicati

Le risorse

Il dispositivo replicato prende il nome di risorsa. La risorsa è caratterizzata da un nome, da un device drbd il cui nome è del tipo /dev/drbd0, /dev/drbd1 e così via, associato ad un dispositivo a blocchi (ed esempio /dev/hda1) e, infine, da una configurazione di rete specifica per DRBD.
Inoltre alla risorsa può essere assegnato un ruolo primario o secondario.
Una risorsa primaria viene utilizzata senza restrizioni, per cui è possibile eseguire operazioni quali scrivere, leggere, montare e smontare. Una risorsa secondaria riceve sistematicamente gli aggiornamenti (mirror) che avvengono sulla primaria, per cui non può essere utilizzata direttamente dai programmi-utente.
Il ruolo è intercambiabile, per cui una risorsa secondaria può essere promossa a primaria (promotion) e, di converso, una risorsa primaria può essere declassata a secondaria (demotion).

Nota: per particolari usi è possibile configurare:
- due risorse primarie (dual-primary mode);
- una seconda replica (stacked resource), su un terzo server.
Per i dettagli relativi a tali funzionalità fare riferimento alla guida utente online.

La replica dei dati sul device secondario può essere effettuata con tre protocolli alternativi:
- Protocollo A o asincrono. La modifica dei dati si considera completata quando è stata completata l'operazione sul server (o nodo) con la risorsa primaria, e questo ha inviato su rete i relativi pacchetti di replica.
- Protocollo B o semi-sincrono. La modifica dei dati si considera completata quando è stata completata l'operazione sul nodo primario, il quale ha inviato su rete i relativi pacchetti di replica e questi sono giunti al nodo secondario.
- Protocollo C o sincrono. La modifica dei dati si considera completata quando è stata completata l'operazione sul nodo primario, il quale ha inviato su rete i relativi pacchetti di replica e questi sono giunti al nodo secondario che conferma l'avvenuta replica. Quest'ultimo, per ovvi motivi, è il protocollo più utilizzato.

Installazione

L'installazione varia in base al tipo di piattaforma Linux utilizzata. Nel caso in esame si utilizza CentOS 5.3 (derivato da Linux RedHat).
I pacchetti da installare sono due:
- kmod-drbd (il modulo del kernel)
- drbd (i tool di gestione)
Il comando per l'installazione è:
yum install drbd kmod-drbd
Nota: fare riferimento alla guida utente online di DRBD per le altre distribuzioni di Linux.

Configurazione

La configurazione di DRBD si trova nel file /etc/drbd.conf da predisporre, in modo identico, sui due nodi.
Quello che segue è un esempio del file di configurazione:

global {
  usage-count yes;
}
common {
  protocol C;
  syncer { rate 5M; }
}
resource r0 {
  on nodo-a {
    device /dev/drbd1;
    disk /dev/hda5;
    address 192.168.0.1:7789;
    meta-disk internal;
  }
  on nodo-b {
    device /dev/drbd1;
    disk /dev/hda5;
    address 192.168.0.2:7789;
    meta-disk internal;
  }
}

Graficamente, tale configurazione è relativa ad un contesto di questo tipo:


Schema DRBD 

Nella configurazione sono incluse tre sezioni:
global: unica e generale
common: direttive relative a tutte le risorse
resource: dettagli delle risorse

Seguono delle brevi descrizioni delle direttive non deducibili dal grafico:

usage-count yes: Dato inviato via http a drbd.org per il conteggio delle installazioni. Ha solo uno scopo statistico e può essere disabilitato specificando no.
syncer { rate 5M; }: La sicronizzazione dei due device DRBD avviene molto lentamente (per default la velocità è di 250 KB/sec), per modificarla impostare un valore per syncer, che indica i MB trasferiti al secondo. Attenzione: immettere un valore compatibile con la velocità di scrittura del disco e di trsferimento della rete.
resource r0 {:Nome liberamente attribuito alla risorsa
device /dev/drbd1: Device DRBD associata all'unità a blocchi /dev/hda5
address 192.168.0.1:7789 Indirizzo IP del nodo e porta TCP di ascolto (da aprire sul firewall)
meta-disk internal: DRBD tiene nota delle operazioni che compie e dello stato della risorsa in un'area definita meta-dati e registrata su disco. Tale area può essere allocata sulla stessa unità della risorsa (in questo caso /dev/hda5, internal), oppure su un'altrà unità, ad esempio /dev/hda6. Lo spazio occupato dai meta-dati è molto limitato, in modo approssimato si può calcolare così:

Metadata formula

Con CMB = dimensione del device in MB.
Quindi, per un device di 1TB (1.000.000 di MB), i meta-dati occuperanno poco meno di 1000000/32768+1=32MB


Attivazione del servizio e inizializzazione del device
Operazioni da eseguire una tantum su entrambi i nodi

Dopo aver predisposto il file /dev/drbd.conf, viene attivato il servizio DRBD al boot del sistema. Nella distribuzione Linux CentOS 5.3 questo viene fatto col comando:
chkconfig --levels 345 drbd on
A questo punto il servizio può essere avviato nella sessione di lavoro corrente:
/etc/init.d/drbd start

Per rendere il device disponibile al sistema operativo occorre inizializzarlo coi comandi:
drbdadm create-md r0 (inizializza l'area per i meta-dati)
drbdadm up r0 (associa /dev/hda5 con /dev/drbd1, imposta i parametri di sincronizzazione e connette il device dell'altro nodo)

E' possibile monitorare lo stato delle risorse DRBD col comando:
cat /proc/drbd
o, su CentOS, col comando:
service drbd status
Tra le varie informazioni visualizzate dovrebbe esserci:
ds:Inconsistent/Inconsistent
ro:Secondary/Secondary
Questa è la normale situazione iniziale (disk state = Inconsistent), il primo Inconsistent è riferito al nodo locale e il secondo al nodo remoto.
Ruoli iniziali (ro) = Secondary per entrambi.
Attenzione, si ribadisce che i comandi finora visti vanno eseguiti su entrambi i nodi.
Il comando che segue è molto importante, in quanto stabilisce la sorgente di sincronizzazione, e va eseguito solo su un nodo, ad esempio sul nodo-a:
drbdadm -- --overwrite-data-of-peer primary r0
(sul nodo-a la risorsa viene promossa a primary per poterla utilizzare normalmente)
A questo punto il device /dev/drbd1 su nodo-a viene replicato sul device corrispondente sul nodo-b. Eventuali dati presenti sul device sul nodo-b verranno persi irrimediabilmente.

Da questo momento in poi è possibile utilizzare il device /dev/drbd1 sul nodo-a come qualsiasi altro dispositivo a blocchi. Tutte le modifiche apportate sul device primario verranno replicate sul secondario.
Verosimilmente si procederà con la formattazione e con il montaggio sul nodo-a:
mkfs.ext3 /dev/drbd1
mkdir /ha
mount /dev/drbd1 /ha

Può essere necessario invertire il ruolo dei nodi. In tal caso occorre smontare il device e riportare a secondary il ruolo del nodo-a.
Dalla console del del nodo-a eseguire:
umount /ha
drbdadm secondary r0
Promuovere poi il nodo-b a primary. Dalla console del nodo-b eseguire:
drbdadm primary r0
ed eventualmente:
mkdir /ha
mount /dev/drbd1 /ha