3

我正在编写运行一堆不同程序的软件(通过twisted's twistd);也就是说,必须在多台机器上启动 N 个不同类型的守护进程。如果我手动执行此操作,我将在所涉及的机器上运行诸如twistd foo_worker,之类的命令。twistd bar_worker

基本上会有一个机器列表,以及我需要它们运行的​​守护进程。此外,我需要在需要时将它们全部关闭。

如果我要从头开始编程,我会编写一个“spawner”守护程序,它将在集群中的每台机器上永久运行,并具有以下功能,可通过网络访问以供经过身份验证的管理员客户端使用:

  • 使用给定的命令行启动进程。返回一个句柄来管理它。
  • 杀死一个给定句柄的进程。
  • (可选)在给定句柄的情况下查询诸如 cpu 时间之类的东西。

对上述内容进行编程相当简单,但我无法想象这是一个新问题。确实有现有的解决方案可以做到这一点吗?但是,我确实缺乏服务器管理经验,甚至不知道相关术语是什么。

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

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

4

3 回答 3

2

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

于 2012-07-10T11:27:20.360 回答
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))

有多种方法可以在结构中配置主机列表,范围从全局到每个任务,并且可以根据需要混合和匹配。.

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

于 2012-07-10T13:02:59.903 回答
1

马戏团 :

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

代码: http: //pypi.python.org/pypi/circus/0.5

文档摘要:

Circus 是一个进程和套接字管理器。它可用于监视和控制进程和套接字。

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

它共享 Supervisord、BluePill 和 Daemontools 的一些目标。如果您对 Circus 与其他项目相比带来了什么感到好奇,请阅读我为什么要使用 Circus 而不是 X?。

Circus 是使用 ZeroMQ http://www.zeromq.org/设计的。有关详细信息,请参阅设计。

于 2012-07-10T11:27:29.313 回答