Load Balancing de um servidor UDP

10

Eu tenho um servidor udp, é uma parte central no meu processo de negócios. Para lidar com as cargas que estou esperando no ambiente de produção, provavelmente precisarei de 2 ou 3 instâncias do servidor. O servidor é quase totalmente sem estado, ele coleta principalmente dados, e a camada acima sabe como lidar com a quantidade mínima de dados obsoletos que podem surgir das várias instâncias do servidor.

A minha pergunta é, como posso implementar o balanceamento de carga entre os servidores? Eu preferiria distribuir os pedidos da forma mais uniforme possível entre os servidores. Eu também gostaria de ter alguma fidelidade, quer dizer, se o cliente X foi roteado para o servidor y, então eu quero que todos os pedidos subseqüentes do X venham para o servidor Y, desde que seja sensato e não sobrecarregue Y.

A propósito, é um sistema .NET ... o que você recomendaria?

o estado é interno nos servidores, não uma transação de algum tipo. o estado são alguns dados que os servidores agregam dos dados que recebem e são dimensionáveis com um WebService WCF simples. O aplicativo é baseado no UDP, e embora eu não concorde com a decisão, é "Acima do meu salário"

No momento, estou experimentando o NLB do MS, ele funciona bem, ele faz a coisa de fidelidade fora da caixa, mas gera ruído em toda a rede ...

Também não há DNS ... Ah, e é um protocolo completamente de fantasia.

    
por Hellfrost 30.01.2011 / 15:24

5 respostas

4

I have a udp server, [...] server is almost entirely stateless [..] have some fidelity, I mean if client X was routed to server y, then I want all of X's subsequent requests to go to server Y, as long as it is sensible and not overloads Y.

Então, você está usando um protocolo de aplicativo não divulgado que mantém algum estado de aplicativo e é executado sobre o UDP? Você está indo numa direção difícil. O UDP não é um transporte de dados confiável, esse é o objetivo dele - para um transporte de dados confiável, veja o seu popular amigo TCP. A única maneira de obter sua 'fidelidade' é ter um proxy de balanceamento de carga que entenda o protocolo da sua camada de aplicação e que saiba qual é o seu estado atual de aplicativo e atue de acordo.

Eu vejo três abordagens que chegam perto de fornecer o que você procura:

  • Estique estaticamente as conexões de entrada em mais de três endereços IP, com base no endereço IP source (usuário final). Dessa forma, um determinado usuário sempre será direcionado para o mesmo servidor. A maioria dos firewalls profissionais pode fazer isso por você. Talvez você precise tornar os três servidores altamente disponíveis, já que a maioria dos firewalls não fará verificações de integridade de backend para você.

  • Use DNS e use o DNS Round Robin, como já sugerido por Matt Simmons.

  • Use o Balanceamento de carga de rede (NLB) incorporado do Windows. Honestamente, eu não sei como o cenário de failover seria executado com o NLB e seu serviço baseado em UDP com semi-estado - você teria que investigar você mesmo, com base em como seu aplicativo lida com o estado. No lado positivo, o NLB é muito fácil de configurar, gratuitamente com a licença do Windows, maduro e com bom desempenho.

por 31.01.2011 / 02:38
6

O Linux Virtual Server é um servidor altamente escalável e altamente disponível, construído em um cluster de servidores reais. O LVS suportava o protocolo UDP e o algoritmo de hash de origem (isso é usado quando você quer que um cliente apareça sempre no mesmo servidor real).

Eu uso o LVM para balancear DNS (rr), SIP (sh).

    
por 30.01.2011 / 15:35
4

Interessante. A maior parte do software proxy que eu vi é reconhecidamente baseado em TCP.

A maior parte do balanceamento de carga específico do UDP que eu já vi em minha pouca experiência foi baseado em DNS (ou seja, servidores de tempo, servidores DNS, etc.). Existe alguma maneira de fornecer vários registros A? Se isso funcionasse, o DNS Round Robin normal garantiria a distribuição justa de solicitações (provavelmente bastante justas, de qualquer forma) e o cache do cliente garantiria que a fidelidade fosse mantida (supondo que você esteja usando uma plataforma baseada em cache no cliente final).

    
por 30.01.2011 / 15:34
2

Você pode usar qualquer tipo de balanceador de carga para executar isso, seja hardware ou software, pode escolher entre diferentes balanceadores de carga com base no que precisa.

Balanceador de carga de nível 3: O balanceamento de carga será observado apenas no IP de entrada e nos IPs de back-end disponíveis, esse tipo de balanceador de carga garantirá a aderência sempre enviando o mesmo endereço IP de entrada para o mesmo backend, embora este tipo de estratégia possa sobrecarregar um dos backends se muitos clientes com o mesmo IP (seja um proxy ou um gateway corporativo)

Balanceador de carga do nível 7: Um balanceador de carga de nível 7 não só equilibrará como um balanceador de nível 3, mas também analisará o conteúdo do pacote, o que proporcionará muito mais flexibilidade para suas políticas de balanceamento.

Considerando que você está usando o UDP, ambos os balanceadores devem ter um bom desempenho, também a inspeção profunda de pacotes no UDP é um pouco mais limitada do que no TCP (apenas por razões de protocolo).

Dependendo do seu orçamento, você pode começar usando um balanceador de carga de software (linux + IPVS, por exemplo) e, em seguida, começar a subir para balanceadores de carga de hardware como os oferecidos pela Cisco ou Netapp

    
por 30.01.2011 / 15:36
2

O NGINX de código aberto e a plataforma de entrega de aplicativos, NGINX Plus, agora suportam o balanceamento de carga UDP. A nova capacidade se baseia em nossos recursos TCP e HTTP, tornando o NGINX um frontend poderoso, fácil de usar e consistente para uma gama ainda maior de aplicativos e dispositivos da Internet.

Disponível na versão nginx-1.9.13

    
por 05.04.2016 / 15:24