2009-03-19 4 views
6

Stavo osservando i moduli slave/pool e sembra simile a quello che desidero io , ma sembra anche che io abbia un singolo punto di errore nell'applicazione (se il nodo master va giù).Utilizzando Erlang, come devo distribuire il carico tra un cluster?

Il client ha una lista di gateway (per ragioni di fallback - tutti fanno la stessa cosa) che accettano le connessioni, e uno è scelto dal a caso dal client. Quando il client connette tutti i nodi, esaminare per vedere quale ha il minimo carico e quindi l'IP del server meno recente - viene reindirizzato al client. Il client quindi si connette a questo server e tutto viene eseguito lì.

In sintesi, desidero che tutti i nodi fungano da gateway e in realtà le richieste del client di elaborazione . Il bilanciamento del carico viene eseguito solo quando il client si collega inizialmente - tutti i pacchetti effettivi ed elaborati su il nodo "home" del client.

Come faccio?

risposta

6

Non so se questo modulo sia ancora implementato, ma quello che posso dire, il bilanciamento del carico è sopravvalutato. Quello che posso dire è che la scelta casuale dei posti di lavoro è la migliore, a meno che non si conoscano molte più informazioni su come il carico arriverà in futuro e nella maggior parte dei casi in realtà non lo è. Cosa hai scritto:

Quando il client si connette tutti i nodi vengono esaminati per vedere quale ha il minimo carico e quindi l'IP del server meno carico viene reindirizzato al client.

Come sapete che tutti i nodi meno caricati non verranno caricati più in alto solo nel prossimo ms? Come sai che tutti quei nodi carichi in alto che non includerai nell'elenco non faranno cadere il carico solo nei prossimi ms? Davvero non puoi saperlo a meno che tu non abbia un caso molto raro.

Basta misurare (o calcolare) le prestazioni del nodo e impostare la probabilità del nodo da scegliere dipende da esso. Scegli il nodo a caso indipendentemente dal carico corrente. Usalo come approccio iniziale. Quando lo imposti, puoi provare a creare un algoritmo più sofisticato. Scommetto che sarà molto difficile superare questo approccio iniziale. Fidati di me, molto difficile.

Modifica: Per essere più chiaro in un dettaglio sottile, ho il forte sostengo che non è possibile prevedere il carico futuro dal carico di corrente e storico, ma si consiglia di utilizzare le conoscenze sulle attività durate probabilità e la decomposizione corrente della vita di compito. Questo lavoro è così difficile da raggiungere.

1

Lo scopo di un albero di supervisione è gestire i processi non necessariamente inoltrare richieste. Non vi è alcun motivo per cui non è possibile utilizzare un codice diverso per inviare richieste direttamente ai membri dell'elenco dei processi disponibili. Vedere le funzioni pool: get_nodes o pool: get_node() per un modo per ottenere tali elenchi.

È possibile consentire al modulo pool di gestire la gestione dei processi (riavvio, monitoraggio e elaborazione dell'uccisione) e utilizzare un altro modulo per reindirizzare in modo trasparente le richieste al pool di processi. Forse stavi cercando piscine distribuite? Sarà difficile allontanarsi dal processo principale di erlang senza passare ai nodi distribuiti. L'intero sistema in esecuzione è praticamente un grande albero di supervisione.

0

Recentemente ho ricordato il modulo pg che consente di impostare i gruppi di processi. i messaggi inviati al gruppo vengono inviati ad ogni processo nel gruppo.Potrebbe portarti in qualche modo verso ciò che vuoi. dovresti scrivere il codice per decidere quale processo gestisce la richiesta in modo reale ma otterrai un pool senza un master che lo utilizza.