Servidor de Alta Dispoñibilidade NFS de Dous Nodos: Diferenzas entre revisións
(Non se amosan 10 revisións do historial feitas polo mesmo usuario.) | |||
Liña 66: | Liña 66: | ||
1 sha1 password_cluster |
1 sha1 password_cluster |
||
</source> |
</source> |
||
*'''/etc/ha.d/haresources''' (igual en ambos nodos) |
|||
<source lang='bash'> |
|||
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 |
|||
</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. |
|||
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|Os servicios indicados en ''haresources'' son manexados por ''heartbeat'' e non é necesario/convinte que os inicie ou pare o sistema}} |
|||
==Servicios Extra== |
==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: |
|||
<source lang='bash'> |
|||
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 |
|||
</source> |
|||
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''': |
|||
<source lang='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 |
|||
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 |
|||
</source> |
|||
*'''vmstopnfs''': |
|||
<source lang='bash'> |
|||
#!/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 |
|||
</source> |
|||
*'''vmcluster''': |
|||
<source lang='bash'> |
|||
#!/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 |
|||
</source> |
|||
==Información Adicional== |
==Información Adicional== |
||
[http://www.linux-ha.org/doc/users-guide/users-guide.html Configuración de Heartbeat] |
[http://www.linux-ha.org/doc/users-guide/users-guide.html Configuración de Heartbeat] |
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