【问题标题】:Starting and stopping processes in a cluster启动和停止集群中的进程
【发布时间】:2012-07-10 11:23:26
【问题描述】:

我正在编写运行大量不同程序的软件(通过twisted'stwistd);也就是说,必须在多台机器上启动 N 个不同类型的守护进程。如果我手动执行此操作,我将在相关机器上运行twistd foo_workertwistd bar_worker 等命令。

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

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

  • 使用给定的命令行启动进程。返回一个句柄来管理它。
  • 终止给定句柄的进程。
  • (可选)查询给定句柄的 CPU 时间等内容。

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

有哪些现有方法可以在 linux 集群上执行此操作,以及涉及哪些重要术语?欢迎使用 Python 特定的解决方案,但不是必需的。

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

【问题讨论】:

    标签: python linux network-programming cluster-computing


    【解决方案1】:

    最熟悉和通用的方式就是使用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 之类的东西。

    【讨论】:

    • 现在这就是我所说的高质量答案。谢谢!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      马戏团:

      文档: 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/ 设计的。有关详细信息,请参阅设计。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-25
        • 2021-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多