¿Cómo reiniciar automáticamente MySQL y MongoDB cuando no responde?

3

Estoy ejecutando un servidor de desarrollo simple (Ubuntu) en el que MySQL y MongoDB a veces fallan. Siempre los reinicio con sudo service mysql restart.

Aunque sé que necesito investigar por qué se estrellan, y lo haré, actualmente estoy buscando una manera de reiniciarlos automáticamente después de que se hayan estrellado. Supongo que necesito tener algún tipo de demonio que los haga ping y los reinicie si ya no responden, pero no estoy seguro de cómo hacerlo.

Leo sobre herramientas como Nagios , pero supongo que eso es un poco excesivo para mi situación.

¿Alguien sabe cómo puedo empezar?

kramer65
fuente
Por favor revise los detalles en mi respuesta de nuevo. Hice algunos ajustes en los ejemplos y estoy bastante seguro de que el ejemplo de MySQL funcionará bien como está ahora. Todo probado en Ubuntu 12.04.5.
JakeGould
Estoy teniendo exactamente el mismo problema!
M_R_K

Respuestas:

10

Leo sobre herramientas como Nagios , pero supongo que eso es un poco excesivo para   mi situación.

¿Alguien sabe cómo puedo empezar?

Fácil. Mire en la configuración de configuraciones de monitoreo con Monit . Es una herramienta de monitoreo de sistema liviana y fácil de instalar que es muy útil para configurar en escenarios exactamente como lo describe; El servicio se cae, reinícialo y avisame al respecto.

Lo uso principalmente para servidores web Apache, pero hay muchos ejemplos de lo que se puede hacer para otros programas / software como MySQL y tal.

Configuración de Monit.

La forma en que lo configuro es la línea de esto. Primero, instale el programa de Monit de esta manera:

sudo apt-get install monit

Una vez instalado, edite la configuración aquí; Prefiero usar nano pero siéntete libre de usar cualquier editor de texto que prefieras

sudo nano /etc/monit/monitrc

Ajuste los valores predeterminados del daemon para verificar los servicios cada 60 segundos con un retraso de inicio de 120:

set daemon 60
with start delay 60

Entonces encuentra el mailserver Area de monitrc y añada la siguiente línea. Postfix o un SMTP deben estar activos para que esto funcione. Normalmente tengo instalado Postfix en mis servidores, así que uso la siguiente configuración:

set mailserver localhost

Entonces me aseguro de que un directorio de configuración de Monit esté configurado así:

sudo mkdir -p /etc/monit/conf.d

Configuración de un conjunto de reglas de monitoreo de Monit Apache2.

Ahora, como dije, uso principalmente Monit para el monitoreo de Apache, así que esta es una configuración simple que me gusta usar, pero el concepto básico es similar para MySQL, MongoDB u otras cosas. Lo guardaría en este archivo:

sudo nano /etc/monit/conf.d/apache2.conf

Y este sería el contenido de ese archivo:

check process apache with pidfile /var/run/apache2.pid
  start "/usr/sbin/service apache2 start"
  stop  "/usr/sbin/service apache2 stop"
  if failed host 127.0.0.1 port 80
    with timeout 15 seconds
  then restart
  alert [email protected] only on { timeout, nonexist }

La sintaxis es bastante autoexplicativa, pero básicamente:

  • El proceso depende de la apache2.pid; Asegúrese de cambiar eso para que coincida con la ubicación real de su apache2.pid o httpd.pid en su entorno
  • Luego tiene comandos conectados a los procesos de start y stop.
  • Y tiene una lógica que monitorea el servidor web en el puerto. 80 en localhost ( 127.0.0.1 )
  • Y solo los actos del servidor son inalcanzables durante 15 segundos.
  • Y si tiene que actuar, intenta un reinicio.
  • Y luego envía una alerta a la dirección de correo electrónico especificada en caso de que el servidor haya caducado o no exista.

Configuración de un conjunto de reglas de Monit MySQL.

