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:
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.

Configurazione Heartbeat

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 [...]