Servidor de Alta Dispoñibilidade NFS de Dous Nodos
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.
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 Filesystem::nfs:/servers::/var/lib/libvirt/servers::nfs4 \
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
case "$1" in
start|"")
/etc/init.d/vmcluster start
exit 0
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 4;
;;
stop)
/etc/init.d/vmcluster stop
service nfs-kernel-server stop
exit 0
;;
esac
- vmstopnfs:
#!/bin/bash
#Recibe Nombre
#
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 stopIfAlive() {
virsh destroy ${1}
}
case "$1" in
start|"")
startIfNotAlive 172.20.2.1 Proxy
startIfNotAlive 172.20.0.1 Router
startIfNotAlive 172.20.0.2 WebServer
startIfNotAlive 172.20.0.5 Desktop
exit 0
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 4;
;;
stop)
stopIfAlive KrbldapPDC
stopIfAlive KrbldapBDC
stopIfAlive WebServer
stopIfAlive Router
stopIfAlive Proxy
stopIfAlive Desktop
exit 0
;;
esac