Balanceamento de links no Linux

Este artigo é originalmente de 24/07/2008 e ficou por aí vagando na Internet repostado em diversos sites até hoje (peguei agora de Load balance para novatos).

O tema era bem popular na época e havia muita gente implementando isso… logo, muita gente fazendo certo e muita gente fazendo errado.

Quem copiava scripts de HOWTOs sem entender o que estava fazendo invariavelmente depois vinha no IRC e nas listas falando sobre a façanha e os problemas (quando perguntavam no canal do slackware então, mandávamos ir pro canal do debian).

Pra não ter que explicar sempre a mesma coisa toda hora, escrevi o artigo e a partir dali era apenas: “toma o link”. Era tanto “toma o link” que eu mandava (como disse, era um assunto em alta na época), que eu economizei muito tempo por ter escrito este post.

E o artigo não tinha nenhuma linha de comando, pois seu intuito era que a pessoa entendesse o que estava fazendo, e não copiar e colar comandos.

O tema não é mais tão relevante hoje (hoje os newbies estão em outra vibe hehe).

 

Segue (nota-se minha impaciência na época):

 

Cenário

Newbies. Eles estão dominando as listas com suas dúvidas idiotas e entrando no mercado de trabalho montando servidores fora de conformidade.
Agora parece que eles leram algum HOWTO e saem vendendo serviços de firewall com load balance de link. E o melhor de tudo, a um baixo custo pois o cliente não precisa ser AS, nem configurar BGP, nem se quer ter um link corporativo com uma operadora.

O cenário que virou febre é:
– Links baratos de operadoras diferentes em load balance.

Exemplo: velox 1Mb + virtua 1Mb = tem que dar 2Mb total.

Aí o ameba vai lá, instala o linux, configura cada link e… Mágica !!
Ele não faz a mínima idéia de como fazer o balanceamento.

O próximo passo é atormentar os outros em canais de ajuda como IRC, listas etc.
Eles querem comando e configurações. “O que eu digito e onde eu configuro pra fazer o balanceamento ?” – eles perguntam.
Comandos e configurações rápidas são objetos de desejo dos newbies ostras. Conhecimento ? Não, obrigado, depois que funcionar eu estudo.

O objetivo deste texto é tentar enfiar algo na cabeça de fuinha deles e dar uma idéia do que fazer para amenizar a cagada já que você não conseguiu fazer o balanceamento que já vendeu.

Balanceamento 

Um load balance verdadeiro consiste em dividir a carga entre links diferentes de forma transparente e de acordo com a capacidade dos links.
Por exemplo, dois links de 1Mb e um link de 2, daria uma banda total para a rede interna de 4Mb. 50% do tráfego iria pelo de 2Mb e 25% em cada um dos de 1Mb.

Para um balanceamento completo e normal, você precisaria ter um ASN e BGP configurado com suas operadoras para que você não dependa de que link você usa.
Não vou me aprofundar nisso, vou focar no que está na moda dos newbies.

A teoria da coisa 

“Consigo fazer um download a 4Mb/s?” – Não. Na forma mais “popular” e simples de balanceamento, quando uma estação faz uma conexão com destino a um IP na internet, o router (linux, dlink, seja o que for, chamarei ele de “o seu firewall linux”) decide por qual dos links enviar, e guarda em cache aquela rota.

O cache de rota destino serve para que todos os pacotes de conexões com um mesmo destino saiam sempre pelo mesmo link.

Desta forma, se sua conexão com o site caiu pelo link de 1Mb/s, para esta conexão o limite é este.
Outra conexão da mesma estação com outro site, poderá sair por outro link, de forma que com várias conexões transferindo dados uma só estação pode usufruir dos 4Mb totais de link, mas neste cenário, nunca uma conexão só usará a soma dos links.

A prática 

Eu não vou citar nenhuma linha de comando. Existem vários (alguns péssimos, escritos por newbies também) disponíveis na Internet.
O que recomendo é o LARTC.

O problema é que o LARTC é muito bom para o que ele se propoe. Funciona. É fácil.
O que não funciona é o newbie. O LARTC assume que você está no ambiente ideal, e por isso quer fazer o load balance dos links.

