May 31, 2009

Monitorización de servicios con mon (III)

Y ya para terminar el capítulo de la monitorización de servicios con mon dentro del Sistema de Alta Disponibilidad y Balanceo de Carga que venimos desarrollando, vamos a ver los tres scripts que implementaremos tanto para la parada (service_down.alert) y arranque (service_up.alert) de servicios, como para la monitorización del estado de un determinado proceso (proc.monitor).

Los scripts de parada y arranque serán comunes para todos los nodos del cluster. El script de parada será invocado por mon desde el archivo mon.cf a través de la siguiente forma: "alert service_down.alert comando fichero_estado".

Como primer argumento le pasaremos el comando que tendrá que ejecutar en caso de caída del servicio, y en el segundo, el fichero donde guardar el estado del servicio. Estos valores serán recibidos por el script a través de las variables de entorno $9 y $10 respectivamente.

En el script de parada lo primero que se hace es comprobar si el fichero de estado existe, y en caso contrario se crea con el valor inicial de "on". Si se produce una primera caída del servicio (el fichero de estado contendrá en ese momento el valor "on"), se ejecutará la orden recibida mediante la variable $9. A continuación se pondrá en el fichero de estado el valor "restarted".

Si el servicio siguiera caído cuando mon volviera a comprobar su situación, vería que el valor del fichero de estado es "restarted" (ya ha sido reiniciado previamente), con lo que a continuación reiniciaría el equipo y pondría el valor "rebooted" en dicho fichero. Si el servicio siguiera sin arrancar, apagaría la máquina completamente.
~# cat /usr/lib/mon/alert.d/service_down.alert
#!/bin/sh

if [ ! -f $10 ]; then
echo "on" > $10
fi

case "$(cat $10)" in
"on")
echo "restarted" > $10
$(/usr/bin/sudo $9);;
"restarted")
echo "rebooted" > $10
$(/usr/bin/sudo reboot);;
"rebooted")
echo "on" > $10
$(/usr/bin/sudo halt);;
esac
Por otra parte, el script de arranque (service_up.alert) lo único que hará será poner el valor "on" en el fichero de estado.
~# cat /usr/lib/mon/alert.d/service_up.alert
#!/bin/sh
echo "on" > $10
También será necesario desarrollar un script encargado de comprobar si un determinado servicio sigue vivo. Este script será empleado exclusivamente en los dos nodos traseros para verificar el estado del proceso ndbd.
~# cat /usr/lib/mon/mon.d/proc.monitor

#!/bin/sh
if [ "$(pgrep $1)" = "" ]; then
exit 1
else
exit 0
fi
Estos scripts que acabamos de diseñar les tendremos que otorgar permisos de ejecución:
~# chmod +x /usr/lib/mon/alert.d/service_down.alert

~# chmod +x /usr/lib/mon/alert.d/service_up.alert

~# chmod +x /usr/lib/mon/mon.d/proc.monitor
Mon es lanzado mediante el usuario daemon y este último no tiene privilegios de root para realizar ciertas operaciones (reiniciar apache2 y proftpd, reiniciar y apagar la máquina, etc). Por lo tanto, dentro del fichero /etc/sudoers de cada una de las máquinas habrá que incluir las órdenes necesarias que permitan ejecutar dichos comandos al usuario daemon con permisos de root.

Para los nodos HA1 y HA2 añadiremos las siguientes líneas al fichero /etc/sudoers:
~# cat /etc/sudoers
...
# User privilege specification
root ALL=(ALL) ALL

daemon ALL=NOPASSWD:/etc/init.d/mysql-ndb-mgm restart,/sbin/reboot,/sbin/halt
...
Y para LB1 y LB2:
~# cat /etc/sudoers
...
# User privilege specification
root ALL=(ALL) ALL

daemon ALL=NOPASSWD:/etc/init.d/apache2 restart,/etc/init.d/vsftpd restart,/etc/init.d/glusterfs-server restart,/etc/init.d/mysql restart",/etc/init.d/mysql-ndb restart,/sbin/reboot,/sbin/halt
...
Debido a que mon va a controlar una serie de servicios que deben de estar previamente arrancados, tenemos que modificar su script de arranque (/etc/init.d/mon) para que sea el último en levantarse (le daremos prioridad 99). En caso de apagado o reinicio de la máquina, ocurrirá lo contrario: deberá ser el primer en apagarse (le daremos prioridad 10).
~# update-rc.d -f mon remove
~# update-rc.d mon start 99 2 3 4 5 . stop 10 0 1 6 .
Esto sólo hay que hacerlo en los dos nodos traseros (LB1, LB2), ya que para los dos nodos frontales (HA1, HA2) será Heartbeat el encargado de levantarlo o apagarlo (recordamos el contenido del fichero /etc/ha.d/haresources):
~# cat /etc/ha.d/haresources
ha1 IPaddr2::192.168.1.20 IPaddr2::10.0.0.20 mysql-ndb-mgm ldirectord::ldirectord.cf LVSSyncDaemonSwap::master mon
Por lo tanto, para que Heartbeat sea el único elemento encargado de detener e iniciar el demonio mon, tendremos que quitarlo del sistema de arranque del proceso init en los nodos HA1 y HA2:
~# update-rc.d -f mon remove

No comments:

Post a Comment