Balanceamento de carga da camada 4 x 7

21

Estou tentando decidir entre usar uma solução de balanceamento de carga da camada 4 para meu datacenter ou uma solução da camada 7. Infelizmente (para minha sanidade mental), meu caso de uso é simples o suficiente para que ambas as soluções funcionem bem, evitando a maioria dos pontos fracos e sem realmente utilizar os pontos fortes do outro. Qualquer que seja a solução que acabemos usando, ela deve ter alta disponibilidade e alto rendimento. Mas estamos planejando usá-lo apenas para equilibrar a carga em um cluster de servidores Web, nenhum dos quais tem requisitos para gerenciamento de sessões "persistente" (cookie ou IP), regras complexas de reescrita - ou, nesse caso, regras de reescrita em todos.

Os balanceadores de carga serão conectados a dois comutadores, ambos com uma conexão independente até a camada de agregação do datacenter e mesclados usando o Rapid Spanning Tree e qualquer protocolo proprietário que os comutadores usem para virtualização. Os balanceadores de carga também serão reticulados entre si através de um cabo cruzado. Todos os servidores no cluster estão conectados aos dois comutadores. Tudo o que os balanceadores de carga precisam fazer é apontar o tráfego sobre eles.

Como é apenas HTTP, posso usar uma solução de balanceamento de carga da camada 7, como HAProxy ou nginx. Mas eu também poderia usar o projeto LVS com ldirectord ou keepalived ou qualquer outra coisa.

Eu tentei dividir os prós e os contras como os vejo, mas isso acaba acabando. O que você recomendaria e por quê? Estou esquecendo de algo?

Scrivener
fonte

Respostas:

17

Um benefício útil do "L7", como o haproxy, é poder usar cookies para manter o mesmo navegador acessando o mesmo servidor de back-end. Isso torna os resultados do cliente de depuração muito mais fáceis.

O balanceamento L4 pode devolver um único usuário em vários servidores back-end. (que em certos casos pode ser vantajoso, mas no sentido de depuração / criação de perfil, o uso de "L7" é muito mais valioso.)

EDIT: Há também uma vantagem potencial de velocidade do uso do balanceamento HTTP. Com o keep-alives, os clientes podem estabelecer uma única sessão TCP para o seu balanceador e enviar muitas HITs sem precisar restabelecer novas sessões TCP (handshake de três vias). Da mesma forma, muitos LBs mantêm sessões keep-alive para sistemas back-end, removendo a necessidade de fazer o mesmo handshake no back-end.

O balanceamento de carga estrito do TCP pode não conseguir os dois com a mesma facilidade.

/ * FWIW: Eu não diria "L7" ou "L4", diria HTTP ou TCP. Mas sou um defensor de evitar o uso do OSI para descrever coisas que não combinam bem. * /

Penso fundamentalmente que, se você não tiver certeza do que implantar, siga o que lhe parecer simples e natural. Teste-o (use o banco apache?) E verifique se ele funciona para as suas necessidades. Para mim, o HTTP LB é mais natural.

Joel K
fonte
A aderência, baseada em cookie ou IP, é certamente uma vantagem da comutação L7. Mas não é um aplicativo que nosso aplicativo possa usar particularmente.
Scrivener
Uma desvantagem do balanceamento de carga no nível HTTP seria que você teria que ter um balanceador de carga no nível TCP na frente dos balanceadores HTTP para permitir o failover entre os dois?
Scrivener
@ Scrivener - você não deveria, não. O DNS round-robin pode cuidar disso, acredito, a menos que eu esteja entendendo mal sua pergunta.
mfinni
@mfinni: o DNS geográfico global poderá apontar para um IP por datacenter. Eu preciso de algo para responder a esse IP.
Scrivener
Entendo. Bem, isso depende dos recursos do (s) seu (s) dispositivo (s). Provavelmente, é possível encontrar um dispositivo compatível com L7 que possa funcionar em pares com um único VIP de cluster que não exigiria um balanceador de carga TCP / IP de hardware. Se o IIS e o MS Windows NLB conseguirem, imagino que a maioria dos outros produtos comerciais consiga.
Mfnni
4

Dada a falta de vantagem para você ao fazer o balanceamento L7, eu preferiria o balanceamento L4. Sou um grande fã de mantê-lo o mais simples possível, sem sacrificar muito.

O L7 exige que os balanceadores inspecionem os cabeçalhos http nos pacotes que estão passando por eles para o roteamento apropriado, adicionando sobrecarga adicional e um aumento marginal na latência para o usuário final. Parece-me uma despesa inútil se você não ganhar nada com isso.

Twirrim
fonte
0

Alguns provedores de DNS têm uma funcionalidade simples de failover. Você mencionou quais são seus requisitos e não o que são, mas se tudo o que você precisa é rodízio com failover se algo estiver inativo, então você pode usar, por exemplo, o Failover de zoneedit.com . Dependendo das suas necessidades de alta disponibilidade, isso pode ser bom o suficiente e você pode pular uma camada inteira em sua arquitetura.

Ernest Mueller
fonte
Eu gostaria que fosse assim tão simples - precisamos de algo mais como round-robin com failover, além de separação geográfica. Tudo isso não está em questão, no entanto, porque está sendo feito por uma empresa externa.
Scrivener
O que você quer dizer? Acho que também quero dizer que o DNS está sendo feito por uma empresa externa, e alguns deles oferecem suporte ao balanceamento de carga geográfica e ao failover como um serviço DNS. ou que você simplesmente não tem voz direta sobre o DNS?
Ernest Mueller
O primeiro - já estamos fazendo DNS com uma empresa externa que realiza failover e balanceamento de carga geográfica para os diferentes datacenters. Eu só preciso equilibrar a carga dentro do datacenter.
Scrivener
Você pode usar o mesmo round robin para servidor por servidor no front end, certo? O DNS para o balanceamento de carga round robin é frequentemente usado para um único datacenter; geolocalizações múltiplas são um requisito importante para isso.
Ernest Mueller