Residencia en Los ejemplos que he vinculado arriba. Supongo que una configuración como esta funcionaría para MySQL. Primero, crea un archivo como este:

sudo nano /etc/monit/conf.d/mysql.conf

Y he adaptado el ejemplo para que, supongo, se comporte de manera similar a lo que he configurado para Apache:

check process mysqld with pidfile /var/run/mysqld/mysqld.pid
  start program = "/usr/sbin/service mysql start"
  stop program = "/usr/sbin/service mysql stop"
  if failed host 127.0.0.1 port 3306 protocol mysql
    with timeout 15 seconds
  then restart
  alert [email protected] only on { timeout, nonexist }

Por supuesto, eso debe ajustarse para que se adapte a su entorno de trabajo real, como ajustar la ubicación de la mysqld.pid, la dirección de correo electrónico y demás, pero más allá de que es bastante genérico en ideas / implementación.

Una vez que está establecido, reinicie monit y todo debe ser bueno:

sudo service monit restart

Configuración de un conjunto de reglas de monitoreo de Monit MongoDB.

Para crear un conjunto de reglas de monitoreo de MongoDB, cree un archivo como este:

sudo nano /etc/monit/conf.d/mongod.conf

Y aquí está la regla de monitoreo de MongoDB; tenga en cuenta que esto coincide con el daemon activo de MongoDB y no con un PID (también conocido como: mongod.lock ) ya que no parece funcionar con eso:

check process mongod matching "/usr/bin/mongod"
  start program = "/usr/sbin/service mongod start"
  stop program = "/usr/sbin/service mongod stop"
  if failed host 127.0.0.1 port 27017 protocol http
    with timeout 15 seconds
  then restart
  alert [email protected] only on { timeout, nonexist }

Por supuesto, eso debe ajustarse para que coincida con su entorno de trabajo real, como ajustar la ruta real de la /usr/bin/mongod binario, la dirección de correo electrónico y demás, pero más allá de que es bastante genérico en ideas / implementación.

Una vez que está establecido, reinicie monit y todo debe ser bueno:

sudo service monit restart

Monitoreo de Monit.

Puedes seguir el registro de Monit para verlo en acción:

sudo tail -f -n 200 /var/log/monit.log

Y como prueba, simplemente puede detener el servidor MySQL o MongoDB y luego ver lo que aparece en ese registro. Si todo va bien, debería ver que se realiza todo el proceso de supervisión y reinicio, incluido el envío de un correo electrónico a la dirección que ha establecido en la configuración.

JakeGould
fuente
Probé esto en Ubuntu 14.04, pero para mí no funciona. Después de pegar en el código de ejemplo que escribió y reinició monit I tail /var/log/monit.log. Entonces detengo manualmente mysql y mongo ( sudo service mysql stop y sudo service mongodb stop ). Después de un tiempo veo un par de líneas en el registro de monit sobre mongod: process is not running, trying to restart, start: /usr/sbin/service, failed to start. Se da cuenta de que mongo no se está ejecutando, pero no parece poder iniciarlo de nuevo. Ah, y sobre mysql no veo nada en los registros (esperé media hora). ¿Algunas ideas?
kramer65
1
Ah! Me las arreglé para hacerlo funcionar. Cambié la línea con el comando de inicio a start program = "/sbin/start mongodb" que funciona para mi No tengo idea aún por qué no funciona para mysql.
kramer65
3

Un simple script bash (o cualquier otro lenguaje de scripting con el que esté familiarizado) hará el trabajo (para ejecutarse con sudo):

while true
do
    # Ping the MySQL server (or run a real SELECT command using mysql client)
    mysqladmin ping
    # Check the return code: should be 0 if server is alive
    if [[ $? != 0 ]]
    then
        service mysql restart
    fi
    # Wait until next check
    sleep 60
done
Sébastien
fuente
¿Estás seguro de que sudo dentro de un script que se ejecuta automáticamente es una buena idea?
MariusMatutiae
@MariusMatutiae De hecho, sería más limpio sin sudo dentro del script. Yo edite
Sébastien