Monitoreo · 7 min read · Oct 09, 2025

El Clúster Web Perfecto con Balanceo de Carga y Alta Disponibilidad con 2 Servidores Ejecutando Xen en Ubuntu 8.04 Hardy Heron - Página 9

15. Scripts personalizados para monitoreo (lb1, lb2, web1, web2)

Hice algunos scripts bash para monitorear toda la configuración (son un poco feos pero funcionan). Si los mejoras, ¡no dudes en enviármelos!

15.1 Monitoreo desde lb1.example.com

Primero debemos instalar sendmail para que lb1.example.com pueda enviar correos:

apt-get install sendmail

El primer script verificará si el balanceador de carga de respaldo (lb2.example.com) sigue disponible para tomar el control:

vi /root/lb2_check

#!/bin/bash
# Verificación del balanceador de carga de respaldo
# Copyright (c) 2008 blogama.org
# Este script está licenciado bajo GNU GPL versión 2.0 o superior
# ---------------------------------------------------------------------
### Este script hace 1 verificación ###
### 1) Verifica si el balanceador de carga de respaldo falló y envía notificación por correo ###
### Para ser modificado ###
EMAIL="[email protected]"
###### No hacer modificaciones debajo ######
### Binarios ###
MAIL=$(which mail)
### Para restaurar a original cuando el problema esté solucionado ###
if [ $1 ]; then
  if [ $1=="fix" ]; then
    rm /root/lb2_problem.txt
    > /var/log/ha-log
    exit 1;
  fi
fi
### Verificar si ya se notificó ###
cd /root
if [ -f lb2_problem.txt ]; then
  exit 1;
fi
### Verificar si Heartbeat está corriendo en espera activa ###
tail /var/log/ha-log 2>&1 | grep "Asking other side for ping node count"
if [ "$?" -ne "1" ]; then
  echo "El balanceador de carga de respaldo falló" > /root/lb2_problem.txt
  $MAIL -s "Problema con el balanceador de carga de respaldo" $EMAIL < /root/lb2_problem.txt
fi

Hacemos que este script sea ejecutable:

chmod +x /root/lb2_check

Si lb2.example.com falla, entonces creará un archivo /root/lb2_problem.txt y enviará una notificación por correo. Hasta que el archivo lb2_problem.txt esté allí, no volverá a verificar. También debemos vaciar el archivo de registro una vez que el problema esté solucionado para que el script funcione correctamente.

Una vez que el problema esté solucionado en lb2.example.com, por favor ejecuta manualmente:

/root/lb2_check fix

El siguiente script verificará si algún puerto falló en web1 o web2 revisando el archivo de registro de ldirectord. Ya hay una notificación por correo con ldirectord, pero envía millones de notificaciones, el mío solo envía una hasta que soluciones el problema:

vi /root/ports_failed

y haz que se vea así:

#!/bin/bash
# Verificación de fallos de puertos de Ldirectord
# Copyright (c) 2008 blogama.org
# Este script está licenciado bajo GNU GPL versión 2.0 o superior
# ---------------------------------------------------------------------
### Este script hace 1 verificación ###
### 1) Verifica fallos de puertos en servidores balanceados ###
### Para ser modificado ###
EMAIL="[email protected]"
###### No hacer modificaciones debajo ######
### Binarios ###
MAIL=$(which mail)

# para restaurar a original cuando el problema esté solucionado
if [ $1 ]; then
  if [ $1=="fix" ]; then
    rm /root/port_problem.txt
    > /var/log/ldirectord.log
  fi
fi
### verificar si ya se notificó ###
cd /root
if [ -f port_problem.txt ]; then
  cat /var/log/ldirectord.log | grep Deleted > /var/log/port_problem.log
  exit 1;
