Como reiniciar o MySQL e o MongoDB automaticamente quando não estão respondendo?

3

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

Embora eu saiba que preciso investigar por que eles falham - e eu irei -, estou procurando uma maneira de reiniciá-los automaticamente depois que eles falharem. Eu acho que preciso ter algum tipo de daemon que os pinte e os reinicie se eles não responderem mais, mas não tenho certeza de como fazer isso.

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

Alguém sabe como eu posso começar?

    
por kramer65 01.10.2015 / 08:02

2 respostas

10

I read about tools like Nagios, but I guess that’s a bit overkill for my situation.

Does anybody know how I can get started?

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

Eu principalmente o uso para servidores web Apache, mas existem muitos exemplos do que pode ser feito para outros programas / software como o MySQL e tal.

Configurando Monit.

A maneira que eu configuro é a linha isso. Primeiro, instale o próprio programa Monit assim:

sudo apt-get install monit

Uma vez instalado, edite a configuração aqui; Eu prefiro usar nano , mas fique à vontade para usar qualquer editor de texto que você preferir:

sudo nano /etc/monit/monitrc

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

set daemon 60
with start delay 60

Em seguida, localize a área mailserver de monitrc e adicione a linha a seguir. O postfix ou um SMTP precisa estar ativo para que isso funcione. Eu normalmente tenho Postfix instalado em meus servidores, então eu uso a seguinte configuração:

set mailserver localhost

Depois, 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 monitoração do Monit Apache2.

Agora, como eu disse, eu uso principalmente Monit para monitoramento do Apache, então esta é uma configuração simples que eu gosto de usar, mas o conceito básico é semelhante para o MySQL, MongoDB ou outras coisas. Gostaria de salvá-lo 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.pid ou httpd.pid em seu ambiente.
  • Em seguida, há comandos conectados aos processos de start e stop .
  • E tem uma lógica que monitora o servidor da Web na porta 80 on localhost ( 127.0.0.1 )
  • E somente atos do servidor ficam inacessíveis por 15 segundos.
  • Se tiver que agir, ele tenta reiniciar.
  • E, em seguida, envia um alerta para o endereço de e-mail especificado em incidentes do tempo limite do servidor ou não existentes.

Configurando um conjunto de regras de monitoramento do Monit MySQL.

Baseado em os exemplos aos quais eu me associei acima , eu diria que uma configuração como essa funcionaria para o MySQL. Primeiro, crie um arquivo como este:

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

E eu adaptei o exemplo para que - eu diria - se comporte de forma 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 mysqld.pid , o endereço de e-mail e tal, mas além disso, é bastante genérico em ideias / implementação.

Uma vez definido, reinicie monit e tudo deve ser bom:

sudo service monit restart

Configurando um conjunto de regras de monitoramento do Monit MongoDB.

Para criar um conjunto de regras de monitoramento do 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 MongoDB ativo e não a um PID (também conhecido como: mongod.lock ), pois parece que não funcionou 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 binário /usr/bin/mongod , o endereço de e-mail e tal, mas que é bastante genérico em ideias / implementação.

Uma vez definido, reinicie monit e tudo deve ser bom:

sudo service monit restart

Monitorando Monit.

Você pode seguir o log do Monit para ver isso 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 reiniciar, incluindo um e-mail sendo enviado para o endereço que você definiu na configuração.

    
por 01.10.2015 / 08:25
3

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