Servidor de Alta Dispoñibilidade NFS de Dous Nodos: Diferenzas entre revisións

De Wiki do Ciclo ASIR do IES de Rodeira
Saltar á navegación Saltar á procura
 
Liña 173: Liña 173:
#Recibe Nombre
#Recibe Nombre
#
#
function stopIfAlive() {
function testVMIfAlive() {
alive=false
virsh destroy ${1}
vm=`virsh list|egrep '[0-9]+'|tr -s ' '|cut -d' ' -f 3|grep ${1}`
if [ "${alive}" == "${1}" ]; then
alive=true
fi
}
}


case "$1" in
case "$1" in
start|"")
start|"")
#startIfNotAlive 172.20.0.3 KrbldapPDC
#startIfNotAlive 172.20.0.4 KrbldapBDC
startIfNotAlive 172.20.2.1 Proxy
startIfNotAlive 172.20.2.1 Proxy
startIfNotAlive 172.20.0.1 Router
startIfNotAlive 172.20.0.1 Router
startIfNotAlive 172.20.0.2 WebServer
startIfNotAlive 172.20.0.2 WebServer
startIfNotAlive 172.20.0.5 Desktop
startIfNotAlive 172.20.0.5 Desktop
startIfNotAlive 172.20.0.7 Radagast
exit 0
exit 0
;;
;;
Liña 190: Liña 197:
;;
;;
stop)
stop)
stopIfAlive KrbldapPDC
stopIfAlive KrbldapBDC
stopIfAlive WebServer
stopIfAlive Router
stopIfAlive Proxy
stopIfAlive Desktop
exit 0
exit 0
;;
;;
esac
esac

</source>
</source>



Revisión actual feita o 3 de agosto de 2014 ás 20:23

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