2012-07-10 25 views
3

我正在编写运行一堆不同程序的软件(通过twisted'stwistd);那就是N种各种各样的守护进程必须跨越多台机器启动。如果我手动执行此操作,我将在涉及的机器上运行诸如twistd foo_workertwistd bar_worker等命令。启动和停止群集中的进程

基本上会有一个机器列表和我需要它们运行的​​守护进程。另外,当需要时,我需要关闭它们。

如果我是从头开始编写这个,我会写会用通过网络进行身份验证的管理员客户端可以访问以下功能在每台机器上永久运行在集群中的“产卵”守护:

  • 用给定的命令行启动一个进程。返回一个句柄来管理它。
  • 杀死给定句柄的进程。
  • (可选)查询类似CPU时间的东西给定句柄。

对上述程序进行编程将是相当微不足道的,但我无法想象这是一个新问题。当然,现在有解决方案来做到这一点?然而,我确实缺乏服务器管理的经验,甚至不知道相关术语是什么。

在Linux集群上有什么现有的方法可以做到这一点,涉及到哪些重要术语?欢迎Python特定解决方案,但不是必需的。

另一种说法是:给定一个局域网中的一堆机器,如何以编程方式将它们作为群集工作?

回答

2

最熟悉的和普遍的方法就是使用ssh。要使您自动化,可以使用fabric

要在所有主机上启动foo_worker

$ fab all_hosts start:foo_worker 

要将主机的特定列表上停止bar_worker

$ fab -H host1,host2 stop:bar_worker 

下面是一个例子fabfile.py

from fabric.api import env, run, hide # pip install fabric 

def all_hosts(): 
    env.hosts = ['host1', 'host2', 'host3'] 

def start(daemon): 
    run("twistd --pid %s.pid %s" % (daemon, daemon)) 

def stop(daemon): 
    run("kill %s" % getpid(daemon)) 

def getpid(daemon): 
    with hide('stdout'): 
     return run("cat %s.pid" % daemon) 

def ps(daemon): 
    """Get process info for the `daemon`.""" 
    run("ps --pid %s" % getpid(daemon)) 

There are a number of ways to configure host lists in fabric, with scopes varying from global to per-task, and it’s possible mix and match as needed.

为了简化流程管理,你可以写INITD的守护程序脚本特定主机上(和运行service daemon_name start/stop/restart),或使用supervisord(和运行supervisorctl例如,supervisorctl stop all)。要控制“什么安装在哪里”并以集中方式推送配置,可以使用类似puppet的配置。

+0

现在,这就是我称之为高质量的答案。谢谢! – porgarmingduod 2012-07-10 16:19:26

2

通常的工具是批处理队列系统,比如SLURM,SGE,Torque/Moab,LSF等等。

1

马戏团:

文档: http://docs.circus.io/en/0.5/index.html

代码:从文档 http://pypi.python.org/pypi/circus/0.5

摘要:

马戏团是一个过程&插座经理。它可以用来监视和控制进程和套接字。

马戏团可以通过命令行界面或编程方式通过其python API驱动。

它分享了Supervisord,BluePill和Daemontools的一些目标。如果您对马戏团带来的其他项目相比感到好奇,请阅读为什么我应该使用马戏团而不是X?

马戏团是使用ZeroMQ http://www.zeromq.org/设计的。请参阅设计了解更多详情。