Comment diviser le travail sur un réseau d'ordinateurs?

11

Imaginez un scénario comme suit: Disons que vous avez un ordinateur central qui génère beaucoup de données. Ces données doivent passer par un certain traitement, qui prend malheureusement plus de temps que de générer. Pour que le traitement rattrape le temps réel, nous branchons plus d'ordinateurs esclaves.

De plus, nous devons prendre en compte la possibilité que des esclaves abandonnent le réseau en cours de travail ainsi que des esclaves supplémentaires ajoutés. L'ordinateur central doit s'assurer que tous les travaux sont terminés à sa satisfaction et que les travaux abandonnés par un esclave sont reclassés à un autre.

La question principale est: quelle approche dois-je utiliser pour y parvenir?

Mais peut-être que ce qui suit m'aiderait à trouver une réponse: y a-t-il un nom ou un modèle de conception dans ce que j'essaie de faire?

De quel domaine de connaissances ai-je besoin pour atteindre l'objectif de faire communiquer ces ordinateurs entre eux? (par exemple. une base de données, dont j'ai une certaine connaissance, sera-t-elle suffisante ou cela impliquera-t-il des sockets, dont je n'ai pas encore connaissance?)

Existe-t-il des exemples d'un tel système? La question principale est un peu générale donc il serait bon d'avoir un point de départ / point de référence.

Remarque Je suppose que les contraintes de C ++ et de Windows sont donc appréciées.

Morpork
la source
1
Recherchez les systèmes de file d'attente ou de workflow, exemples: aws.amazon.com/sqs en.wikipedia.org/wiki/Message_queue etcetera. Le système de file d'attente peut prendre en charge la distribution, la vérification et la réaffectation.
Luc Franken
2
Le terme que vous recherchez est la parallélisation . Avant de vous engager sur cette voie, assurez-vous que votre problème peut réellement être résolu en parallèle (par exemple, le résultat pour l'élément n ne dépend pas du résultat pour l'élément n-1 ).
Blrfl
Regardez boinc
@Blrfl Je pense que la parallélisation n'est généralement pas associée à cela, la parallélisation est généralement associée à une exécution multi-thread ou multi-processus sur une seule machine utilisant plusieurs cœurs / processeurs ou une exécution simultanée sur la même machine. L'informatique distribuée est ce à quoi il fait référence et dans sa description, il n'a pas de garanties de concurrence, seulement des garanties d'asynchronie (c'est-à-dire une exécution non déterministe qui peut être simultanée, synchrone ou retardée dans la file d'attente)
Jimmy Hoffa
3
Je suis surpris que personne n'ait mentionné hadoop.
Kevin

Réponses:

12

Existe-t-il des exemples d'un tel système?

Oui. Ce modèle est connu sous le nom d'informatique distribuée (ou programmation distribuée ou tout autre mot sympa que vous souhaitez mettre après distribution). Ma suggestion sera de ne pas construire cela en interne avant de chercher d'autres solutions. Vous pouvez regarder cette question de débordement de pile pour diverses options. Et puis prenez une décision calculée.

Manoj R
la source
3
N'oubliez pas le nouveau mot préféré pour cela: le cloud ! ou le cloud computing. Si vous le faites avec vos propres ordinateurs, les gens les appellent un cloud personnel ou un mini cloud . Marquer un non-sens, cela a été connu comme vous l'avez dit en tant qu'informatique distribuée pendant des années, jetant simplement là-bas pour que l'OP sache où il lit des informations sur le cloud dont il parle exactement.
Jimmy Hoffa
3
@JimmyHoffa: le mot "cloud" est tout aussi souvent utilisé pour indiquer que vos données ainsi que les logiciels que vous utilisez pour les utiliser se trouvent sur Internet quelque part au lieu de votre machine locale. Et encore d'autres fois, cela signifie que vous utilisez une machine virtuelle qui s'exécute sur un cluster plutôt qu'un seul hôte VM monolithique; l'avantage évident étant les basculements transparents sans interruption de service.
tdammers
2
@tdammers c'est vrai, mais néanmoins le type de système décrit par l'OP est l'un des nombreux à utiliser le surnom marketing du Cloud, ainsi que comme vous l'avez souligné pratiquement tout le reste. C'est ce qui en fait un mot à la mode, il a été inventé sans définition afin que les gens l'appliquent à des tonnes de choses différentes, ce qui signifie effectivement tout et rien. Hourra pour les mots à la mode.
Jimmy Hoffa
1
@JimmyHoffa: C'est aussi ce qui rend la mention du mot "cloud" ici complètement non constructive.
tdammers
3
Cela pourrait être un bon mot à utiliser contre la direction. "Quelle est votre solution à ce problème de traitement des données?" "Eh bien, nous pourrions le distribuer à un réseau d'ordinateurs et les calculer en parallèle." REGARD VIDE. "Nous pouvons construire un mini Cloud." "OKAY CARRY ON"
Morpork
4

