Servidor de Alta Dispoñibilidade NFS de Dous Nodos

De Wiki do Ciclo ASIR do IES de Rodeira

Introducción

Crearemos un servicio NFS de alta dispoñibilidade con dous nodos: gandalf.iesrodeira.com e earendil.iesrodeira.com. O espacio en disco para compartir atópase nun sistema DRBD activo/pasivo, no que o nodo activo ofrecerá o servicio NFS. En caso de caída do nodo activo, deberá activarse o nodo pasivo.

Para facer eso, utilizaremos unha IP virtual que inicialmente estará asignada ao nodo activo e a que resolverá o nodo nfs.iesrodeira.com. Esa IP (172.20.1.20) será asignda automáticamente ao nodo activo, de xeito que os clientes montarán o recurso empregando urls do tipo nfs:/recursonfs.

A monitorizacion, activación e parada de servicios implicados se fará mediante un cluster de dous nodos basado en heartbeat.

Configuración

En primeiro lugar, procederemos a instalación de heartbeat:

apt-get install heartbeat

A configuración realízase en tres ficheiros: /etc/ha.d/ha.cf, /etc/ha.d/authkeys e /etc/ha.d/haresources.

  • ha.cf (igual nos dous nodos)
autojoin none

# Give cluster 30 seconds to start
initdead 30

# Keep alive packets every 1 second
keepalive 2 

# Misc settings
traditional_compression off
deadtime 20
deadping 22
warntime 5

# Nodes in cluster
node gandalf.iesrodeira.com 
node earendil.iesrodeira.com

# Use ipmi to check power status and reboot nodes 
# Non dispoñemos de STONITH para asegurarnos que o 'nodo desconectado' está apagado antes de tomar os seus recursos.
#stonith_host    nfs01 external/ipmi nfs02 192.168.3.33 ADMIN somepwd lan
#stonith_host    nfs02 external/ipmi nfs01 192.168.3.34 ADMIN somepwd lan
# Use logd, configure /etc/logd.cf

use_logd on

# Don't move service back to preferred host when it comes up
auto_failback on

# If all systems are down, it's failure
# Facemos ping aos switches do A3 e do Departamento, si non temos ping a eso, fallo fixo
ping_group lan_ping 172.20.2.254 172.20.3.254
# Takover if pings (above) fail
respawn hacluster /usr/lib/heartbeat/ipfail

##### Use unicast instead of default multicast so firewall rules are easier
# gandalf (descomentar no nodo gandalf, comentar en earendil)
ucast lan 172.20.1.10

# earendil (descomentar no nodo earendil, comentar en gandalf)
# ucast lan 172.20.1.1

ucast eth0 172.21.1.100
  • /etc/ha.d/authkeys (igual en ambos nodos)
auth 1
1 sha1 password_cluster
  • /etc/ha.d/haresources (igual en ambos nodos)
gandalf.iesrodeira.com IPaddr2::172.20.1.2/16/lan drbddisk::r0 Filesystem::/dev/drbd0::/NFS/servers::ext4 \ 
Filesystem::/NFS/servers/templates::/NFS/templates::none::bind  \
Filesystem::nfs:/servers::/var/lib/libvirt/servers::nfs4 nfs-kernel-server

Este ficheiro conten o nome/IP do nodo preferido seguido dos scripts de arranque/parada dos servicios implicados no cluster. Os servicios se invocarán co argumento start de esquerda a dereita no nodo que se activa, e co argumento stop de dereita a esquerda no nodo que se desactiva. Con heartbeat se proporcionan varios scripts típicos. No noso caso particular, necesitamos activar a IP de NFS, activar e montar o DRBD na carpeta a compartir por NFS (/NFS/servers, e templates, que e unha montaxe bind), e arrancar o servidor.


Unha vez creados estes ficheiros nos dous nodos, podemos iniciar o servicio mediante /etc/init.d/heartbeat start.

Boxinfo info.png
Os servicios indicados en haresources son manexados por heartbeat e non é necesario/convinte que os inicie ou pare o sistema

Servicios Extra

No caso dos servidores gandalf.iesrodeira.com e earendil.iesrodeira.com, o obxectivo non é o servicio NFS (que estará permanentemente activo nos dous nodos), se non a compartición do directorio donde se atopan os discos das máquinas virtuais esenciais, e asegurar ao mesmo tempo que esas máquinas virtuais continúan en funcionamento co caso de caída dun dos nodos. O ficheiro haresources sería o seguinte:

gandalf.iesrodeira.com vmstopnfs \
IPaddr2::172.20.1.2/16/lan drbddisk::r0 Filesystem::/dev/drbd0::/NFS/servers::ext4 \
Filesystem::/NFS/servers/templates::/NFS/templates::none::bind \
vmstartnfs

O servicio NFS está activo permanentemente nos dous nodos e vmstopnfs e vmstartnfs se encargarán de manexar as máquinas virtuais e estarán situadas en /etc/init.d:

  • vmstartnfs:
#!/bin/bash

#Recibe Nombre
#
function testIfAlive() {
  alive=false;
  ping -c 10 ${1} > /dev/null
  if [ $? -eq 0 ]; then
        alive=true;
  fi
}


case "$1" in
  start|"")
        testIfAlive nfs
        if [ "${alive}" == "true" ]; then
                mount -t nfs4 nfs:/servers /var/lib/libvirt/servers
                mount -t nfs4 nfs:/templates /var/lib/libvirt/templates
                /etc/init.d/vmcluster start
        fi
        exit 0
        ;;
  restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 4;
        ;;
  stop)
        service nfs-kernel-server stop
        exit 0
        ;;
esac
  • vmstopnfs:
#!/bin/bash

#Recibe Nombre
#
function mountIfAlive() {
  ping -c 4 ${1} > /dev/null
  if [ $? -eq 0 ]; then
        ${2}
  fi
}

case "$1" in
  start|"")
        exit 0
        ;;
  restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 4;
        ;;
  stop)
        service nfs-kernel-server start
        exit 0
        ;;
esac
  • vmcluster:
#!/bin/bash

#Recibe IP,Nome
#
function startIfNotAlive() {
  ping -c 4 ${1} > /dev/null
  if [ $? -eq 0 ]; then
	echo "${2} Is Alive " >> /var/log/takeover
  else
	virsh start ${2};
  fi
}

#Recibe Nombre
#
function testVMIfAlive() {
  alive=false
  vm=`virsh list|egrep '[0-9]+'|tr -s ' '|cut -d' ' -f 3|grep ${1}`
  if [ "${alive}" == "${1}" ]; then
	alive=true
  fi
}

case "$1" in
  start|"")
	#startIfNotAlive 172.20.0.3 KrbldapPDC
	#startIfNotAlive 172.20.0.4 KrbldapBDC
        startIfNotAlive 172.20.2.1 Proxy
	startIfNotAlive 172.20.0.1 Router
	startIfNotAlive 172.20.0.2 WebServer
	startIfNotAlive 172.20.0.5 Desktop
	startIfNotAlive 172.20.0.7 Radagast
	exit 0
        ;;
  restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
	exit 4;
        ;;
  stop)
	exit 0 
        ;;
esac

Información Adicional

Configuración de Heartbeat

Uso de Heartbeat con DRBD

Configuración de Clúster con DRBD