Clark's Home page

Tecnicismi vari di un Sysadmin Linux ma anche qualcosa della sua vita

DRBD A/P preparazione dei device —

Premesso che come spiegato nella sezione di preparazione delle macchine ho ricompilato il kernel senza il supporto dei moduli, aggiungo qui che nella compilazione ho inserito il supporto per drbd.
A questo punto devo installare il software necessario per realizzare i device drb al solito e come più volte specificato e sottolineato sin ora l’operazione deve essere eseguita su entrambe le macchine in successione, per pura comodità qui userò solo sangiorgio, ma le stesse identiche operazioni vanno eseguite immediatamente dopo anche su perseo(l’altra macchina).
sangiorgio:~# apt-get -t squeeze-backports install drbd8-utils che al solito si installa e si tira dietro le necessarie dipendenze.
Avendo installato le utility per drbd passiamo a creare l’ambiente per poter creare e mettere in funzione i device necessari.
il primo passo è mettere a posto il networking (DRBD è RAID1 over TCP) quindi nel file /etc/hosts di entrambe le macchine dobbiamo avere :

127.0.0.1       localhost
192.168.2.240   perseo.oceano.lan       perseo
192.168.2.10    cluster.oceano.lan      cluster
192.168.2.239   sangiorgio.oceano.lan   sangiorgio
192.168.2.241   proxy.oceano.lan        proxy
192.168.10.239  drbd1
192.168.10.240  drbd2

in altre parole l’IP statico delle 2 macchine e delle 2 schede di rete dedicate al DRBD

e nel file /etc/networks

default         0.0.0.0
loopback        127.0.0.0
link-local      169.254.0.0
localnet        192.168.2.0
oceano.lan      192.168.2.0
drbd            192.168.10.0
dmz             192.168.200.0

Ovviamente i valori da aggiungere sono da tarare sulle specifiche esigenze di ogni rete e nel mio caso sono quelli dopo localnet.

Il file che governa i device drbd è  /etc/drbd.conf  e deve essere assolutamente uguale su entrambe le macchine, nel mio caso contiene:

#include “drbd.d/global_common.conf”;
#include “drbd.d/*.res”;
global {
usage-count yes;
}

common {
syncer { rate 100M; }
}

resource r0 {

protocol C;

handlers {
pri-on-incon-degr “echo o > /proc/sysrq-trigger ; halt -f”;
pri-lost-after-sb “echo o > /proc/sysrq-trigger ; halt -f”;
local-io-error “echo o > /proc/sysrq-trigger ; halt -f”;
outdate-peer “/usr/lib/heartbeat/drbd-peer-outdater -t 5”;
pri-lost “echo pri-lost. Have a look at the log files. | mail -s ‘DRBD Alert’ clark@oceano.lan”;
split-brain “echo split-brain. drbdadm — –discard-my-data connect $DRBD_RESOURCE ? | mail -s ‘DRBD Alert’clark@oceano.lan”;
}
startup {
wfc-timeout  120;
degr-wfc-timeout 120;    # 2 minutes.
#become-primary-on both;
}

disk {
on-io-error   detach;

}

net {
max-epoch-size 16000;
max-buffers 16000;
unplug-watermark 128;
sndbuf-size 524288;
#allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
rr-conflict disconnect;
}

syncer {
rate 100M;
#al-extents 1801;
# 3389
}
on sangiorgio {
device     /dev/drbd0;
disk       /dev/sda10;
address    192.168.10.239:7788;
meta-disk  internal;
}

on perseo {
device    /dev/drbd0;
disk      /dev/sda10;
address   192.168.10.240:7788;
meta-disk internal;
}
}

vediamo in dettaglio le varie sezioni del file.

