web-dev-qa-db-fra.com

quel est l'avantage d'utiliser supervisord sur monit

Nous avons une configuration personnalisée qui a plusieurs démons (applications Web + tâches d'arrière-plan) en cours d'exécution. J'envisage d'utiliser un service qui nous aide à surveiller ces démons et à les redémarrer si leur consommation de ressources dépasse un certain niveau.

J'apprécierai tout aperçu sur le moment où l'un est meilleur que l'autre. Si je comprends bien, monit lance un nouveau processus pendant que le superviseur démarre un sous-processus. Quels sont les avantages et les inconvénients de cette approche?

J'utiliserai également upstart pour surveiller le monit ou le supervord lui-même. Le déploiement de la webapp se fera à l'aide de capistrano.

Merci

33
murtaza52

Je n'ai pas utilisé monit mais il y a des défauts importants avec supervisord.

  1. Les programmes doivent s'exécuter au premier plan

Cela signifie que vous ne pouvez pas simplement exécuter /etc/init.d/Apache2 start. La plupart du temps, vous pouvez simplement écrire une ligne par exemple "source/etc/Apache2/envvars && exec/usr/sbin/Apache2 -DFOREGROUND" mais parfois vous avez besoin de votre propre script wrapper. Le problème avec les scripts wrapper est que vous vous retrouvez avec deux processus, un parent et un enfant. Voir le prochain défaut ...

  1. supervisord ne gère pas les processus enfants

Si votre programme démarre un processus enfant, supervisord ne le détectera pas. Si le processus parent meurt (ou s'il est redémarré à l'aide de supervisorctl), les processus enfants continuent de fonctionner mais seront "adoptés" par le processus init et continueront de fonctionner. Cela peut empêcher l'exécution future de votre programme ou consommer des ressources supplémentaires. Les options de configuration récentes stopasgroup et killasgroup sont censées résoudre ce problème, mais n'ont pas fonctionné pour moi.

  1. supervord n'a pas de gestion des dépendances - voir # 122

J'ai récemment installé squid avec qlproxy. qlproxyd doit commencer en premier sinon le calmar peut échouer. Même si les deux programmes étaient gérés avec un superviseur, il n'y avait aucun moyen de garantir cela. J'avais besoin d'écrire un script de démarrage pour squid qui l'a fait attendre le processus qlproxyd. L'ajout du script de démarrage a entraîné le problème de processus orphelin décrit dans la faille 2

  1. supervisord ne vous permet pas de contrôler le délai entre les étoiles

Parfois, lorsqu'un processus ne démarre pas (ou se bloque), c'est parce qu'il ne peut pas accéder à une autre ressource, probablement en raison d'une oscillation du réseau. Le superviseur peut être configuré pour redémarrer le processus plusieurs fois. Entre les redémarrages, le processus entrera dans un état "BACKOFF" mais il n'y a pas de documentation ou de contrôle sur la durée du backoff.

Dans sa défense, le superviseur répond à nos besoins 80% du temps. La configuration est raisonnable et la documentation assez bonne.

34
cressie176

Si vous souhaitez également surveiller les ressources, vous devez vous contenter de monit. En plus de simplement vérifier si un processus est en cours d'exécution (disponibilité), monit peut également effectuer des vérifications de l'utilisation des ressources (performances, utilisation de la capacité), des niveaux de charge et même des vérifications de sécurité de base (somme md5 d'un fichier bianry, fichier de configuration, etc.). Il a une configuration basée sur des règles qui est assez facile à comprendre. Il existe également de nombreuses configurations prêtes à l'emploi: http://mmonit.com/wiki/Monit/ConfigurationExamples

Monit nécessite des processus pour créer des fichiers PID, ce qui peut être un défaut, car si un processus ne crée pas de fichier pid, vous devez créer des wrappers. Voir http://mmonit.com/wiki/Monit/FAQ#pidfile

Supervord, d'autre part, est plus lié à un processus, il le génère lui-même. Il ne peut effectuer aucune vérification basée sur les ressources en tant que monit. Il a une belle CLI servicectl et une interface graphique Web.

30
Darek