Come dividere il lavoro su una rete di computer?

11

Immagina uno scenario come segue: diciamo che hai un computer centrale che genera molti dati. Questi dati devono passare attraverso alcune elaborazioni, che purtroppo richiedono più tempo rispetto alla generazione. Per consentire all'elaborazione di raggiungere il tempo reale, colleghiamo altri computer slave.

Inoltre, dobbiamo prendere in considerazione la possibilità che gli schiavi escano dalla rete a metà lavoro e che vengano aggiunti ulteriori schiavi. Il computer centrale dovrebbe garantire che tutti i lavori siano completati in modo soddisfacente e che i lavori abbandonati da uno slave vengano ridistribuiti a un altro.

La domanda principale è: quale approccio dovrei usare per raggiungere questo obiettivo?

Ma forse il seguente potrebbe aiutarmi ad arrivare a una risposta: C'è un nome o modello di progettazione per quello che sto cercando di fare?

Quale dominio di conoscenza ho bisogno per raggiungere l'obiettivo di far dialogare questi computer tra loro? (ad esempio, un database, di cui ho una certa conoscenza, sarà sufficiente o questo coinvolgerà socket, di cui devo ancora avere conoscenza?)

Ci sono esempi di tale sistema? La domanda principale è un po 'generale, quindi sarebbe bene avere un punto di partenza / punto di riferimento.

Nota Sto assumendo i vincoli di c ++ e windows in modo che le soluzioni che puntano in quella direzione sarebbero apprezzate.

    
posta Morpork 02.01.2013 - 10:57
fonte

2 risposte

12

Are there any examples of such a system?

Sì. Questo modello è noto come calcolo distribuito (o programmazione distribuita o qualsiasi altra parola interessante che si desidera mettere dopo la distribuzione). Il mio suggerimento non sarà quello di costruire questo in-house prima di guardare ad altre soluzioni. Puoi consultare questa domanda di overflow dello stack per varie opzioni. E poi prendere una decisione calcolata.

    
risposta data 02.01.2013 - 12:27
fonte
4

Come notato da altre risposte, questo campo è stato conosciuto come computing distribuito , computing su griglia , cluster computing e calcolo ad alte prestazioni .

Consentitemi di aggiungere la distinzione che, quando un sistema può essere ridimensionato dopo l'avvio per abbinare il carico di lavoro, si dice che sia elastico ", e questo è diverso dal tradizionale grid computing. Questo è uno dei motivi (non di marketing) per il termine " cloud computing ": l'utente non ha bisogno di pianificare per capacità, e il numero e la posizione delle macchine che eseguono il calcolo restano senza caratteristiche come una nuvola.

Inoltre, il tuo requisito che il master ri-pianifica le attività fallite è chiamato la proprietà " tolleranza agli errori " di quel sistema . (Link obbligatorio a questo fumetto )

Quale approccio dovresti utilizzare per creare il tuo cloud privato? Nel mio ordine o preferenza:

  1. Non creare il tuo cloud , utilizza l'infrastruttura fornita da altri. Amazon chiama questo Virtual Private Cloud , Rackspace Private Cloud ; Sono sicuro che puoi trovare altre offerte e confrontare.

  2. Non costruire il tuo motore di calcolo distribuito , usa il motore fornito da altri. Se insisti a utilizzare le tue macchine, utilizza almeno il maggior numero possibile di software fornito e testato da altri. Puoi utilizzare Hadoop dal C ++ tramite l'interfaccia Interfaccia pipe o da qualsiasi eseguibile tramite Streaming API . Esiste una interfaccia di streaming simile su Spark .

  3. Non codificare tutti i componenti da zero , usa componenti dalla comunità. Se, per qualche motivo, hai letto fino ad ora e vuoi implementare i tuoi componenti cloud, non iniziare dalla libreria standard del C ++. I componenti principali di cui avrai bisogno sono:

    • un sistema di accodamento, come indicato in un commento , per inviare attività dal master ai nodi di elaborazione e per inviare conferme dei risultati dall'elaborazione dei nodi al master
    • un file system distribuito, in modo che i nodi di elaborazione possano accedere ai dati su cui operare.

    Ci sono molte alternative per entrambi. Per l'accodamento, RabbitMQ ha un programma di installazione di Windows, così come ZeroMQ . Per i filesystem distribuiti, non ho abbastanza esperienza su Windows: sembra che tu possa organizzare le condivisioni SMB in un DFS , ma non posso darti alcun suggerimento qui. Si potrebbe pensare, come notato in un'altra risposta, di utilizzare un database distribuito come MongoDB per i dati; funziona su Windows .

Potresti anche pensare di usare MPI (di solito l'implementazione OpenMPI , solitamente attraverso il suo Boost wrapper ), ma si noti che i programmi MPI non sono né elastici né fault tolerant di per sé; devi prenderti cura di te stesso (almeno forniscono alcuni meccanismi per raggiungere questo obiettivo ). Questo è il motivo per cui ti consiglierei innanzitutto di valutare un framework per la distribuzione che abbia tali proprietà.

    
risposta data 30.05.2014 - 12:47
fonte

Leggi altre domande sui tag