global {
usage-count yes;
}
Questa sezione si usa una sola una volta, preferibilmente nella parte superiore del file di configurazione. Tra le poche opzioni disponibili in questa sezione, solo uno è di rilevanza per la maggior parte degli utenti:
usage-count yes serve in buona sostanza a crere delel statistiche
Questo viene fatto contattando un server HTTP ogni volta che viene installato una nuova versione DRBD su un sistema. Questo può essere disabilitato impostando uso-count no;.
le statistiche sono disponibili su http://usage.drbd.org.

common {
syncer { rate 100M; }
}

La sezione comune non e’ strettamente necessaria ma e’ consigliata se si hanno piu’ risorse, in modo da far si che tutte le risorse configurate ereditino questa opzione nello specifico e’ la velocita’

r0
e’ la prima risorsa e specifichiamo il modo di replicazione col protocollo C che in sostanza dice che la replicazione e’ sincrona, cioe’ la scrittura locale e’ considerata finita solo quando si ha avuto conferma che su entrambi i nodi e’ avvenuta.
non mi dilungo sulla spiegazione degli handlers li potete trovare sul sito di drbd

startup {
wfc-timeout  0;
degr-wfc-timeout 120;    # 2 minutes.
#become-primary-on both;
}

questa e’ un’istruzione molto importante perchè in buona sostanza dice che al boot il sistema resta in attesa di un intervento umano per poter continuare (wfc-timeout  0;) infatti al boot quando compare la scritta waiting for e il n° dei secondi che passa bisogna essere sulla console e digitare yes al che il boot continua senza problemi.
Se si mette un valore questo e’ espresso in secondi e dopo il n° di secondi indicato il boot continua per suo conto, ho lasciato disabilitata questa opzione perche’ se per caso ci sono dei problemi di rete dovuti a uno switch che e’ andato a $escort, piuttosto che a problemi di tensione o altro si corre il serio rischio di trovarsi con le 2 macchine che tentano di diventare primarie contemporaneamente, questo sarebbe un vero grosso guaio in quanto lo “split-brain” è matematicamente sicuro e la probabilità di perdere dati altissima, pertanto preferisco che le macchine stiano ferme sino a che io o un qualcun altro che conosce la procedura sblocchi la questione quando siamo sicuri che il problema e’ rientrato/risolto.

per la spiegazione dettagliata dei parametri sotto elencati si veda man drbdsetup

disk {
on-io-error   detach;

}
serve per ottimizzare le proprietà di drbd nei confronti dello storage di basso livello
nello specifico il nodo droppa il suo dispositivo di basso livello e continua in modalità diskless

net {
max-epoch-size 16000;
max-buffers 16000;
unplug-watermark 128;
sndbuf-size 524288;
#allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
rr-conflict disconnect;
}

con questa sezione diciamo alla rete come trasferire i pacchetti, imponiamo la condizione di non poter avere 2 primary e diciamo cosa fare sempre a livello di rete cosa fare in caso di split-brain

syncer {
rate 100M;
#al-extents 1801;
# 3389
}

si lo so che e’ una condizione già imposta prima ma repetita juvant 🙂

on sangiorgio {
device     /dev/drbd0;
disk       /dev/sda10;
address    192.168.10.239:7788;
meta-disk  internal;

}

on perseo {
device    /dev/drbd0;
disk      /dev/sda10;
address   192.168.10.240:7788;
meta-disk internal;
}
}

in questa sezione definiamo invece la risorsa su entrambi i nodi e più precisamente il nome della risorsa (drbd0) su quale disco fisico in questo caso una partizione lavora (/dev/sda10),l’indirizzo della eth dedicata (ecco perchè lo abbiamo messo anche in /etc/hosts), la porta su cui lavora e il tipo di meta disk.

Ripeto una volta di più che è assolutamente essenziale procedere di pari passo su entrambe le macchine.
È arrivato il momento di generare i dispositivi drbd cosa che facciamo con un:
sangiorgio:/etc# drbdadm create-md r0
md_offset 24996589568
al_offset 24996556800
bm_offset 24995790848

