2 votes

Comment puis-je faire en sorte que monit interroge plus souvent lors d'un changement d'état?

J'utilise Monit pour surveiller divers processus qui doivent être en cours d'exécution en tant que groupe pour qu'un site web fonctionne correctement. Pour mettre en service ou arrêter le site, il existe un ordre précis par lequel les processus doivent être démarrés ou arrêtés. Les dépendances sont les suivantes. (Les noms ont été modifiés pour protéger les innocents. J'utilise des noms plus descriptifs dans la vraie configuration.)

  1. Le service site dépend de site.workerA, site.workerB et site-redis.

  2. Les deux travailleurs dépendent de site-redis.

Le site est toujours démarré ou arrêté via Monit afin d'éviter la possibilité de conditions de concurrence, ou que Monit agisse à l'encontre de moi. (par exemple, j'arrête un service et Monit continue de le redémarrer.)

Le problème est qu'il faut beaucoup plus de temps que nécessaire pour mettre en service tout le site. Si j'instruis Monit de démarrer le site, alors une fois que Monit a déterminé les dépendances, la séquence d'actions de la part de Monit est la suivante:

  1. Démarre site-redis.
  2. Attend pendant 2 minutes.
  3. Détecte que site-redis fonctionne, donc démarre les deux travailleurs.
  4. Attend pendant 2 minutes.
  5. Détecte que les travailleurs et redis fonctionnent, donc démarre site.
  6. [Attend pendant 2 minutes]
  7. [Détecte que site fonctionne.]

J'ai mis entre crochets les 2 dernières étapes car elles sont pratiquement insignifiantes puisque le site est effectivement opérationnel avant l'intervalle de 2 minutes.

L'attente de 2 minutes est l'intervalle de vérification par défaut que Monit utilise pour vérifier les services. Je sais que je pourrais réduire cet intervalle pour que ces services soient vérifiés plus fréquemment. Par exemple, je pourrais faire

vérifiez le processus site.workerB pidfile "/srv/site/var/run/site/site.workerB.pid"
    chaque [nombre] cycles
    ...

Je devrais également changer la durée du cycle de vérification pour quelque chose de plus petit afin qu'un cycle soit inférieur à 2 minutes.

Cependant, je ne veux pas que Monit vérifie toujours ces services plus fréquemment. Je voudrais que Monit ne vérifie les services plus fréquemment que lorsqu'il est en attente d'un changement d'état. Par exemple, si Monit a démarré un service et qu'un autre service en dépend, vérifiez à un intervalle de 5 secondes plutôt que 2 minutes.

Je ne vois pas de moyen de configurer Monit pour le faire, mais j'ai peut-être manqué quelque chose.


Voici une illustration de ma description ci-dessus. Après avoir supprimé les éléments qui ne sont pas pertinents pour le problème, la configuration de Monit est la suivante:

vérifiez le processus site-redis pidfile ".../site/redis.pid"
      groupe site
      programme de démarrage = ...
      programme d'arrêt = ...
      si n'existe pas alors démarrer

vérifiez le processus site pidfile ".../site/site.pid"
      groupe site
      dépend de site.workerA, site.workerB, site-redis
      programme de démarrage = ...
      programme d'arrêt = ...
      si n'existe pas alors démarrer

vérifiez le processus site.workerA pidfile ".../site/site.workerA.pid"
      groupe site
      dépend de site-redis
      programme de démarrage = ...
      programme d'arrêt = ...
      si n'existe pas alors démarrer

vérifiez le processus site.workerB pidfile ".../site/site.workerB.pid"
      groupe site
      dépend de site-redis
      programme de démarrage = ...
      programme d'arrêt = ...
      si n'existe pas alors démarrer

0voto

boppy Points 431

Vous pouvez en fait déclencher une réévaluation de monit en monit validate ou en utilisant SIGUSR1.

Vous pouvez donc réécrire vos programmes de démarrage/arrêt comme suit :

#!/bin/bash

function background {
    i="0"
    while [ $i -lt 20 ]; do
        monit validate > /dev/null
        monit status __YOUR__SERVICE__NAME__HERE__ | grep OK > /dev/null && exit 0
        sleep 5
        i=$[$i+1]
    done
}

# procédure de redémarrage

state=$?

background &

exit $state

Pour résumer : Une fois que la procédure de redémarrage est terminée, son code de sortie est suivi et une boucle de fond est lancée. Elle s'exécute 20 fois et dort pendant 5 secondes après chaque exécution (~ 1m40s). Elle force monit à réévaluer son état et sort de la boucle si l'état est OK. Sinon, la boucle continue. Enfin, le script lui-même se termine avec le code de sortie des procédures de redémarrage.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X