Servidor de Alta Dispoñibilidade NFS de Dous Nodos: Diferenzas entre revisións
(Non se amosan 3 revisións do historial feitas polo mesmo usuario.) | |||
Liña 74: | Liña 74: | ||
</source> |
</source> |
||
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. |
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, e arrancar o servidor. |
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. |
||
Liña 85: | Liña 85: | ||
gandalf.iesrodeira.com vmstopnfs \ |
gandalf.iesrodeira.com vmstopnfs \ |
||
IPaddr2::172.20.1.2/16/lan drbddisk::r0 Filesystem::/dev/drbd0::/NFS/servers::ext4 \ |
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/templates::/NFS/templates::none::bind \ |
||
vmstartnfs |
vmstartnfs |
||
</source> |
</source> |
||
Liña 93: | Liña 93: | ||
<source lang='bash'> |
<source lang='bash'> |
||
#!/bin/bash |
#!/bin/bash |
||
#Recibe Nombre |
|||
# |
|||
function testIfAlive() { |
|||
alive=false; |
|||
ping -c 10 ${1} > /dev/null |
|||
if [ $? -eq 0 ]; then |
|||
alive=true; |
|||
fi |
|||
} |
|||
case "$1" in |
case "$1" in |
||
start|"") |
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 |
|||
⚫ | |||
fi |
|||
⚫ | |||
;; |
;; |
||
restart|reload|force-reload) |
restart|reload|force-reload) |
||
echo "Error: argument '$1' not supported" >&2 |
echo "Error: argument '$1' not supported" >&2 |
||
exit 4; |
|||
;; |
;; |
||
stop) |
stop) |
||
⚫ | |||
/etc/init.d/vmcluster stop |
|||
exit 0 |
|||
⚫ | |||
exit 0 |
|||
;; |
;; |
||
esac |
esac |
||
</source> |
</source> |
||
Liña 117: | Liña 133: | ||
#Recibe Nombre |
#Recibe Nombre |
||
# |
# |
||
function mountIfAlive() { |
|||
ping -c 4 ${1} > /dev/null |
|||
if [ $? -eq 0 ]; then |
|||
${2} |
|||
fi |
|||
} |
|||
case "$1" in |
case "$1" in |
||
start|"") |
start|"") |
||
exit 0 |
|||
;; |
;; |
||
restart|reload|force-reload) |
restart|reload|force-reload) |
||
echo "Error: argument '$1' not supported" >&2 |
echo "Error: argument '$1' not supported" >&2 |
||
exit 4; |
|||
;; |
;; |
||
stop) |
stop) |
||
service nfs-kernel-server start |
service nfs-kernel-server start |
||
exit 0 |
|||
;; |
;; |
||
esac |
esac |
||
</source> |
</source> |
||
Liña 150: | Liña 173: | ||
#Recibe Nombre |
#Recibe Nombre |
||
# |
# |
||
function |
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 167: | 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.
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