Come dividere il lavoro in una rete di computer?


11

Immagina uno scenario come segue: Supponiamo che tu abbia un computer centrale che genera molti dati. Questi dati devono essere sottoposti a qualche elaborazione, che purtroppo richiede più tempo rispetto alla generazione. Affinché l'elaborazione sia al passo con il tempo reale, colleghiamo più computer slave.

Inoltre, dobbiamo tenere conto della possibilità che gli slave abbandonino la rete a metà lavoro e che vengano aggiunti altri slave. Il computer centrale dovrebbe garantire che tutti i lavori siano stati completati in modo soddisfacente e che i lavori rilasciati da uno slave vengano riassegnati a un altro.

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

Ma forse quanto segue mi aiuterebbe ad arrivare a una risposta: esiste un nome o un modello progettuale per quello che sto cercando di fare?

Quale dominio di conoscenza ho bisogno per raggiungere l'obiettivo di far dialogare questi computer? (es. sarà sufficiente un database, di cui ho una certa conoscenza, o coinvolgerà socket di cui non ho ancora conoscenza?)

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

Nota: presumo i vincoli di c ++ e windows, quindi le soluzioni che puntano in quella direzione sarebbero apprezzate.


1
Cerca i sistemi di code o flussi di lavoro, esempi: aws.amazon.com/sqs en.wikipedia.org/wiki/Message_queue eccetera. Il sistema di coda può occuparsi della distribuzione, del controllo e della riassegnazione.
Luc Franken,

2
Il termine che stai cercando è parallelizzazione . Prima di proseguire su questa strada, assicurati che il tuo problema possa effettivamente essere risolto in parallelo (ad esempio, il risultato per l'articolo n non dipende dal risultato per l'articolo n-1 ).
Blrfl

Guarda boinc

@Blrfl Penso che la parallelizzazione non sia solitamente associata a questa, la parallelizzazione è solitamente associata all'esecuzione multi-thread o multi-processo su una singola macchina utilizzando più core / processori o l'esecuzione simultanea sulla stessa macchina. Il calcolo distribuito è ciò a cui si riferisce e nella sua descrizione non ha garanzie di concorrenza, ma solo garanzie di asincronia (vale a dire l'esecuzione non deterministica che può essere simultanea, sincrona o ritardata in coda)
Jimmy Hoffa

3
Sono sorpreso che nessuno abbia menzionato hadoop.
Kevin

Risposte:


12

Ci sono esempi di tale sistema?

Sì. Questo modello è noto come calcolo distribuito (o programmazione distribuita o qualunque parola interessante che si desidera mettere dopo distribuito). Il mio suggerimento sarà di non costruirlo internamente prima di esaminare altre soluzioni. Puoi guardare questa domanda di overflow dello stack per varie opzioni. E poi prendi una decisione calcolata.


3
Non dimenticare la nuova parola preferita per questo: il cloud ! o cloud computing. Se lo fai con i tuoi computer, le persone li chiamano cloud personale o mini cloud . Contrassegnando le assurdità, questo è noto come hai detto come computer distribuito per anni, semplicemente lanciando là fuori per l'OP per sapere dove legge sulle cose del cloud sta parlando esattamente di questo.
Jimmy Hoffa,

3
@JimmyHoffa: la parola "nuvola" è usata altrettanto spesso per indicare che i tuoi dati e il software che usi per lavorare sono su Internet da qualche parte anziché sul tuo computer locale. Eppure altre volte, significa che stai usando una macchina virtuale che gira su un cluster piuttosto che su un singolo host di macchine virtuali monolitico; l'ovvio vantaggio sono i failover trasparenti a zero downtime.
martedì

2
@tdammers vero, ma nondimeno il tipo di sistema descritto dall'OP è uno dei tanti che utilizzano il moniker di marketing del Cloud, insieme a come hai fatto notare praticamente tutto il resto. Questo è ciò che lo rende una parola d'ordine, è stato inventato senza definizione, quindi le persone lo hanno applicato a tonnellate di cose diverse, quindi significa effettivamente tutto e niente. Evviva per le parole d'ordine.
Jimmy Hoffa,

1
@JimmyHoffa: è anche ciò che rende la menzione della parola "nuvola" qui completamente non costruttiva.
martedì

3
Potrebbe essere una buona parola da usare contro la direzione. "Qual è la tua soluzione a questo problema di elaborazione dei dati?" "Bene, potremmo distribuirlo a una rete di computer e calcolarli in parallelo." LOOK IN BIANCO. "Possiamo costruire un mini Cloud." "OKAY CONTINUA"
Morpork,

4

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

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

Inoltre, il requisito che il master riprogrammi le attività non riuscite viene chiamato proprietà " tolleranza agli errori " di quel sistema. (Link obbligatorio a questo fumetto )

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

  1. Non creare il tuo cloud , usa l'infrastruttura fornita da altri. Amazon chiama questo Virtual Private Cloud , Rackspace solo 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 si insiste sull'uso delle proprie macchine, utilizzare almeno il maggior numero possibile di software fornito e testato da altri. Puoi usare Hadoop da C ++ tramite l' interfaccia Pipes o da qualsiasi eseguibile tramite l' API Streaming . Esiste un'interfaccia Streaming simile su Spark .

  3. Non codificare tutti i componenti da zero , utilizzare i componenti della community. Se, per qualche motivo, hai letto finora e desideri implementare i tuoi componenti cloud, non iniziare dalla libreria standard di 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 inviare conferme dei risultati dall'elaborazione di 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 indicato 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 , di solito attraverso il suo wrapper Boost ), ma nota che i programmi MPI non sono né elastici né tolleranti ai guasti di per sé; devi prenderti cura di te stesso (almeno forniscono alcuni meccanismi per raggiungere questo obiettivo ). Ecco perché ti consiglierei prima di valutare un framework per la distribuzione che abbia tali proprietà.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.