Comme indiqué par d'autres réponses, ce domaine est connu sous le nom de calcul distribué, de calcul en grille, de calcul en grappe et de calcul haute performance .

Permettez-moi d'ajouter la distinction selon laquelle, lorsqu'un système peut être redimensionné après le démarrage pour correspondre à la charge de travail, il est dit « élastique », ce qui est différent du calcul en grille traditionnel. C'est l'une des raisons (non marketing) du terme " cloud computing ": l'utilisateur n'a pas besoin de planifier la capacité, et le nombre et l'emplacement des machines effectuant le calcul lui restent sans particularité en tant que cloud.

En outre, votre exigence selon laquelle le maître replanifie les tâches ayant échoué est appelée la propriété « tolérance aux pannes » de ce système. (Lien obligatoire vers ce dessin animé )

Quelle approche devez-vous utiliser pour créer votre propre cloud privé? Dans ma commande ou préférence:

  1. Ne construisez pas votre propre cloud , utilisez l'infrastructure fournie par d'autres. Amazon appelle ce Virtual Private Cloud , Rackspace juste Private Cloud ; Je suis sûr que vous pouvez trouver d'autres offres et comparer.

  2. Ne construisez pas votre propre moteur informatique distribué , utilisez le moteur fourni par d'autres. Si vous insistez pour utiliser vos machines, utilisez au moins autant de logiciels que possible fournis et testés par d'autres. Vous pouvez utiliser Hadoop depuis C ++ via l' interface Pipes ou depuis n'importe quel exécutable via l' API Streaming . Il existe une interface de streaming similaire sur Spark .

  3. Ne codez pas tous les composants à partir de zéro , utilisez des composants de la communauté. Si, pour une raison quelconque, vous avez lu jusqu'à présent et que vous souhaitez déployer vos propres composants cloud, ne commencez pas à partir de la bibliothèque standard de C ++. Les principaux composants dont vous aurez besoin sont:

    • un système de mise en file d'attente, comme indiqué dans un commentaire , pour envoyer des tâches du maître aux nœuds de traitement et pour envoyer des confirmations de résultats des nœuds de traitement au maître
    • un système de fichiers distribué, de sorte que les nœuds de traitement puissent accéder aux données sur lesquelles opérer.

    Il existe de nombreuses alternatives pour les deux. Pour la mise en file d'attente, RabbitMQ dispose d'un programme d'installation Windows, tout comme ZeroMQ . Pour les systèmes de fichiers distribués, je n'ai vraiment pas assez d'expérience sur Windows: il semble que vous puissiez organiser les partages SMB en DFS , mais je ne peux pas vous donner d'indice ici. Vous pourriez penser, comme indiqué dans une autre réponse, à utiliser une base de données distribuée telle que MongoDB pour les données; il fonctionne sous Windows .

Vous pouvez également penser à utiliser MPI (généralement l' implémentation OpenMPI , généralement via son enveloppe Boost ), mais notez que les programmes MPI ne sont ni élastiques ni tolérants aux pannes en soi; vous devez vous en occuper vous-même (au moins, ils fournissent certains mécanismes pour y parvenir ). C'est pourquoi je vous recommanderais d'abord d'évaluer un cadre de distribution qui possède de telles propriétés.

logc
la source