fi
### Verificar si el puerto falló ###
cat /var/log/ldirectord.log 2>&1 | grep Deleted
if [ "$?" -ne "1" ]; then
  cat /var/log/ldirectord.log | grep Deleted > /var/log/port_problem.log
  cat "Problema de puertos ver archivo de registro /var/log/port_problem.log" > /root/port_problem.txt
  $MAIL -s "Algunos puertos fallaron" $EMAIL < /root/port_problem.txt
fi

Hacemos que sea ejecutable:

chmod +x /root/ports_failed

Esto es lo mismo que el primer script, una vez que el problema esté solucionado debes ejecutar:

/root/ports_failed fix

a fin de que el script vuelva a funcionar.

Ahora agrega ambos scripts a tu crontab:

crontab -e

* * * * * /root/ports_failed  >/dev/null 2>&1
* * * * * /root/lb2_check  >/dev/null 2>&1

15.2 Monitoreo desde lb2.example.com

El monitoreo del segundo balanceador de carga es importante porque nos dirá si el balanceador de carga maestro falló y, si lo hizo, mantener un ojo en los fallos de puertos en web1 y web2.

Primero debemos instalar sendmail para que lb2.example.com pueda enviar correos:

apt-get install sendmail

vi /root/ports_check

Y pega este script:

#!/bin/bash
# Verificación de fallos de puertos de Ldirectord
# Copyright (c) 2008 blogama.org
# Este script está licenciado bajo GNU GPL versión 2.0 o superior
# ---------------------------------------------------------------------

### Este script hace 2 verificaciones ###
### 1) verifica si el balanceador de carga maestro falló y envía notificación por correo ###
### 2) Si el balanceador de carga maestro falló, verifica fallos de puertos en servidores balanceados ###
### Para ser modificado ###
EMAIL="[email protected]"
###### No hacer modificaciones debajo ######
### Binarios ###
MAIL=$(which mail)
### Fecha ###
NOW=$(date)
### Para restaurar a original cuando el problema esté solucionado ###
if [ $1 ]; then
  cd /root/
  if [ $1=="fix" ]; then
  
    if [ -f lb1_problem.txt ]; then
      rm /root/lb1_problem.txt
    fi
  
    if [ -f port_problem.txt ]; then
      rm /root/port_problem.txt
    fi
  
    if [ -f /root/server_problem_notified.txt ]; then
      rm /root/server_problem_notified.txt
    fi
  > /var/log/ldirectord.log
  > /var/log/ha-log
  exit 1;
  fi
fi
# verificar si ldirectord está corriendo en lb2.example.com (significa que lb1.example.com falló)
#$LDIRECTORD /etc/ha.d/ldirectord.cf status 2>&1 | grep running
cat /var/log/ha-log | grep "takeover complete" > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
  ### verificar si ya se notificó ###
  cd /root
  if [ -f port_problem.txt ]; then
    cat /var/log/ldirectord.log | grep Deleted > /var/log/port_problem.log
    exit 1;
  fi
  ### Verificar si el puerto falló ###
  cat /var/log/ldirectord.log 2>&1 | grep Deleted
  if [ "$?" -ne "1" ]; then
    cat /var/log/ldirectord.log | grep Deleted > /var/log/port_problem.log
    echo "Problema de puertos ver archivo de registro /var/log/port_problem.log" > /root/port_problem.txt
    $MAIL -s "Algunos puertos fallaron" $EMAIL < /root/port_problem.txt
  fi
       
  ### Verificar si ya se notificó que el balanceador de carga maestro falló ###
  cd /root
  if [ -f server_problem_notified.txt ]; then
    exit 1;
  fi
        
  ### Notificar que el balanceador de carga maestro falló ###
  cd /root
  MESSAGE="$NOW : El balanceador de carga maestro falló"
  echo $MESSAGE > lb1_problem.txt
  $MAIL -s "El balanceador de carga maestro falló" $EMAIL < /root/lb1_problem.txt
  echo "notificado" > server_problem_notified.txt
fi

Hacemos que sea ejecutable:

chmod +x /root/ports_check

Y lo agregamos a nuestro crontab:

crontab -e

