Alberto Cammozzo, 21.01.2004
Installazione Cluster Vserver-drdb-heartbeat
Introduzione
Con questa installazione si crea un cluster HA composto da due host che ospitano
servizi vserver condividendo l'area /vserver tramite drbd .
In condizioni di attivita' normale uno solo dei due e'
attivo e presta i servizi, con i vserver attivi. I file vengono replicati con drbd sui dischi di entrambe
le macchine. In caso di inattivita' del server principale (primario), l'altro (secondario) fa partire automaticamente
i vserver dalla propria copia locale, grazie ai servizi di heartbeat.
Al ripristino della funzionalita' del server primario, lo storage viene risincronizzato e il server
primario riprende i servizi.
Unico caso in cui i dischi rimangono non sincronizzati: se si staccano tutti i collegamenti da
una delle due macchine, pur lasciandola accesa e attiva: in questo caso bisogna dare la sequenza di comandi
/etc/init.d drbd stop
/etc/init.d drbd start
su tutte e due, dopo aver fermato i servizi e fatto l'unmount di /vserver dal primario.
L'handover dei vserver da un server all'altro avviene nel tempo di 10-20 ping.
Setup hardware
Due macchine, chiamate novanta e novantuno,
con ciascuna due schede di rete, delle quali una coppia connessa alla
LAN (eth1) e una interconnessa con un cavo cross (eth0) su numerazione
IP privata. Quest'ultima e' riservata al traffico di drbd, mentre la prima ai servizi offerti dalle
due macchine.
Inoltre le due seriali (ttyS0) sono collegate con cavo null-modem, per
le funzioni di heartbeat.
novanta:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth1
iface eth1 inet static
address 147.162.35.90
netmask 255.255.255.0
network 147.162.35.0
broadcast 147.162.35.255
gateway 147.162.35.254
auto eth0
iface eth0 inet static
address 192.168.90.90
netmask 255.255.255.0
broadcast 192.169.90.255
novantuno:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth1
iface eth1 inet static
address 147.162.35.91
netmask 255.255.255.0
network 147.162.35.0
broadcast 147.162.35.255
gateway 147.162.35.254
auto eth0
iface eth0 inet static
address 192.168.90.91
netmask 255.255.255.0
broadcast 192.169.90.255
Installazione e configurazione di drbd
Il kernel (gia' patchato vserver) necessita del modulo drbd.
Ho scelto la versione 0.7, il cui file di configurazione e'
diverso e incompatibile con la 0.6 (stabile).
cd /usr/src
wget http://www.drbd.org/uploads/media/drbd-0.7_pre10_20040709.tar.gz
tar zxvf drbd-0.7_pre10_20040709.tar.gz
cd drbd-0.7_pre10_20040709
make
make install
Configurazione drbd:
Partizionare sulle due macchine un device:
- sda1: root partition
- sda2: swap
- sda3: un metadisk (128K per partizione condivisa)
- sda4: la partizione condivisa, mountpoint: /vserver
fdisk -l
Disk /dev/sda: 255 heads, 63 sectors, 6693 cylinders
Units = cylinders of 16065 * 512 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 487 3911796 83 Linux
/dev/sda2 488 610 987997+ 82 Linux swap
/dev/sda3 611 643 265072+ 83 Linux
/dev/sda4 644 6693 48596625 83 Linux
cat /etc/drbd.conf
resource drbd0 {
protocol C;
incon-degr-cmd "halt -f";
net {
sndbuf-size 512k;
timeout 60 ;
connect-int 10 ;
ping-int 10 ;
ko-count 10;
}
on novanta.stat.unipd.it {
device /dev/nb0;
disk /dev/sda4;
address 192.168.90.90:7789;
meta-disk /dev/sda3[0];
}
on novantuno.stat.unipd.it {
device /dev/nb0;
disk /dev/sda4;
address 192.168.90.91:7789;
meta-disk /dev/sda3[0];
}
syncer {
rate 512M;
}
}
Lanciare drbd sulle due macchine
/etc/init.d/drbd start
Sulla primaria (novanta):
drbdadmin /dev/nb0 primary
Per controllare lo stato di avanzamento della sincronizzazione:
cat /proc/drbd
Procedere coi passi successivi solo a sincronizzazione completata.
Su entrambe le macchine:
Predisporre gli script di startup, configurare heartbeat su tutte e due
le interfacce ethernet e sulla seriale con protocollo MD5.
apt-get install heartbeat
ln -s /etc/init.d/drbd /etc/rc2.d/S19drbd
cat /etc/ha.d/ha.cf
logfacility local0
keepalive 2
deadtime 10
initdead 120
serial /dev/ttyS0
baud 19200
udpport 694
udp eth1
udp eth0
node novantuno.stat.unipd.it
node novanta.stat.unipd.it
cat /etc/ha.d/authkeys
auth 3
3 md5 PASSWORD
Configurare la parte specifica dei servizi:
Predisporre uno script, su entrambe e macchine, per far partire i vserver solo dalla
macchina che ha accesso alle risorse disco come PRIMARY.
cat /etc/init.d/cluster
#!/bin/bash
# Date: Jul 2004
# Author: Alberto Cammozzo (mmzz - at - stat.unipd.it)
# Released under GNU GPL license
#
SHARED_MOUNTPOINT="/vservers"
DRBD="/etc/init.d/drbd"
DRBDADM="/sbin/drbdadm"
MOUNT="/bin/mount"
UMOUNT="/bin/umount"
VSERVER="/etc/init.d/vservers"
case "$1" in
start)
echo -n "Starting cluster:"
$DRBDADM primary all && $MOUNT $SHARED_MOUNTPOINT && $VSERVER start
echo "."
;;
stop)
echo -n "Stopping cluster:"
$VSERVER stop
$UMOUNT $SHARED_MOUNTPOINT
$DRBDADM secondary all
$DRBDADM wait_connect all
echo "."
;;
*)
echo "Usage: /etc/init.d/cluster {start|stop}"
exit 1
;;
esac
exit 0
Collocare i link nei posti necessari a heartbeat e a init (rc)
ln -s /etc/init.d/cluster /etc/ha.d/resource.d/cluster
Questo e gli altri file usati da heartbeat sono in /etc/ha.d/resource.d/:
drbddisk e' gia' stato installato
da make install di drdb stesso.
Configurare il file /etc/ha.d/haresources
con i servizi delle rispettive macchine
in questo caso novanta
e' l'host sul
quale preferenzialmente vanno fatti girare i servizi,
e novantuno
quello di backup.
su entrambe le macchine:
cat /etc/ha.d/haresources
novanta.stat.unipd.it drbddisk::drbd0 cluster
cat /etc/fstab
[...]
/dev/nb0 /vservers ext3 noauto 0 0
Tuning degli script di vserver:
Creare gli script per permettere a vserver l'arp-takeover e facilitare il transito
dei servizi dal vecchio al nuovo vserver.
su novantuno
cat /etc/vservers/milliways.sh
#!/bin/sh
# ---- see -- http://archives.linux-vserver.org/200406/0013.html
#
case $1 in
pre-start)
/usr/lib/heartbeat/send_arp eth1 147.162.35.92 00:E0:18:02:C0:7D 147.162.35.255 ffffffffffff
/usr/lib/heartbeat/send_arp eth1 147.162.35.92 00:E0:18:02:C0:7D 147.162.35.254 ffffffffffff
;;
post-start)
;;
pre-stop)
;;
post-stop)
;;
*)
echo $0 pre-start
echo $0 pre-stop
echo $0 post-start
echo $0 post-stop
;;
esac
su novanta
lo script e' identico, con l'indirizzo ethernet (MAC) di novanta
al posto di "00:E0:18:02:C0:7D".
L'indirizzo 147.162.35.92 e' quello del vserver. L'indirizzo sulla prima riga (147.162.35.255)
e' quello di broadcast, il secondo quello del router (147.162.35.254).
TODO
Installare una seconda coppia di schede di rete da accoppiare con la
tecnica del bonding a quelle
dedicate a drbd per evitare il single point of failure in caso di guasto di queste o del cavo cross
che le collega. Vantaggio marginale ma non insignificante: l'aggregazione dei canali
dovrebbe offrire maggiore banda, e quindi maggiore velocita' di replicazione di drbd.
Compilare il modulo del bonding e installarlo
modprobe bonding mode=1 miimon=100 downdelay=200 updelay=200
apt-get install ifenslave iproute
ip addr add 192.168.90.91/24 brd + dev bond0
ip link set dev bond0 addr 00:80:c8:e7:ab:91
ip link set dev bond0 up
/etc/init.d/drbd stop
ifdown eth0
ifenslave -E bond0 eth0 eth1
Rialanciare drbd, ma
drbd non riconosce correttamente l'interfaccia bond0 [...]