Balanceamento de carga em um servidor UDP

10

Eu tenho um servidor udp, é uma parte central do 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 antigos que podem surgir das várias instâncias do servidor.

Minha pergunta é: como posso implementar o balanceamento de carga entre os servidores? Eu preferiria distribuir os pedidos da maneira mais uniforme possível entre os servidores. Eu também gostaria de ter alguma fidelidade. Quero dizer, se o cliente X foi roteado para o servidor y, quero que todas as solicitações subseqüentes de X vão para o servidor Y, desde que seja sensato e não sobrecarregue Y.

Aliás, é um sistema .NET ... o que você recomendaria?


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

Atualmente, estou testando o NLB da MS, funciona bem, 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 personalizado.

Hellfrost
fonte
Apenas uma observação para referência futura - as perguntas podem ser movidas entre sites de troca de pilha em muitos casos por moderadores e usuários de alta reputação. Isso ajuda a preservar todas as respostas que já foram colocadas, por isso é melhor do que reposicionar por conta própria (a menos que não haja respostas; nesse caso, exclua a pergunta antiga para que ninguém a responda acidentalmente). Se você concordar com uma sugestão de mudança, basta adicionar um comentário nesse sentido e (se possível) sinalizar sua postagem para obter atenção do moderador, e a postagem deve ser movida para você.
22411 bdonlan

Respostas:

4

Eu tenho um servidor udp, o [...] servidor é quase totalmente sem estado [...] e tenho alguma fidelidade, quero dizer, se o cliente X foi roteado para o servidor y, quero que todas as solicitações subseqüentes de X vão para o servidor Y, como desde que seja sensato e não sobrecarregue Y.

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

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

  • Distribua estaticamente as conexões de entrada em três endereços IP, com base no endereço IP de origem (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 3 servidores altamente disponíveis, já que a maioria dos firewalls não fará verificações de integridade de back-end para você.

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

  • Use o balanceamento de carga de rede (NLB) interno do Windows . Sinceramente, não sei como o cenário de failover se desenrolaria com o NLB e seu serviço baseado em UDP semi-stateful - você precisaria investigar isso sozinho, com base em como o 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.

Jesper M
fonte
Eu editei minha pergunta
Hellfrost
6

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

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

alvosu
fonte
4

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

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

Matt Simmons
fonte
nenhum DNS.
Hellfrost
2

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

Balanceador de carga de nível 3: o balanceamento de carga só examinará o IP recebido e os IPs de back-end disponíveis. Esse tipo de balanceador de carga garantirá a rigidez, sempre enviando o mesmo endereço IP de entrada para o mesmo back-end, embora esse tipo de estratégia possa sobrecarregar um. dos back-end se muitos clientes forem do mesmo IP (seja um proxy ou um gateway corporativo)

Balanceador de carga de nível 7 : um balanceador de carga de nível 7 não apenas se equilibra como balanceador de nível 3, mas também analisa o conteúdo do pacote, o que lhe dará 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 começar a acessar balanceadores de carga de hardware, como os oferecidos pela Cisco ou Netapp

Lynxman
fonte
-1 para a parte L7. Um balanceador de carga Camada / Nível 7 funciona na camada de aplicativo - mas, como o OP está usando UDP, ele não está usando HTTP simples e não divulgou qual aplicativo está usando. Não podemos saber se existe um balanceador de carga L7 para o protocolo que o OP está usando.
precisa
1
Eu estava apenas comentando suas opções em balanceadores de carga, e não sabemos o que ele está usando mais UDP, eu acho que você está cortando um presente muito apertado;)
lynxman
Há algo entre NLB / linux e Cisco / netapp: balanceadores de carga KEMP. Você pode obter uma edição virtual que não custa muito dinheiro, estamos usando e estamos muito felizes.
pauska
2

O NGINX de código aberto e a plataforma de entrega de aplicativos, o NGINX Plus, agora oferecem suporte ao balanceamento de carga UDP. O novo recurso se baseia nos recursos TCP e HTTP existentes, tornando o NGINX um front-end poderoso, fácil de usar e consistente para uma gama ainda maior de aplicativos e dispositivos da Internet.

Disponível no release nginx-1.9.13

anish
fonte