Active/Active cluster with Heartbeat + Mon for a Server Application Aprile 26, 2009
Posted by installatore in linux, networking, script.Tags: dns, linux, rhel, server
trackback
In questo articolo spiegherò brevemente come poter creare un cluster a 2 nodi Active/Active per un applicazione server attraverso anche l’uso di un record DNS Round Robyn,che andrà a smistare il traffico.
Per questa configurazione ho scelto di avere 2 indirizzi Ip virtuali (a cui punterà il round robyn) che potranno effettuare il failover su entrambi i nodi del nostro cluster.Per creare i 2 ip virtuali e lanciare mon, utilizzeremo heartbeat http://www.linux-ha.org/ .
Per gestire le risorse clusterizzate utilizzeremo mon http://mon.wiki.kernel.org/ .Mon avrà il compito di monitorare i nostri 2 nodi e tramite lo script tcp.monitor monitorare la porta che la nostra applicazione terrà aperta in ascolto.
Prima di tutto andiamo a configurare il file /etc/hosts inserendo i nomi host dei nostri server su entrambi i nodi.
10.0.0.2 nodoclu1
10.0.0.3 nodoclu2
Quindi procediamo con l’installazione di heartbeat e di mon,tramite i sorgenti o i packages scaricati dai relativi siti.Ipotizzerò che le cartelle di installazione per i 2 programmi siano /etc/ha.d (per heartbeat) e /etc/mon (per mon).
Cominciamo con il configurare su entrambi i nodi il file /etc/ha.d/ha.cf nel seguente modo:
# Logging
debug 0
debugfile /var/log/ha-debug
use_logd false
logfacility daemon
logfile /var/log/ha-log
# Misc Options
traditional_compression off
compression bz2
coredumps true
# Communications (scelgo su quali interfacce e su che porta configurare le comunicazioni interne tra i due nodi)
udpport 691
bcast eth0
bcast eth1
# Thresholds (in seconds)
keepalive 1
warntime 6
initdead 5 #(un nodo viene indicato come failed dopo 5 secondi)
deadtime 9 #(un nodo viene indicato come morto dopo 9 secondi)
ping 10.0.0.1 #(per verificare che la rete pubblica sia sù pingo il mio gateway)
node nodoclu1,nodoclu2 #(i nodi che appartengono al cluster)
auto_failback off #(gestisco il fail back delle risorse con mon,quindi questo lo lascio a off)
respawn hacluster /usr/lib64/heartbeat/ipfail #(indica il programma che controlla le interfacce di rete)
In questo file abbiamo quindi specificato i parametri di partenza per heartbeat,non ci resta che andare ad editare anche il file /etc/ha.d/haresources per poter configurare le risorse che vogliamo clusterizzare.
nodoclu2 10.0.0.20
Abbiamo quindi specificato che sul nodoclu1 sarà presente l’ip virtuale 10.0.0.10 e la risorsa mon_script ,che sarebbe lo script di avvio di mon,che dovrà essere inserito in /etc/ha.d/resource.d .Mentre per il nodoclu2 girerà solamente un altro ip virtuale.Ovviamente entrambi i nodi possono ospitare tutte le risorse qui descritte (2 ip virtuali + mon).Qui di seguito lo script mon_script….
#
# start/stop the mon server
#
# processname: mon
# config: /etc/mon/mon.cf
# pidfile: /var/run/mon.pid
#
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH
# Source function library.
. /etc/rc.d/init.d/functions
# See how we were called.
case “$1″ in
start)
echo -n “Starting mon daemon: “
# daemon /etc/mon/mon -c /etc/mon/mon.cf
/etc/mon/mon -f -c /etc/mon/mon.cf
echo
touch /var/lock/subsys/mon
;;
stop)
echo -n “Stopping mon daemon: “
killproc mon
echo
rm -f /var/lock/subsys/mon
;;
status)
base=”mon”
pid=`pidof -o $$ -o $PPID -o %PPID -x ${base}`
if [ -n "$pid" ]; then
echo “running”
else
echo “stopped”
fi
;;
monitor)
base=”mon”
pid=`pidof -o $$ -o $PPID -o %PPID -x ${base}`
if [ -n "$pid" ]; then
echo “running”
else
echo “stopped”
exit 7
fi
;; restart)
killall -HUP mon
;;
*)
echo “Usage: mon {start|stop|status|restart|monitor}”
exit 1
esac
exit 0
A questo punto possiamo lanciare heartbeat su entrambi i nodi per controllare che vengano caricate tutte le nostre risorse (/etc/init.d/heartbeat start).Quindi possiamo partire configurando il file /etc/mon/mon.cf
mondir = /etc/mon/mon.d
logdir = /etc/mon
maxprocs = 20
histlength = 100
randstart = 60s
hostgroup nodo2 10.0.0.3
service tcp
interval 5s
monitor tcp.monitor -p 3000 10.0.0.2 #-p portatcp indirizzonodo1
period wd {Mon-Sun}
alert ha_sall.alert #appena non mi risponde per 2 volte il server lancio /usr/lib64/heartbeat/hb_standby all
upalert ha_tloc.alert #appena torna su il server lancio /usr/lib64/heartbeat/hb_takeover local
alertafter 2
no_comp_alerts
watch nodo2
service tcp
interval 5s
monitor tcp.monitor -p 3000 10.0.0.3 #-p portatcp indirizzonodo2
period wd {Mon-Sun}
alert ha_tall.alert # appena non mi risponde per 2 volte il server lancio /usr/lib64/heartbeat/hb_takeover all
upalert ha_sfor.alert #appena torna su lancio /usr/lib64/heartbeat/hb_standby foreign
alertafter 2
no_comp_alerts
I file come ha_sfor.alert sono contenuti sotto /etc/mon/alert.d e non sono altro che file script con il comando scritto affianco.Ovviamente questa è la configurazione del nodo 1 quindi sul nodo 2 dovrò scambiare tutto ciò che riguarda col nodo1 con il nodo2 e viceversa.In pratica monitorizza se la porta 3000 sugli indirizzi ip indicati è aperta se non lo è esegue il file di alert dopo 2 volte che non risponde (alertafter 2),se la porta torna disponibile allora scatta l’upalert.Con questa configurazione la mia applicazione aveva tra l’alert e il failover delle risorse solo 5 secondi
direi un risultato molto soddisfacente.
Commenti»
No comments yet — be the first.