Como dividir o trabalho em uma rede de computadores?

11

Imagine um cenário da seguinte maneira: digamos que você tenha um computador central que gera muitos dados. Esses dados devem passar por algum processamento, que infelizmente leva mais tempo do que para gerar. Para que o processamento seja atualizado em tempo real, conectamos mais computadores escravos.

Além disso, devemos levar em conta a possibilidade de os escravos saírem da rede no meio do trabalho, além de serem adicionados escravos adicionais. O computador central deve garantir que todos os trabalhos sejam concluídos de maneira satisfatória e que os trabalhos descartados por um escravo sejam retransmitidos para outro.

A principal questão é: que abordagem devo usar para conseguir isso?

Mas talvez o seguinte me ajude a chegar a uma resposta: Existe um nome ou padrão de design para o que estou tentando fazer?

De que domínio do conhecimento eu preciso para atingir o objetivo de fazer com que esses computadores conversem entre si? (por exemplo, será suficiente um banco de dados, do qual tenho conhecimento, ou isso envolverá soquetes, dos quais ainda tenho conhecimento?)

Existem exemplos desse sistema? A questão principal é um pouco geral, por isso seria bom ter um ponto de partida / ponto de referência.

Observe que estou assumindo restrições de c ++ e windows para que as soluções que apontam nessa direção sejam apreciadas.

Morpork
fonte
1
Procure sistemas de filas ou fluxos de trabalho, exemplos: aws.amazon.com/sqs en.wikipedia.org/wiki/Message_queue etc. O sistema de filas pode cuidar da distribuição, verificação e reatribuição.
Luc Franken
2
O termo que você está procurando é paralelização . Antes de seguir esse caminho, verifique se o problema pode ser resolvido em paralelo (por exemplo, o resultado do item n não depende do resultado do item n-1 ).
Blrfl
Olhe para BOINC
@ Blrfl Acho que a paralelização geralmente não está associada a isso, a paralelização geralmente está associada à execução multithread ou multiprocessos em uma única máquina usando múltiplos núcleos / processadores ou execução simultânea na mesma máquina. A computação distribuída é o que ele está se referindo e, em sua descrição, não tem garantias de simultaneidade, apenas garantias de assincronia (ou seja, execução não determinística que pode ser simultânea, síncrona ou atrasada na fila)
Jimmy Hoffa
3
Estou surpreso que ninguém tenha mencionado hadoop.
Kevin

Respostas:

12

Existem exemplos desse sistema?

Sim. Esse padrão é conhecido como computação distribuída (ou programação distribuída ou qualquer palavra legal que você queira colocar após a distribuição). Minha sugestão será não criar isso internamente antes de procurar outras soluções. Você pode olhar para esta pergunta de estouro de pilha para várias opções. E então tome uma decisão calculada.

Manoj R
fonte
3
Não esqueça a nova palavra favorita para isso: a nuvem ! ou computação em nuvem . Se você faz isso com seus próprios computadores, as pessoas os chamam de nuvem pessoal ou min nuvem . Bobagem de marketing, isso é conhecido como você disse como computação distribuída há anos, apenas lançando para fora para que o OP saiba onde ele lê sobre as coisas da nuvem que está falando exatamente sobre isso.
Jimmy Hoffa
3
@ JimmyHoffa: a palavra "nuvem" é usada com a mesma frequência para indicar que seus dados e o software usado para trabalhar com eles estão na Internet em algum lugar, em vez de na sua máquina local. E ainda outras vezes, isso significa que você está usando uma máquina virtual que é executada em um cluster em vez de um único host monolítico da VM; a vantagem óbvia são failovers transparentes de tempo de inatividade zero.
tdammers
2
@ tdammers verdade, mas não obstante o tipo de sistema descrito pelo OP é um dos muitos que utilizam o apelido de marketing da Cloud, além de como você apontou praticamente todo o resto. É isso que o torna um chavão, foi inventado sem definição para que as pessoas o aplicassem a toneladas de coisas diferentes, para que efetivamente significasse tudo e nada. Viva as palavras da moda.
Jimmy Hoffa
1
@ JimmyHoffa: É também o que faz mencionar a palavra "nuvem" aqui completamente não-construtiva.
tdammers
3
Poderia ser uma boa palavra para ser usada contra a gerência. "Qual é a sua solução para esse problema de processamento de dados?" "Bem, poderíamos distribuí-lo para uma rede de computadores e computá-los em paralelo." OLHAR VAZIO. "Podemos construir uma mini nuvem". "OKAY continuar"
Morpork
4

Conforme observado por outras respostas, esse campo é conhecido como computação distribuída , computação em grade , computação em cluster e computação de alto desempenho .

Deixe-me acrescentar a distinção de que, quando um sistema pode ser redimensionado após o início para corresponder à carga de trabalho, ele é considerado " elástico " e isso é diferente da computação em grade tradicional. Essa é uma das razões (não de marketing) para o termo " computação em nuvem ": o usuário não precisa planejar a capacidade, e o número e a localização das máquinas que executam a computação permanecem inexpressivos para ele como uma nuvem.

Além disso, o requisito de que o mestre reprograma as tarefas com falha é chamado de propriedade " tolerância a falhas " desse sistema. (Link obrigatório para este desenho animado )

Qual abordagem você deve usar para criar sua própria nuvem privada? Na minha ordem ou preferência:

  1. Não construa sua própria nuvem , use a infraestrutura fornecida por outras pessoas. A Amazon chama isso de nuvem privada virtual ; a Rackspace é apenas nuvem privada ; Tenho certeza que você pode encontrar outras ofertas e comparar.

  2. Não construa seu próprio mecanismo de computação distribuído , use o mecanismo fornecido por outras pessoas. Se você insistir em usar suas máquinas, use pelo menos o máximo de software possível, fornecido e testado por outras pessoas. Você pode usar o Hadoop a partir do C ++ através da interface Pipes ou de qualquer executável através da API de Streaming . Existe uma interface de Streaming semelhante no Spark .

  3. Não codifique todos os componentes do zero , use componentes da comunidade. Se, por algum motivo, você leu até agora e deseja implementar seus próprios componentes na nuvem, não inicie na biblioteca padrão do C ++. Os principais componentes que você precisará são:

    • um sistema de enfileiramento, conforme observado em um comentário , para enviar tarefas do mestre para os nós de processamento e para enviar confirmações de resultados dos nós de processamento para o mestre
    • um sistema de arquivos distribuído, para que os nós de processamento possam acessar os dados nos quais operar.

    Existem muitas alternativas para ambos. Para filas, o RabbitMQ possui um instalador do Windows, assim como o ZeroMQ . Para sistemas de arquivos distribuídos, eu realmente não tenho experiência suficiente no Windows: parece que você pode organizar compartilhamentos SMB em um DFS , mas não posso dar nenhuma dica aqui. Você pode pensar, como observado em outra resposta, usar um banco de dados distribuído como o MongoDB para os dados; ele roda no Windows .

Você também pode pensar em usar o MPI (geralmente a implementação do OpenMPI , geralmente por meio do wrapper Boost ), mas observe que os programas MPI não são elásticos nem tolerantes a falhas; você precisa cuidar disso sozinho (pelo menos, eles fornecem alguns mecanismos para conseguir isso ). É por isso que eu recomendaria a você primeiro avaliar uma estrutura de distribuição que possua essas propriedades.

logc
fonte