Found ext3 filesystem
24410736 kB data area apparently used
24409952 kB left usable by current configuration

Device size would be truncated, which
would corrupt data and result in
‘access beyond end of device’ errors.
You need to either
* use external meta data (recommended)
* shrink that filesystem first
* zero out the device (destroy the filesystem)
Operation refused.

Command ‘drbdmeta 0 v08 /dev/sda10 internal create-md’ terminated with exit code 40
drbdadm create-md r0: exited with code 40

Niente da fare non c’è spazio, la cosa piu’ comoda e veloce da fare è:sangiorgio:/etc# dd if=/dev/zero of=/dev/sda10 bs=1M count=128
128+0 record dentro
128+0 record fuori
134217728 byte (134 MB) copiati, 2,59311 s, 51,8 MB/s
Attenzione con questo abbiamo distrutto filesystem e  label del volume, quindi ritentiamo con:
sangiorgio:/etc# drbdadm create-md r0
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
E ci siamo ovviamente ripetere la sequenza per ogni risorsa necessaria (qui una sola ma ci sono casi in cui si hanno 5/6 dischi drbd) e altrettanto ovviamente su ambo le macchine, finita la generazione dei device rendiamoli disponibili con:
drbdadm up r0 se più device si può usare drbdadm up all.
Controllando con cat /proc/drbd vediamo che siamo nella condizione seguente:

sangiorgio:/etc# cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
built-in
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r—–
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:24409952
sangiorgio:/etc#
è normale a questo punto.

Su sangiorgio che è la macchina principale digitiamo:

sangiorgio:/etc# drbdadm – – – -overwrite-data-of-peer primary r0 (al solito all se più risorse)

controllando su perseo con cat /proc/drbd
ersion: 8.3.11 (api:88/proto:86-96)
built-in
0: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r—–
ns:0 nr:3029248 dw:3029120 dr:0 al:0 bm:184 lo:1 pe:7438 ua:1 ap:0 ep:1 wo:f oos:21380832
[===>……………] sync’ed: 12.5% (20876/23836)Mfinish: 0:07:18 speed: 48,728 (48,856) want: 102,400 K/sec

sino alla fine che sarà:

perseo:/etc# cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
built-in
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r—–
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
Avendo prima distrutto il filesystem sulle partizioni si tratta ora di ricrearlo sul device drbd0 da notarsi che un device drbd e’  RW SOLO se primary quindi sulla macchina master in questo caso sangiorgio:

mkfs.ext3 -L /jumper -m1 /dev/drbd0

Una volta fatto drbdadm secondary r0 e passati su perseo drbdadm primary r0 e stessa operazione sino a drbdadm secondary r0, quindi riprendere il primary su sangiorgio e montare drbd0 in /jumper per fare il  test di funzionamento, che molto banalmente si può fare in questo modo :

sangiorgio:/# cd /jumper

sangiorgio:/jumper# vi file1 e scrvete dentro quello che vi pare tanto per dargli dimensione diversa da 0 salvate e  smontate /jumper  quindi drbdadm secondary r0, spostatevi sul nodo secondario in questo caso perseo e drbdadm primary r0 quindi mount /dev/drbd0 /jumper cd jumper e con un ls vedrete che file1 è li con un cat leggete il contenuto e quindo come controprova scrivete file2 al solito con dimensione idversa da 0 e rifate alla rovescia loperazione con ls vedrete sia file1 che file2.

Il vostro DRBD funziona ed è ora di dire alle macchine di montarlo quando serve (anche se in teoria non dovrebbe essere necessario) editiamo il file /etc/fstab e aggiungiamo questa riga :

/dev/drbd0             /jumper          ext3    defaults,noauto       0       0

Con questo abbiamo finito il discorso drbd e possiamo passare a Heartbeat.


Categorised as: Cluster | Linux | Networking | Work

Comments are disabled on this post


Comments are closed.


Hide picture