Jun 9, 2009

Monitorización de servicios con Zabbix (I)

En el Sistema de Alta Disponibilidad y Balanceo de Carga que estamos desarrollando, implantamos a través de los artículos anteriores un sistema de monitorización activa, es decir, en cada uno de los nodos del cluster se levantó un demonio que se encargaba de controlar el estado de los servicios configurados, y en caso de detectar algún fallo, ser capaz por si mismo de tomar las medidas oportunas (reiniciar el servicio, reiniciar la máquina, apagarla, etc.).

A parte de este tipo de monitorización, puede llegar a resultar bastante interesante instalar una monitorización pasiva, es decir, una arquitectura que sea capaz de informarnos de otros muchos más parámetros del sistema (aparte de los servicios principales), como por ejemplo el uso de CPU, memoria, espacio en disco, estado de otros procesos, etc.

A través de la monitorización activa se suelen cubrir aquellos puntos críticos del sistema, como por ejemplo que el proceso httpd deje de responder. En este caso, el margen de tiempo de reacción es crucial, ya que si el periodo acontecido (desde que el servicio deja de responder, se percata el administrador y en consecuencia este último toma una medida) es muy alto, las consecuencias pueden ser nefastas.

Por contra, a través de la monitorización pasiva se suelen cubrir otros aspectos que podríamos denominar de "incidencia menor", como por ejemplo que la CPU esté durante bastante tiempo al 90%, que quede menos de un 10% de espacio libre en disco, que exista algún proceso que esté empleando más memoria de lo habitual, etc.

Esta segunda clase de incidencias sí que permiten un margen de maniobra mayor. Cuando por ejemplo quede menos de un 10% de espacio en disco, se le puede enviar una alerta al administrador (SNMP, SMTP, etc.) para que decida cuál es la medida que se debe tomar (por ejemplo añadir un segundo disco duro).

Zabbix está formado por dos componentes principales: el cliente o agente (encargado de recoger los datos en el huésped) y el servidor (se ocupa de recopilar la información que le proporcionan los agentes). A su vez, junto con el servidor se suele instalar un frontend PHP para ofrecer esa información de una manera legible al administrador.

En nuestro Sistema de Alta Disponibilidad y Balanceo de Carga, vamos a instalar en los dos nodos frontales la parte servidora de Zabbix (así como el frontend PHP), y en los cuatro nodos del cluster, el agente.
root@ha1:~# aptitude install zabbix-server-mysql zabbix-frontend-php zabbix-agent

root@ha2:~# aptitude install zabbix-server-mysql zabbix-frontend-php zabbix-agent

root@lb1:~# aptitude install zabbix-agent

root@lb2:~# aptitude install zabbix-agent

Durante la instalación de la parte del servidor de Zabbix, el asistente nos realizará una serie de preguntas:

  • El tipo de base de datos que se va a utilizar para zabbix-frontend-php: mysql.
  • Contraseña de aplicación MySQL para zabbix-frontend-php: ******
  • ¿Desea configurar la base de datos para zabbix-server-mysql con "dbconfig-common"?: Yes
  • Contraseña del usuario root de la base de datos de MySQL: ******
  • Contraseña de aplicación MySQL para zabbix-server-mysql: ******

Lo primero que tenemos que hacer es definir el nombre de cada uno de los nodos en los ficheros de configuración de los agentes (etiqueta Hostname), así como la dirección IP del servidor de Zabbix al cual deberán enviarle la información (etiqueta Server).

root@ha1:~# cat /etc/zabbix/zabbix_agentd.conf
...
Server=127.0.0.1,192.168.1.11
Hostname=ha1
...

root@ha2:~# cat /etc/zabbix/zabbix_agentd.conf
...
Server=127.0.0.1,192.168.1.10
Hostname=ha2
...

root@lb1:~# cat /etc/zabbix/zabbix_agentd.conf
...
Server=192.168.1.10,192.168.1.11
Hostname=lb1
...
root@lb2:~# cat /etc/zabbix/zabbix_agentd.conf
...
Server=192.168.1.10,192.168.1.11
Hostname=lb2
...
A continuación registraremos el puerto que utilizan el agente y el servidor de Zabbix en el fichero /etc/services (10050, en los cuatro nodos, y 10051 en los dos nodos frontales).
~# cat /etc/services
...
zabbix-agent 10050/tcp # Servidor de Zabbix
zabbix-server 10051/tcp # Agente de Zabbix
...
Por último reiniciaremos el agente en los cuatro nodos, y el servidor de Zabbix y Apache en los dos nodos frontales:
root@ha1:~# /etc/init.d/zabbix-agent restart ; /etc/init.d/zabbix-server restart ; /etc/init.d/apache2 restart

root@ha2:~# /etc/init.d/zabbix-agent restart ; /etc/init.d/zabbix-server restart ; /etc/init.d/apache2 restart

root@lb1:~# /etc/init.d/zabbix-agent restart

root@lb2:~# /etc/init.d/zabbix-agent restart
Para acceder al servidor de Zabbix del frontal HA1 pondremos en un navegador web la URL http://192.168.1.11/zabbix/, y para acceder al servidor del frontal HA2, http://192.168.1.12/zabbix/.

Nada más cargar la página web, me encontré con un error PHP: Timezone for PHP is not set. Please set "date.timezone" option in php.ini.

Para solucionarlo, tenemos que editar el parámetro date.timezone dentro de las opciones de configuración de PHP. Además, aprovecharemos para incrementar el valor del parámetro max_execution_time de 30 a 300 (tiempo máximo de ejecución para cada script, en segundos). Esta operación la realizaremos en ambos nodos frontales.
~# cat /etc/php5/apache2/php.ini
...
date.timezone = Europe/Madrid
...
max_execution_time = 300
...

