2009-01-13 4 views
2

Si je voulais que Python soit distribué sur plusieurs processeurs sur plusieurs ordinateurs, quelle serait ma meilleure approche? Si j'ai 3 serveurs à huit cœurs, cela voudrait dire que je devrais exécuter 24 processus python. J'utiliserais le multiprocessing library, et pour partager des objets, il semblerait que la meilleure idée serait d'utiliser un gestionnaire. Je veux que tous les nœuds fonctionnent ensemble comme un grand processus, donc un gestionnaire serait idéal, mais cela donnerait à mon serveur un point de défaillance unique. Y a-t-il une meilleure solution? La réplication du magasin d'objets d'un responsable serait-elle une bonne idée?Disposition efficace pour un serveur python distribué?

En outre, si le gestionnaire doit effectuer toutes les requêtes de base de données, est-il logique de l'avoir sur la même machine que la base de données?

+0

Vous devez démarrer le programme depuis un serveur. Comment envisagez-vous de faire fonctionner un processus sur un autre serveur? –

Répondre

3

Vous avez deux principaux défis dans la distribution des processus:

  1. coordination les travaux diviser, distribués et re-collectées (cartographiée et réduit, pourrait-on dire)
  2. Partage droit direct données entre processus co-dépendants

La réponse à # 1 dépendra beaucoup du type de traitement que vous faites. S'il est facilement partitionnable horizontalement (c'est-à-dire que vous pouvez diviser la plus grande tâche en plusieurs tâches plus petites), un équilibreur de charge tel que HAProxy pourrait être un moyen pratique de répartir la charge.

Si la tâche n'est pas partitionnable horizontalement, je commencerais par voir si des outils existants, tels que Hadoop, pourraient fonctionner pour moi. La gestion distribuée des tâches est une tâche difficile à accomplir, et la roue a déjà été inventée. Comme pour le n ° 2, en partageant l'état entre les processus, votre vie sera beaucoup plus facile si vous partagez un minimum absolu, et ensuite seulement le partager explicitement et de manière bien définie. J'utiliserais personnellement SQLAlchemy soutenu par votre RDBMS de choix pour même la plus petite des tâches. L'interface de requête est suffisamment puissante et sans douleur pour les petits et grands projets.

+0

Après le fait maintenant mais il ne pourrait pas blesser de mentionner [Parallel Python] (http://www.parallelpython.com/) –

3

Je pense que plus d'informations seraient utiles, sur le type de service que vous utilisez, le type de base de données que vous utiliseriez, le type de latence/débit requis, etc. Beaucoup de choses dépendent de vos besoins: par exemple. Si votre système est un serveur typique qui a beaucoup de lectures et pas beaucoup d'écritures, et que vous n'avez pas de problème avec la lecture de données légèrement obsolètes, vous pouvez effectuer des lectures locales contre un cache sur chaque processus et ne pousser que les écritures la base de données, la diffusion des résultats dans les caches. Pour commencer, je pense que cela dépend de ce que le gestionnaire doit faire. Après tout, s'inquiéter des points de défaillance uniques peut être inutile si votre système est si trivial que la panne ne se produira pas à court de panne matérielle catastrophique. Mais si vous en avez un, il est logique de l'avoir sur la même machine que la base de données. Vous réduisez la latence, et votre système ne peut pas survivre si l'un descend sans l'autre de toute façon.

+0

+1: Plus d'informations sont nécessaires. –

0

Semble l'essentiel de votre question est de savoir comment partager des objets et l'état. Plus d'informations, en particulier la taille, la fréquence, le taux de changement et la source des données seraient très utiles.

Pour la mémoire partagée entre machines, vous souhaitez probablement consulter memcached. Vous pouvez stocker vos données et y accéder rapidement et facilement depuis n'importe quel processus de travail.Si votre scénario est plutôt un simple modèle de distribution de travaux, vous pouvez consulter un serveur de files d'attente: placez vos travaux et leurs données associées dans une file d'attente et demandez aux utilisateurs de récupérer les travaux de la file d'attente. Beanstalkd est probablement un bon choix pour la file d'attente, et voici un tutoriel getting started.

Questions connexes