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.)
-
Le service
site
dépend desite.workerA
,site.workerB
etsite-redis
. -
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:
- Démarre
site-redis
. - Attend pendant 2 minutes.
- Détecte que
site-redis
fonctionne, donc démarre les deux travailleurs. - Attend pendant 2 minutes.
- Détecte que les travailleurs et redis fonctionnent, donc démarre
site
. - [Attend pendant 2 minutes]
- [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