* * * * * /root/ports_failed  >/dev/null 2>&1

Cuando recibas una notificación del script, por favor ejecuta después:

/root/ports_check fix

15.3 Monitoreo desde web1 y web2

El monitoreo del clúster web ya está parcialmente hecho con monit y munin.

La parte que aún no está cubierta es el monitoreo de la replicación de MySQL.

Por favor, lee el siguiente artículo:

Reparar la replicación maestro-maestro de MySQL

El monitoreo de MySQL es opcional, pero en un servidor de producción, pueden ocurrir problemas con la replicación de MySQL, así que realmente recomiendo usar esos scripts o algo similar para verificar la consistencia de las bases de datos.

15.4 Monitoreo desde un servidor remoto

Esta parte agrega seguridad adicional al verificar puertos importantes (25,53,80,443) desde un servidor remoto (instalar dns-utils para dig):

#!/bin/bash
# Script para verificar puertos importantes en un servidor web remoto
# Copyright (c) 2008 blogama.org
# Este script está licenciado bajo GNU GPL versión 2.0 o superior
# ---------------------------------------------------------------------
### Este script hace una verificación en los puertos 25, 53, 80 y 443 ###
### Después de 2 verificaciones fallidas, enviará una notificación por correo ###
### Para ser modificado ###
WEBSERVERIP="192.168.1.106"
MAILSERVERIP="192.168.1.106"
EMAIL="[email protected]"
DNSSERVERIP="192.168.1.106"
DOMAINTOCHECKDNS="example.com"
DOMAINIP="192.168.1.106"

###### No hacer modificaciones debajo ######
### Binarios ###
MAIL=$(which mail)
TELNET=$(which telnet)
DIG=$(which dig)
### Verificar si ya se notificó ###
cd /root
if [ -f server_problem.txt ]; then
  exit 1;
fi
### Probar SMTP ###
(
echo "quit"
) | $TELNET $MAILSERVERIP 25 | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
  echo "PUERTO CONECTADO"
else
  if [ -f server_problem_first_time_25.txt ]; then
    echo "PUERTO 25 NO CONECTADO" >> /root/server_problem.txt
  else
    echo "NO CONECTADO" > /root/server_problem_first_time_25.txt
  fi
fi
### Probar HTTP ###
(
echo "quit"
) | $TELNET $WEBSERVERIP 80 | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
  echo "PUERTO CONECTADO"
else
  if [ -f server_problem_first_time_80.txt ]; then
    echo "PUERTO 80 NO CONECTADO" >> /root/server_problem.txt
  else
    echo "NO CONECTADO" > /root/server_problem_first_time_80.txt
  fi
fi
### Probar HTTPS###
(
echo "quit"
) | $TELNET $WEBSERVERIP 443 | grep Connected > /dev/null 2>&1
if [ "$?" -ne "1" ]; then
  echo "PUERTO CONECTADO"
else
  if [ -f server_problem_first_time_443.txt ]; then
    echo "PUERTO 81 NO CONECTADO" >> /root/server_problem.txt
  else
    echo "NO CONECTADO" > /root/server_problem_first_time_443.txt
  fi
fi

### Probar DNS ###
$DIG $DOMAINTOCHECKDNS @$DNSSERVERIP | grep $DOMAINIP
if [ "$?" -ne "1" ]; then
  echo "PUERTO CONECTADO"
else
  if [ -f server_problem_first_time_53.txt ]; then
    echo "PUERTO 53 NO CONECTADO" >> /root/server_problem.txt
  else
    echo "NO CONECTADO" > /root/server_problem_first_time_53.txt
  fi
fi
### Enviar notificación por correo después de 2 verificaciones fallidas ###
if [ -f server_problem.txt ]; then
  $MAIL -s "Problema del servidor" $EMAIL < /root/server_problem.txt
fi

¡Y voilà! No dudes en enviarme correos privados a admin [at] marchost.com o publicar comentarios aquí o en mi página: blogama.org

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.