2012-08-28 45 views
30

我们有一个自定义的安装程序,其中有几个守护程序(web应用程序+后台任务)正在运行。我正在研究如何使用服务来帮助我们监控这些守护进程,并在资源消耗超过一定水平时重新启动它们。使用supervisord优于monit的优势

我会很感激任何有关何时比其他人更好的见解。正如我所了解的,当supervisord启动一个子进程时,monit将启动一个新进程。这种方法的优点和缺点是什么?

我也将用暴发户监视monit或supervisord本身。 webapp部署将使用capistrano完成。

谢谢

回答

28

如果你想另外监视资源,你应该解决monit。除了仅检查进程是否在运行(可用性)之外,monit还可以对资源使用情况(性能,容量使用情况),负载级别甚至基本安全检查(bianry文件的md5sum,配置文件等)进行一些检查。它有一个很容易理解的基于规则的配置。还有很多随时可用的配置:http://mmonit.com/wiki/Monit/ConfigurationExamples

Monit需要进程来创建PID文件,这可能是一个缺陷,因为如果一个进程不创建pid文件,你必须创建一些包装。请参阅http://mmonit.com/wiki/Monit/FAQ#pidfile

另一方面,Supervisord更多地绑定到一个进程,它自己产生它。它不能将任何基于资源的检查视为monit。它有一个很好的CLI servicectl和一个Web GUI。

+1

创建这样的包装并不是一个真正的问题 - 如果您正在运行监控软件,那么通常您可以对文件系统进行一些控制。只需要创建一个简单的脚本。 +1为了很好的解释。 –

+3

@xavier不同意,包装脚本是SPOF的一部分,并不是每一个deamon都可以被确定性包装,想到一些java的东西,例如 – Darek

+2

@Dārayavahuštdi,你有一个有效的点,但是用supervisord则是另一种方式:守护神,而supervisord需要一切留在前台。尽管如此,为monit写封装看起来更直截了当。 http://supervisord.org/subprocess.html#nondaemonizing-of-subprocesses http://www.mmonit.com/wiki/Monit/FAQ#pidfile – Amir

29

我没有使用monit,但是supervisord有一些明显的缺陷。

  1. 计划应在前台

这意味着你不能只执行/etc/init.d/apache2开始运行。大多数情况下,您只需编写一行内容即可。 “源/ etc/apache2/envvars & & exec/usr/sbin/apache2 -DFOREGROUND”但有时您需要自己的包装脚本。包装脚本的问题是,你最终有两个过程,一个父母和一个孩子。请参阅下一个缺陷......

  • supervisord不管理子进程
  • 如果你的程序启动子进程,supervisord不会检测这一点。如果父进程死亡(或者使用supervisorctl重启),子进程将继续运行,但会被init进程“采纳”并保持运行。这可能会阻止您的程序未来的调用运行或消耗额外的资源。最近的配置选项stopasgroup和killasgroup应该可以解决这个问题,但对我来说并不适用。

  • supervisord没有依赖关系管理 - 见#122
  • 我最近与qlproxy设置鱿鱼。 qlproxyd需要先启动,否则squid可能会失败。即使这两个节目都是用supervisord管理的,也无法确保这一点。我需要为鱿鱼写一个启动脚本,让它等待qlproxyd进程。添加开始脚本导致缺陷描述的孤立进程问题2

  • supervisord不允许你控制startretries之间的延迟
  • 有时,当一个进程失败开始(或崩溃),这是因为它可能无法访问另一个资源,可能是由于网络抖动。 Supervisor可以设置为多次重新启动该进程。在重新启动之间,进程将进入“BACKOFF”状态,但没有文档或控制回退的持续时间。

    在其辩护主管确实满足我们80%的时间需要。配置是明智的,文件相当不错。

    +2

    好的答案。所以,你基本上喜欢supervisord,但它并不总是每个工作的正确工具。 –

    +0

    我喜欢你的答案,因为你绝对显示你的经验,并试图设置它来满足你的需求(这可能与我的相同)。 –