【问题标题】:Efficient layout for a distributed python server?分布式python服务器的高效布局?
【发布时间】:2010-10-01 06:16:59
【问题描述】:

如果我想让 Python 分布在多台计算机上的多个处理器上,我最好的方法是什么?如果我有 3 个八核服务器,那意味着我必须运行 24 个 python 进程。我将使用multiprocessing library,并共享对象,看起来最好的主意是使用管理器。我希望所有节点作为一个大进程一起工作,所以一个管理器是理想的,但这会给我的服务器带来单点故障。有更好的解决方案吗?复制经理的对象存储是个好主意吗?

另外,如果经理要进行所有数据库查询,将它与数据库放在同一台机器上是否有意义?

【问题讨论】:

  • 您必须从一台服务器启动程序。你打算如何让一个进程在另一台服务器上运行?

标签: python multiprocessing


【解决方案1】:

似乎您的问题的要点是如何共享对象和状态。更多信息,特别是大小、频率、变化率和数据来源,将非常有帮助。

对于跨机器共享内存,您可能想查看memcached。您可以存储数据并从任何工作进程快速轻松地访问它。

如果您的场景更像是一个简单的作业分配模型,您可能希望查看排队服务器 - 将您的作业及其相关数据放入队列中,并让工作人员从队列中提取作业。 Beanstalkd 可能是队列的一个不错的选择,这里有一个getting started 教程。

【讨论】:

    【解决方案2】:

    您在分配流程时面临两个主要挑战:

    1. 协调正在拆分、分发和重新收集的工作(您可能会说映射和缩减)
    2. 在相互依赖的进程之间共享正确的实时数据

    #1 的答案在很大程度上取决于您正在执行的处理类型。如果它很容易进行水平分区(即您可以将较大的任务拆分为多个独立较小的任务),那么像HAProxy 这样的负载均衡器可能是分散负载的便捷方式。

    如果任务不能简单地水平分区,我会先看看现有的工具,比如Hadoop,是否适合我。分布式任务管理是一项难以完成的任务,而轮子已经被发明出来了。

    至于#2,在进程之间共享状态,如果你共享一个绝对最小值,然后只以明确定义的方式共享它,你的生活会容易得多。我个人会使用由您选择的 RDBMS 支持的SQLAlchemy,即使是最小的任务。查询界面功能强大且轻松无痛,适用于小型和大型项目。

    【讨论】:

    【解决方案3】:

    我认为更多信息会有所帮助,例如您正在提供什么样的服务、您将使用什么样的数据库、您有什么样的延迟/吞吐量要求等等。很多东西取决于您的要求:例如.如果您的系统是一个典型的服务器,它有很多读取而不是很多写入,并且您在读取稍微陈旧的数据方面没有问题,您可以对每个进程的缓存执行本地读取,并且只将写入推送到数据库,将结果广播回缓存。

    首先,我认为这取决于经理必须做什么。毕竟,如果您的系统是如此微不足道,以至于在没有灾难性硬件故障的情况下不会发生故障,那么担心单点故障可能毫无意义。但是如果你只有一个,把它和数据库放在同一台机器上是有意义的。你减少了延迟,如果一个没有另一个就宕机了,你的系统就无法生存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 2020-03-20
      • 2012-12-19
      相关资源
      最近更新 更多