Como reiniciar automaticamente o MySQL e o MongoDB quando não respondem?

Como reiniciar automaticamente o MySQL e o MongoDB quando não respondem?

Estou executando um servidor de desenvolvimento simples (Ubuntu) no qual o MySQL e o MongoDB às vezes travam. Eu sempre os reinicio com sudo service mysql restart.

Embora eu saiba que preciso investigar por que eles travaram (e o farei), no momento estou procurando uma maneira de reiniciá-los automaticamente após travarem. Acho que preciso de algum tipo de daemon que faça ping neles e os reinicie se eles não responderem mais, mas não tenho certeza de como fazer isso.

Eu li sobre ferramentas comoNagios, mas acho que isso é um pouco exagerado para a minha situação.

Alguém sabe como posso começar?

Responder1

Eu li sobre ferramentas comoNagios, mas acho que isso é um pouco exagerado para a minha situação.

Alguém sabe como posso começar?

Fácil. Considere definir configurações de monitoramento comMonitorar. É uma ferramenta de monitoramento de sistema leve e fácil de configurar, muito útil para configurar em cenários exatamente como você descreve; o serviço cai, reinicie-o e me avise sobre isso.

Eu o uso principalmente para servidores web Apache, mas existemmuitos exemplos do que pode ser feito para outros programas/softwarecomo MySQL e outros.

Configurando o Monit.

A maneira como eu configurei é alinhando isso. Primeiro, instale o próprio programa Monit assim:

sudo apt-get install monit

Depois de instalado, edite a configuração aqui; Eu prefiro usar nano, mas fique à vontade para usar o editor de texto de sua preferência:

sudo nano /etc/monit/monitrc

Ajuste os valores padrão do daemon para verificar serviços a cada 60 segundos com um atraso inicial de 120:

set daemon 60
with start delay 60

Em seguida, encontre a mailserverárea de monitrce adicione a seguinte linha. O Postfix ou um SMTP precisa estar ativo para que isso funcione. Normalmente tenho o Postfix instalado em meus servidores, então uso a seguinte configuração:

set mailserver localhost

Então, certifico-me de que um diretório de configuração do Monit esteja configurado assim:

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

Configurando um conjunto de regras de monitoramento Monit Apache2.

Agora, como eu disse, eu uso principalmente o Monit para monitoramento do Apache, então esta é uma configuração simples que gosto de usar, mas o conceito básico é semelhante para MySQL, MongoDB ou outras coisas. Eu salvaria neste arquivo:

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

E este seria o conteúdo desse arquivo:

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 }

A sintaxe é bastante autoexplicativa, mas basicamente:

  • O processo depende do apache2.pid; certifique-se de alterar isso para corresponder à localização real do seu apache2.pidambiente httpd.pid.
  • Depois tem comandos ligados aos processos de starte stop.
  • E possui lógica que monitora o servidor web na porta 80em localhost( 127.0.0.1)
  • E apenas os atos do servidor ficam inacessíveis por 15 segundos.
  • E se tiver que agir, ele tenta reiniciar.
  • E então envia um alerta para o endereço de e-mail especificado sobre incidentes de tempo limite do servidor ou inexistência.

Configurando um conjunto de regras de monitoramento Monit MySQL.

Baseado emos exemplos que vinculei acima, eu presumiria que uma configuração como essa funcionaria para MySQL. Primeiro, crie um arquivo como este:

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

E adaptei o exemplo para que - eu presumo - se comporte de maneira semelhante ao que configurei para o 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 }

É claro que isso deve ser ajustado para corresponder ao seu ambiente de trabalho real - como ajustar a localização do arquivo mysqld.pid, o endereço de e-mail e outros - mas, além disso, é bastante genérico em ideias/implementação.

Depois de definido, reinicie monite tudo ficará bem:

sudo service monit restart

Configurando um conjunto de regras de monitoramento Monit MongoDB.

Para criar um conjunto de regras de monitoramento MongoDB, crie um arquivo como este:

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

E aqui está a regra de monitoramento do MongoDB; observe que isso corresponde ao daemon ativo do MongoDB e não a um PID (também conhecido como mongod.lock:), pois não parece funcionar com isso:

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 }

É claro que isso deve ser ajustado para corresponder ao seu ambiente de trabalho real - como ajustar o caminho real do /usr/bin/mongodbinário, o endereço de e-mail e outros - mas, além disso, é bastante genérico em ideias/implementação.

Depois de definido, reinicie monite tudo ficará bem:

sudo service monit restart

Monitoramento Monit.

Você pode seguir o log do Monit para vê-lo em ação:

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

E como teste, você pode simplesmente parar o servidor MySQL ou MongoDB e ver o que aparece nesse log. Se tudo correr bem, você deverá ver todo o processo de monitoramento e a reinicialização acontecer, incluindo um e-mail sendo enviado para o endereço que você definiu na configuração.

Responder2

Um simples script bash (ou qualquer outra linguagem de script com a qual você esteja familiarizado) fará o trabalho (para ser executado com 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

informação relacionada