bilanciamento del carico nel cluster nulla condiviso

4

Ho un sistema in cui il carico è distribuito tra i nodi del cluster e una volta che un'entità viene assegnata a un nodo particolare, viene portata al completamento solo attraverso quel nodo (la distribuzione viene salvata in una tabella). Se il nodo proprietario non riesce, il nodo gestore può riassegnarlo.

Si desidera che una volta che qualsiasi nodo si unisce al cluster, esso prende parte del carico dagli altri membri. Ciò che rende questo difficile è che le entità vengono continuamente aggiornate dai nodi proprietari, rendendo così difficile questa riassegnazione. Qualche idea su come rendere possibile questa riassegnazione senza interrompere i nodi in esecuzione. Capisco che questo dipenda molto dall'implementazione ma vorrei sapere cosa ne pensi.

L'entità viene assegnata ai nodi attraverso una coda a cui tutti i nodi si registrano come listener.

    
posta user2599052 20.10.2016 - 18:05
fonte

2 risposte

3

Personalmente non mi piace un approccio self-service, IMHO è molto più difficile gestire in modo affidabile la distribuzione dei compiti tra i nodi con un'intelligenza distribuita poiché la logica locale non ha la visione globale del sistema per le sue decisioni. Ridistribuire le entità quando vengono aggiunti nuovi nodi è solo un esempio.

L'apparente scalabilità del sistema che avrebbe potuto essere la ragione per scegliere tale approccio è solo un'illusione - la necessità di un registro centralizzato della proprietà ne è un indicatore, gestirlo in modo affidabile in maniera distribuita non è un compito banale, i glitch potrebbero causare lavori bloccati / dimenticati / persi. Il recupero degli errori è difficile, il nodo del gestore centralizzato è ancora necessario poiché l'intelligence locale potrebbe scomparire.

In ogni modo ...

Da quando lo hai menzionato

once an entity is assigned to particular node, it is taken to completion through that node only

la chiave per consentire ai nuovi nodi di prelevare parte del carico complessivo è quella di non distribuire le entità ai nodi finché non sono in grado di avviarsi immediatamente e completare la loro elaborazione comodamente all'interno delle loro capacità di caricamento . In altre parole, non creare code di attesa locali per ogni nodo poiché le entità potrebbero essere in attesa mentre altri nodi potrebbero facilmente elaborarle immediatamente. E non sovraccaricare i nodi solo per mantenere piccoli i tempi di attesa. Mantenere le entità non assegnate le rende disponibili per ogni nodo da raccogliere: una singola coda di attesa per il sistema.

Per quanto riguarda il bilanciamento del carico tra i nodi, è importante riflettere il carico del nodo nella logica di distribuzione locale. Un modo per ottenerlo senza conoscere con precisione i carichi di tutti gli altri nodi nel sistema è quello di "codificare" il carico del nodo locale nella frequenza di polling della coda in attesa.

Ad esempio, un nodo che ha già 3 entità assegnate controlla le entità disponibili una volta ogni 3 secondi, mentre un nodo con 10 entità assegnate esegue il polling solo una volta ogni 10 secondi. Ciò consente ai nodi con carichi più leggeri di raccogliere le entità più velocemente, raggiungendo così gli altri nodi: un nodo appena aggiunto sarebbe in grado di raccogliere 4 entità nello stesso intervallo in cui un nodo che sta già processando 10 entità potrebbe prenderne solo uno. Il carico complessivo del sistema verrebbe quindi automaticamente bilanciato su tutti i nodi disponibili (quando tutti i nodi raggiungono lo stesso tasso di polling).

    
risposta data 21.10.2016 - 13:41
fonte
1

Se le nuove attività arrivano spesso e vengono elaborate rapidamente, il modo più semplice / migliore per popolare un nuovo nodo nel cluster è semplicemente attendere e lasciare che il nodo gestore assegni le attività al nodo meno occupato. Ecco come funzionano i bilanciatori del carico di fronte ai server Web.

Se le attività sono troppo grandi / troppo lunghe perché ciò funzioni correttamente, una semplice opzione potrebbe essere che il nodo gestore invii un messaggio ad alcune delle attività più giovani per fallire / uscire / terminare. Il codice di pianificazione li riassegnerebbe quindi al nodo meno occupato.

Se i compiti sono troppo grandi / disordinati per fare una di queste cose, penserei seriamente di ridefinire i compiti per renderli più piccoli piuttosto che cercare di capire come spostarli da un nodo all'altro in qualsiasi punto arbitrario nella loro esecuzione.

È più facile cambiare un pneumatico quando l'auto è ferma.

    
risposta data 20.10.2016 - 18:12
fonte

Leggi altre domande sui tag