In questo articolo andremo ad esaminare come realizzare un cluster ad alta disponibilità in ambiente linux.
HARDWARE RICHIESTO
Cominciamo con il vedere di quale hardware abbiamo bisogno per realizzare un sistema ad alta disponibilità:
2 Personal computer
6 Schede ethernet
1 Cavo seriale di tipo null modem

Il channel bonding viene realizzato collegando due coppie di schede ethernet con con 2 cavi cross over come in figura
SOFTWARE NECESSARIO:
La soluzione qui proposta è stata realizzata in ambiente linux, e quello di cui si necessita è:
Kernel Linux 2.6.xx
Patch drbd per il kernel
Heartbeat
Tutto quello che segue è stato realizzato su Linux Debian 3.0
DRBD
In questo capitolo andremo a vedere come sia possibile patchare un kernel 2.6.xx per avere il modulo drdb all'interno dei block devices del kernel.Se non esiste la prima cosa da fare e' crearsi il file Kconfig_block in /usr/src/linux-2.6.xx/arch/um/. A questo punto si puo lanciare il camando di patch make DIR=/usr/src/linux-2.6.xx kernel-patch. Eseguire poi cd /usr/src/linux-2.6.xx e poi patch -p1 < path-src-drdb/patch-linux-2.6.xx-drdb.0.7.xx. A questo punto si procede normalmente nella ricompilazione del kernel con make menuconfig o equivalenti e nella sezione block devices e' disponibible il modulo drdb, a questo punto tale modulo e' possibile come modulo selezionando oppure e' possibile ricompilarlo come parte integrante del kernel selezionando <*>
Creazione del device:
Per poter creare il device bisogna lanciare il comando su entrambe i nodi.
mknod -m 0660 /dev/drbd0 b 147 0
a questo punto bisogna configurare id device drbd=0 in /etc/drbd.conf
resource drbd0 {
protocol C;
startup {
wfc-timeout 1; # 2 minutes.
}
net {
}
syncer {
rate 100M;
}
on eva {
device /dev/drbd0;
disk /dev/sda4;
address 192.168.100.1:7788;
meta-disk internal;
}
on eva2 {
device /dev/drbd0;
disk /dev/hdb1;
address 192.168.100.2:7788;
meta-disk internal;
}
}
In questo esempio abbiamo creato il network raid utilizzando gli ip interni 192.168.100.x, fatto questo rendiamo attivo il tutto con :
drbdadm up all
a questo punto eseguendo un
cat /proc/drbd
avremo come risultato un qualcosa del tipo:
0: cs:Connected st:Secondary/Secondary ld:Inconsistent
ns:0 nr:0 dw:0 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0
Scegliamo ora quale dei due nodi deve diventare primario ed eseguiamo
drbdadm -- --do-what-I-say primary drbd0
a questo punto con
cat /proc/drbd
otterremmo sul primario:
0: cs:SyncSource st:Primary/Secondary ld:Consistent
ns:9276 nr:0 dw:0 dr:9404 al:0 bm:2 lo:0 pe:915 ua:32 ap:0
[=========>..........] sync'ed: 50.0% (4380/5000)K
finish: 0:00:05 speed: 620 (620) K/sec
mentre sul secondario:
0: cs:SyncSource st:Primary/Secondary ld:Consistent
ns:12940824 nr:0 dw:87492 dr:13690591 al:109 bm:1668 lo:1000 pe:1876 ua:1000 ap:0
[========>...........] sync'ed: 44.4% (15858/28487)M
finish: 0:09:20 speed: 28,933 (25,160) K/sec
Ora e' giunto il momento di creare il file system sul device appena creato:
mke2fs /dev/drbd0
e di montarlo su una directory esistente ad esempio la /vserver:
mount -t ext2 /dev/drbd0 /vserver/
a questo punto il dispositivo network raid è pronto e potete iniziarci a divertirvi facendoci unpo di po' di prove.
HEARTBEAT
Andiamo ora a vedere ed esaminare heartbeat, quello che si può dire essere il cuore (heartbeat = battito cardiaco) del nostro cluster HA.
Per prima cosa smontiamo (umount) la partizione appena creata, e installiamo heartbeat, per sempicità possiamo anche usare un pacchetto pre-compilato, quindi apt o dselect per debian oppure rpm per altre distribuzioni.
Una volta installato in /etc.ha.d/ ci sono i files che gestiscono il pacchetto:
e sono:
ha.cf, haresources,authkeys
Partiamo dall'ultimo, authkeys è il file che ci dice come vogliamo che sia fatta l'autenticazione tra i due
nodi, siccome nel mio caso i due nodi sono connessi con due cavi cross in configurazione channel bonding
ho dato ad authkeys il parametro 1 che sta a significare connessione in chiaro:
authkeys:
auth 1
Nel file ha.cf invece vengono scritte le configurazioni generali di Heartbeat, quella che ho usato io e' la
seguente:
ha.cf:
debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 20
warntime 10
udpport 694
bcast eth0
baud 19200
serial /dev/ttyS0
watchdog /dev/watchdog
auto_failback off
respawn hacluster /usr/lib/heartbeat/ipfail
node eva
node eva2
initdead 20
Infine il terzo, ma forse il più antipatico è il file haresources, nel quale viene scritto dove il cluster va a procurarsi le risorse e come le deve usare:
haresources:
eva IPaddr::192.168.1.180/28/eth0 \
drbddisk::drbd0 \
Filesystem::/dev/drbd0::/vserver::ext2 apache
La prima riga dice a quale ip deve rispondere il cluster e quale deve essere il nodo che si preferirebbe essere primario. Nel nostro caso si tratta di eva il nodo e l'ip è 192.168.1.180, occhio che questo ip non deve essere presente sulla lan e deve essere diverso dagli ip fisici dei due pc, in pratica è un alias che a seconda delle situazioni del sistema si può trovare sulla macchina primaria o su quella secondaria.
Gli script drbddisk,FileSystem e apache e qualunque altra cosa si voglia fare, vanno messi dentro la directory resource.d, in questo caso drbdbdisk è copiato da /path_drbd_sorgenti/drbd-0.7.11/scripts e dice ad heartbeat come far pasare un disco da secondario a primario e viceversa; FileSystem invece ce lo da heartbeat e serve per montare e smontare il device drbd0, inoltre aggiungendo lo script apache si fa ripartire apache in caso di cambio di contesto tra le due macchine.
CHANNEL BONDING
Tramite channel bonding è possibile far vedere due schede di rete come se fossero una sola rispondendo quindi come se fossero un unico ip, in questo modo si riescono ad avere molteplici benefici:
bilanciamento del carico sulle due schede aumento di prestazioni in caso di doppio canale condiviso
diminuzione del SPOF sulla scheda di rete, nel senso che anche se una scheda si rompe il sistema continua ad andare avanti lo stesso.
Per realizzare un channel bonding, bisogna innanzi tutto abilitare l'opzione del kernel sul channel bonding,
installare il pacchetto ifenslave appropriato per la propria versione del kernel, e poi modificare il file interfaces in /etc/network:
auto bond0
iface bond0 inet static
address 192.168.1.218
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.254
up ifenslave -f bond0 eth0 eth1
ed il gioco è fatto.
LINKS
HeartBeat:
http://www.linux-ha.org/
Drbd:
http://www.drbd.org/
Kernel Linux:
http://www.kernel.org/
CONTATTI
Articolo scritto da Enrico Pirozzi
scotty@linuxtime.it -
www.linuxtime.it/enricopirozzi