O newbie não faz idéia de como a internet funciona e porque que o ambiente que ele tem não é ideal. Afinal, o newbie a essa altura tá se achando o máximo porque prometeu balanceamento e backup de links baratos, sem BGP, ASN nem nada !! O newbie descobriu a solução pos pobrema todo !

Aí o pateta vai lá, lê um howto, e consegue dividir a carga entre os links. Até aí foi fácil.
Dois dias depois o cliente nota que algumas coisas não estão funcionando, como o gerenciador financeiro do banco dele etc.
O new então volta a perturbar em listas e canais de ajuda.

O problema – fatiando o boi 

O problema é simples, óbvio, e fácil de “resolver”. O difícil é a porra do newbie entender que ele nunca deveria se prestar a fazer algo que não faz idéia de como funciona. Tá achando que a Internet é zona ??

Seguinte:
Cache de rota não faz milagre e não tem bola de cristal.

Sejamos diretos:

  • Dependendo do link que o firewall escolheu praquela conexão, o seu IP na internet muda, certo ? Claro. Será o IP de saída daquele provedor.
  • Quando você conecta em um IP que ainda não existe cache de rota pra ele, o firewall escolhe qualquer um dos links pra sair e cria o cache de rota, certo ? Sim.
  • Quando você conecta em outro IP, a situação é identica à primeira, certo ? Óbvio.
  • Quando você está conectado à um site que via cookie, sessão ou qualquer coisa, usa o seu IP origem para “manter uma sessão”, e você clica num link que aponta para outro IP, mas ele tenta “manter a sessão”, você não acha que vai dar merda ? Claro que vai.

Nesse ponto, você volta ao item 1, e se por sorte para este NOVO IP o firewall calhar de escolher o mesmo link pelo qual o acesso ao site que criou a sessão saiu, vai funcionar. Se o firewall escolher outro link, já era.

“Mas porque o firewall não vai jogar pelo mesmo link sempre ?”. O firewall tem bolota de cristal ? Não.
Ele sabe que o novo ip que você está conectando, foi porque você clicou num link em um site num IP que ele já tem o cache de rota ? Não.

Para o firewall: novo ip, nova decisão de rota.
Decisão de rota diferente da que a sessão foi criada = sair com IP diferente pra internet.
Sair com IP diferente = não vai manter a “sessão”.

Claro isso ?

A marretada 

Se tudo que você tem é um martelo, você trata tudo como prego.
Agora que você já fez a cagada e que deu problemas, lhe resta apenas amenizar o cheiro.

Para impedir que o problema ocorra você pode optar por várias alternativas, mas elas consistem em dividir os links.
Atribuir propósitos a cada um dos links, ou dividir as estações em grupos para cada link já deixa de ser balanceamento.
Fazendo isso, você vai apenas classificar que tipo de tráfego vai por cada link, tentando aproveitar ao máximo a banda de cada um, mas não é balanceamento.

Você pode optar por:

  • Certas portas destino (serviços) sairem sempre pelo mesmo link
  • Cada grupo de estações sair sempre pelo mesmo link

Em qualquer um dos casos, você vai precisar que as regras mudem caso um link caia, redirecionando aquele tráfego para os outros links ativos.
Pitaco válido: tem idiota que teima em pingar o IP da ADSL pra testar se o link tah up/down.
Se o link cair, você vai continuar pingando o seu nexthop. O teste tem que ser feito com o nexthop do seu nexthop, é óbvio (e com rota para sair por aquele link, claro).

Bom, é isso.

Agora saiam por aí vendendo “otimização de uso da internet via segregação de tráfego entre links baratos diferentes e com failover scriptizado”.
Só não digam que é um load balance legítimo.

O fim do mundo 

Até agora só falei de “saída para a Internet”, mas tem gente que vende isso pra “entrada” também.
Quero dizer, já que o cliente tem dois ou mais IPs públicos, ele pode colocar um servidor web lá dentro e fazer o NAT de entrada, colocar no DNS os dois IPs pra entrada www etc e tal e não sabem porque as pessoas não acessam quando um dos links cai. Mas isso é outro assunto.

Teria que ser um newbie muito sem noção pra achar que isso funcionaria bem.