~# /etc/init.d/apache2 restart
Según el manual de Zabbix, para loguearnos en la consola de administración del servidor tenemos que introducir el usuario Admin y la opción de la contraseña dejarla en blanco (deberíamos establecer una en cuanto accediéramos a la consola de administración).

Pues bien, al hacer esto me encontré con el siguiente error: ERROR: Login name or password is incorrect.

Lo primero que hice fue comprobar el log de MySQL para ver si había habido algún problema cuando Zabbix consultó la password del usuario Admin en la base de datos. Todo estaba en orden.

Accediendo a la base de datos de Zabbix en MySQL, pude ver que la contraseña del usuario Admin no se correspondía con la del usuario guest (en teoría y según la documentación, las dos deberían estar en blanco nada más instalar la aplicación).
root@ha1:~# mysql -u root -p
Enter password:

mysql> use zabbix;
Database changed

mysql> select * from users;
+--------+-------+---------+---------------+----------------------------------+-----+-----------+------------+-------+---------+------+-------------+----------------+------------+---------------+
userid alias name surname passwd url autologin autologout lang refresh type theme attempt_failed attempt_ip attempt_clock
+--------+-------+---------+---------------+----------------------------------+-----+-----------+------------+-------+---------+------+-------------+----------------+------------+---------------+
1 Admin Zabbix Administrator 5fce1b3e34b520afeffb37ce08c7cd66 0 900 en_gb 30 3 default.css 0 0
2 guest Default User d41d8cd98f00b204e9800998ecf8427e 0 900 en_gb 30 1 default.css 0 0
+--------+-------+---------+---------------+----------------------------------+-----+-----------+------------+-------+---------+------+-------------+----------------+------------+---------------+

2 rows in set (0.01 sec)
Así que lo primero que probé fue a poner la cadena (MD5) del password del usuario guest, al usuario Admin. Pero esto no funcionó...

Así que lo que tuve que hacer fue generar una nueva suma MD5 para la password que quería utilizar en la consola de administración web, y actualizar el campo passwd para el usuario Admin (tabla users).
root@ha1:~# echo -n "myzabbixpassword"  md5sum
5c0846506fc325f57006336a9436451a -

root@ha1:~# mysql -u root -p
Enter password:

mysql> use zabbix;
Database changed

mysql> update users set passwd="5c0846506fc325f57006336a9436451a" where alias='Admin';
Query OK, 1 row affected (0.01 sec)

Rows matched: 1 Changed: 1 Warnings: 0
Esta actualización también la tuve que hacer en el nodo HA2.

Cuando parecía que todos los problemas estaban solucionados, compruebo que en los nodos traseros no está corriendo el agente, y en los nodos frontales ni el agente ni el servidor. Al abrir los logs pude ver los siguientes mensajes: Cannot create PID file [/var/run/zabbix-server/zabbix_server.pid] [No such file or directory] y Cannot create PID file [/var/run/zabbix-agent/zabbix_agentd.pid] [No such file or directory].
~# cat /var/log/zabbix-server/zabbix_server.log
...
/usr/sbin/zabbix_server [2537]: Cannot create PID file [/var/run/zabbix-server/zabbix_server.pid] [No such file or directory]
/usr/sbin/zabbix_server [2537]: ERROR: Cannot create PID file [/var/run/zabbix-server/zabbix_server.pid] [No such file or directory]
...

~# cat /var/log/zabbix-agent/zabbix_agentd.log
...
zabbix_agentd [2532]: Cannot create PID file [/var/run/zabbix-agent/zabbix_agentd.pid] [No such file or directory]
zabbix_agentd [2532]: ERROR: Cannot create PID file [/var/run/zabbix-agent/zabbix_agentd.pid] [No such file or directory]
...
Para solucionar el problema crearemos las estructuras de directorios que faltan dentro de la carpeta /etc/zabbix/, ya que si no con cada arranque Zabbix volverá a borrar el path /var/run/zabbix-*. Además tendremos que establecer los permisos adecuados.
root@ha1:~# mkdir -p /etc/zabbix/var/run/zabbix-server
root@ha1:~# mkdir -p /etc/zabbix/var/run/zabbix-agent
root@ha1:~# chown zabbix:root /etc/zabbix/var/run/zabbix-server
root@ha1:~# chown zabbix:root /etc/zabbix/var/run/zabbix-agent

root@ha2:~# mkdir -p /etc/zabbix/var/run/zabbix-server
root@ha2:~# mkdir -p /etc/zabbix/var/run/zabbix-agent
root@ha2:~# chown zabbix:root /etc/zabbix/var/run/zabbix-server
root@ha2:~# chown zabbix:root /etc/zabbix/var/run/zabbix-agent

root@lb1:~# mkdir -p /etc/zabbix/var/run/zabbix-agent
root@lb1:~# chown zabbix:root /etc/zabbix/var/run/zabbix-agent

root@lb2:~# mkdir -p /etc/zabbix/var/run/zabbix-agent
root@lb2:~# chown zabbix:root /etc/zabbix/var/run/zabbix-agent
Aparte tendremos que modificar también los ficheros de configuración del cliente y del servidor en cada nodo para incluir la ruta correcta al fichero .pid.
~# cat /etc/zabbix/zabbix_server.conf
...
PidFile=/etc/zabbix/var/run/zabbix-server/zabbix_server.pid
...

~# cat /etc/zabbix/zabbix_agentd.conf
...
PidFile=/etc/zabbix/var/run/zabbix-agent/zabbix_agent.pid
...

1 comment:

  1. Muchas gracias por el post me sirvió de mucha ayuda. Por suerte mi problema se limitaba al password o eso espero...

    ReplyDelete