Bilanciamento del carico di un server UDP


10

Ho un server udp, è una parte centrale nel mio processo aziendale. per gestire i carichi che mi aspetto nell'ambiente di produzione probabilmente avrò bisogno di 2 o 3 istanze del server. Il server è quasi interamente senza stato, raccoglie principalmente dati e il livello sopra di esso sa come gestire la quantità minima di dati non aggiornati che possono derivare dalle istanze del server multiplo.

La mia domanda è: come posso implementare il bilanciamento del carico tra i server? Preferirei distribuire le richieste nel modo più uniforme possibile tra i server. Vorrei anche avere una certa fedeltà, intendo se il client X è stato instradato al server y, quindi desidero che tutte le successive richieste di X passino al server Y, purché sia ​​ragionevole e non sovraccarichi Y.

A proposito, è un sistema .NET ... cosa consiglieresti?


lo stato è interno ai server, non una transazione di qualche tipo. lo stato sono alcuni dati che i server aggregano dai dati che ricevono ed è eseguibile una query con un semplice servizio Web WCF. L'applicazione si basa su UDP e, sebbene non sia d'accordo con la decisione, è "Above my pay grade"

Attualmente sto provando il bilanciamento del carico di massa di MS, funziona bene, fa la fedeltà fuori dalla scatola, ma genera rumore su tutta la rete ...

Inoltre nessun DNS ... Oh ed è un protocollo completamente in costume.


Solo una nota per riferimento futuro: in molti casi le domande possono essere spostate tra i siti di stackexchange da moderatori e utenti di alta reputazione. Questo aiuta a preservare tutte le risposte già inserite, quindi di solito è meglio che ripubblicare da soli (a meno che non ci siano risposte, nel qual caso eliminare la vecchia domanda in modo che nessuno le risponda accidentalmente). Se sei d'accordo con un suggerimento per spostarti, aggiungi un commento in tal senso e (se possibile) contrassegna il tuo post per l'attenzione del moderatore e il post dovrebbe finire spostato per te.
bdonlan,

Risposte:


4

Ho un server udp, il [...] server è quasi interamente senza stato [...] ha una certa fedeltà, intendo se il client X è stato indirizzato al server y, quindi voglio che tutte le successive richieste di X passino al server Y, come purché sia ​​ragionevole e non sovraccarichi Y.

Quindi, stai utilizzando un protocollo applicativo non divulgato che mantiene un certo stato dell'applicazione e funziona su UDP? Stai andando in una direzione difficile. UDP non è un trasporto di dati affidabile, questo è tutto il punto - per un trasporto di dati affidabile vedi il suo amico TCP popolare. L'unico modo per ottenere la "fedeltà" è disporre di un proxy di bilanciamento del carico che comprenda il protocollo del livello dell'applicazione e che sappia quale sia lo stato corrente dell'applicazione e possa agire di conseguenza.

Vedo 3 approcci che si avvicinano al fornire ciò che cerchi:

  • Distribuire staticamente le connessioni in entrata su 3 indirizzi IP, in base all'indirizzo IP di origine (utente finale). In questo modo un determinato utente verrà sempre indirizzato allo stesso server. La maggior parte dei firewall professionali può farlo per te. Potrebbe essere necessario rendere i 3 server altamente disponibili da soli, poiché la maggior parte dei firewall non esegue controlli di integrità del back-end per te.

  • Usa DNS e usa DNS Round Robin, come già suggerito da Matt Simmons.

  • Utilizzare il bilanciamento del carico di rete (NLB) incorporato di Windows . Onestamente, non so come andrebbe a finire lo scenario di failover con NLB e il tuo servizio semi-stateful basato su UDP - dovresti indagare tu stesso, in base a come gestisce lo stato della tua applicazione. Tra i lati positivi, NLB è molto facile da configurare, gratuitamente con la licenza di Windows, maturo e ben funzionante.


ho modificato la mia domanda
Hellfrost,

6

Linux Virtual Server è un server altamente scalabile e altamente disponibile costruito su un cluster di server reali. LVS ha supportato il protocollo UDP e l'algoritmo di hash di origine (utilizzato quando si desidera che un client appaia sempre sullo stesso realserver).

Uso LVM per bilanciare DNS (rr), SIP (sh).


4

Interessante. La maggior parte del software proxy che ho visto è certamente basato su TCP.

La maggior parte del bilanciamento del carico specifico di UDP che ho visto nella mia scarsa esperienza è stata basata sul DNS (ad esempio: time server, server DNS, ecc.). Esiste un modo per fornire più record A? Se ciò funzionasse, il normale Round Robin DNS garantirebbe una distribuzione equa delle richieste (probabilmente abbastanza equa, comunque) e la memorizzazione nella cache del client garantirebbe il mantenimento della fedeltà (supponendo che si stia utilizzando una piattaforma basata su cache sul lato client).


nessun DNS.
Hellfrost,

2

È possibile utilizzare qualsiasi tipo di bilanciamento del carico per eseguire questa operazione, sia hardware che software, è possibile scegliere tra diversi bilanciatori del carico in base alle proprie esigenze.

Bilanciamento del carico di livello 3: caricherà il bilanciamento del carico solo osservando l'IP in entrata e gli IP back-end disponibili, questo tipo di bilanciamento del carico assicurerà la viscosità inviando sempre lo stesso indirizzo IP in entrata allo stesso back-end, sebbene questo tipo di strategia possa sovraccaricarne uno dei backend se molti client provengono dallo stesso IP (sia esso un proxy o un gateway aziendale)

Bilanciamento del carico di livello 7 : un bilanciamento del carico di livello 7 non solo si bilancerà come bilanciatore di livello 3, ma esaminerà anche il contenuto del pacchetto, il che vi darà molta più flessibilità per le vostre politiche di bilanciamento.

Considerando che stai usando UDP entrambi i bilanciatori dovrebbero dare una buona prestazione, anche l'ispezione approfondita dei pacchetti in UDP è un po 'più limitata rispetto a TCP (solo per motivi di protocollo).

A seconda del budget, è possibile iniziare utilizzando un bilanciamento del carico software (ad esempio linux + IPVS) e quindi iniziare a salire su bilanciatori del carico hardware come quelli offerti da Cisco o Netapp


-1 per la parte L7. Un bilanciamento del carico di livello / livello 7 funziona a livello di applicazione, ma poiché OP utilizza UDP, non utilizza un semplice vecchio HTTP e non ha rivelato quale applicazione ha sta utilizzando. Non possiamo sapere che esiste un bilanciamento del carico L7 per il protocollo che OP sta utilizzando.
Jesper M,

1
Stavo solo commentando le sue opzioni nei sistemi di bilanciamento del carico e non sappiamo cosa stia usando su UDP, penso che tu lo stia tagliando troppo;)
lynxman

C'è qualcosa tra NLB / linux e Cisco / netapp: i loadbalancer KEMP. Puoi ottenerne un'edizione virtuale che non costa tonnellate di denaro, la stiamo usando e siamo molto felici.
pauska,

2

NGINX open source e la piattaforma di distribuzione delle applicazioni, NGINX Plus ora supporta il bilanciamento del carico UDP. La nuova funzionalità si basa sulle nostre attuali funzionalità TCP e HTTP, rendendo NGINX un frontend potente, facile da usare e coerente per una gamma ancora più ampia di applicazioni e dispositivi Internet.

Disponibile nella versione nginx-1.9.13

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.