分布式python服务器的高效布局?

时间:2009-01-13 22:18:33

标签: python multiprocessing

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

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

3 个答案:

答案 0 :(得分:3)

我认为更多的信息会有所帮助,关于你服务的是什么,你使用什么类型的数据库,你有什么样的延迟/吞吐量要求等等。很多东西取决于你的要求:例如。如果你的系统是一个典型的服务器,它具有大量的读取而没有那么多的写入,并且你没有读取稍微过时的数据的问题,你可以对每个进程的缓存执行本地读取,并且仅将写入推送到数据库,将结果广播回缓存。

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

答案 1 :(得分:3)

分发流程有两个主要挑战:

  1. 协调正在拆分,分发和重新收集的工作(映射和缩小,你可能会说)
  2. 在共同依赖流程之间共享正确的实时数据
  3. #1的答案很大程度上取决于你正在做什么样的处理。如果它可以轻松地进行水平分区(即您可以将较大的任务拆分为几个独立的较小的任务),那么像HAProxy这样的负载均衡器可能是分散负载的便捷方式。

    如果任务不是简单的可水平分区,我首先要看看现有的工具,如Hadoop,是否适用于我。分布式任务管理是一项艰难的任务,而且已经发明了轮子。

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

答案 2 :(得分:0)

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

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

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