Balanceamento de carga fácil, barato e eficiente

Por Everaldo Canuto

Um assunto em especial me chamou a atenção há alguns dias, o balanceamento de carga de servidores Web. Para quem não está habituado ao termo, "balanceamento de carga" consiste em dividir o processamento entre dois ou mais servidores afim de atender um número maior de requisições com tempo de resposta menor. É como numa fila de banco, embora haja apenas uma fila, há muitos caixas para atender e logo a fila "é balanceada" entre os caixas.

Numa pesquisa rápida pela Internet você pode encontrar todo tipo de solução, de serviços na nuvem à programas especializados e até mesmo metodologias que se utilizam de um servidor de "proxy reverso".

O Problema

O maior problema com essas soluções não são apenas os custos e a complexidade, há também o fato de que em geral acabam por gerar um ponto único de falha na sua infraestrutura, levando abaixo a sua alta disponibilidade, o que ironicamente deveria ser resolvido pelo balanceamento de carga.

O diagrama abaixo demonstra justamente isso:

Balanceamento de Carga

Outro problema é que alguns provedores fornecem bandas distintas para cada servidor hospedado na nuvem (esse é o meu caso) e numa solução como essa você ficaria limitado à banda do seu balanceador.

A solução

Uma solução barata e prática é o uso de DNS Round-Robin que consiste basicamente em configurar dois ou mais endereços para um mesmo domínio (ou sub-domínio). A cada nova requisição ao servidor de DNS, ele envia a lista de endereços numa ordem diferente e os clientes portanto passam a fazer as solicitações alternadamente.

A solução pode ser melhor observada no diagrama abaixo:

DNS Round-Robin

Além de dividir as requisições, há ainda a vantagem de uma maior disponibilidade do serviço, isso porque, quando os clientes de internet modernos (Navegadores e até mesmo programas como o CURL e o WGet) percebem que um servidor não está respondendo, passam automaticamente a fazer as requisições para os demais servidores da lista.

E se tudo isso não fosse suficiente, há ainda a economia com hardware e aquisição de software pois você não precisa de um servidor dedicado apenas ao balanceamento. Por último, se o seu provedor disponibiliza links diferentes para cada servidor, você ainda terá mais banda disponível, o que na prática, se converte em maior velocidade de entrega das páginas.

O melhor de tudo é que você não precisa de um servidor de DNS específico, eu tenho aplicado essa solução com sucesso nos mais diferentes serviços de DNS e é muito provável que o seu serviço de DNS suporte a configuração de mais de um endereço para o mesmo domínio.

Críticas

Críticos do uso do Round-Robin justificam que a distribuição de carga não é uniforme mas minha experiência prática mostra que essa proporção não ultrapassa os 2%. Embora esses mesmos críticos também afirmem que não é seguro recorrer a esse algoritmo para disponibilidade entre falhas, na prática eu não tenho visto nenhuma requisição se perder quando preciso reiniciar um serviço ou mesmo quando algum servidor tem falha de hardware.

Próximos passos

Se sua aplicação faz uso de sessões, um dos problemas com o Round-Robin é que a sessão não estaria disponível em todos os servidores, poderiam ocorrer falhas como por exemplo o usuário voltar para a tela de entrada (login) entre uma requisição e outra. Isso no entanto não seria resolvido pelas soluções tradicionais de balanceamento de carga e portanto não pode ser visto como uma desvantagem.

Esse problema com sessões pode ser resolvido aplicando-se uma solução de alta disponibilidade para o armazenamento das sessões, nos próximos artigos pretendo falar um pouco sobre isso.

Sobre o Canuto

Esse é meu primeiro artigo aqui no CanalTech, a idéia da coluna é escrever artigos um pouco mais voltados ao público técnico mas numa linguagem didática e explicativa afim de contemplar também o público não técnico com algum conhecimento da área. Configuração de servidores, Linux, programação e arquitetura de sistemas estarão entre os temas correntes.

Além dessa coluna a qual pretendo escrever semanalmente, você também pode acompanhar alguns vídeos no meu canal Toca do Canuto no YouTube. Fique ligado!