Design de Sistemas Distribuídos — Balanceamento de Carga (Load Balancing)

Italo Santana
Comunidade XP
Published in
7 min readJan 29, 2020

--

Bem vindos ao terceiro artigo da série sobre Design de Sistemas e Sistemas Distribuídos!

Você pode ler o artigo anterior da série aqui.

Dando continuidade a série sobre sistemas distribuídos, hoje vamos abordar Balanceamento de Carga, tema bastante amplo e muito importante, tanto que dediquei um capítulo apenas para falar sobre o conceito e métodos de funcionamento e utilização do mesmo.

Em ciências da computação o uso do termo “balancear carga” significa otimizar o uso de recursos, maximizar a produtividade, minimizar o tempo de resposta e evitar a sobrecarga de recursos.

O balanceamento de carga geralmente envolve software ou hardware dedicado, seja com um comutador de multicamadas ou um processo de servidor DNS.

O uso de vários componentes com balanceamento de carga em vez de um único componente, pode aumentar a confiabilidade e a disponibilidade por meio de redundância.

Balanceamento de carga é um conceito essencial para o design de softwares distribuídos, pois com ele podemos dividir o tráfego entre interfaces de rede dos nossos serviços distribuídos.

Balanceamento de Carga no Servidor

No assunto que estamos abordando um balanceador de carga no servidor geralmente é um programa de software que está escutando na porta em que clientes externos se conectam para acessar serviços.

O balanceador de carga redireciona solicitações para um dos servidores back-end, que geralmente responde ao balanceador de carga, que retorna uma resposta para o cliente.

Exemplo:

Simples exemplo de redirecionamento de requisições em um balanceador de carga

Essa abordagem permite que o balanceador de carga responda ao cliente sem que ele saiba sobre a separação interna de funções e impede que os clientes façam requisições diretamente aos servidores back-end, o que traz de certa forma benefícios de segurança, pois oculta a infraestrutura da rede interna e impede ataques à pilha de rede do kernel ou serviços não relacionados em execução em outras portas.

Alguns balanceadores de carga fornecem um mecanismo para fazer algo especial no caso de todos os servidores de back-end estarem indisponíveis, isso pode incluir: o encaminhamento para um balanceador de carga de backup ou a exibição de uma mensagem sobre a interrupção.

É muito importante que o próprio balanceador de carga não se torne um ponto único de falha.

Geralmente, os balanceadores de carga são implementados em pares de alta disponibilidade, que também podem replicar dados de persistência de sessão, se exigidos pelo aplicativo específico.

Certos aplicativos são programados com imunidade a esse problema, compensando o ponto de balanceamento de carga sobre plataformas de compartilhamento diferencial além da rede definida. Os algoritmos sequenciais associados a essas funções são definidos por parâmetros flexíveis exclusivos do banco de dados específico conhecidos popularmente como hash.

Funcionamento de um Balanceador de Carga

“Balanceamento de carga” é um nome genérico atribuído a uma variedade de problemas algorítmicos em que um conjunto de itens precisa ser particionado em intervalos, para que a carga de cada intervalo, no entanto definida, seja distribuída aproximadamente uniformemente.

Resumindo: O balanceamento é nada mais nada menos que um algoritmo que resolve para qual host as requisições serão direcionadas em um cluster de serviços distribuídos.

Podemos citar como exemplo diversas ferramentas que fazem tal trabalho, tais como: Elastic Load Balancing da Amazon, Azure Load Balancing da Azure, Eureka da Netflix (também faz o trabalho de Service Discovery que será abordado em um outro capítulo), dentre vários outros.

Métodos e Algorítimos Utilizados

Round Robin

Usando esse método, as solicitações do cliente são roteadas para os servidores disponíveis de forma cíclica. O balanceamento de carga do servidor round robin funciona melhor quando os servidores têm recursos de computação e capacidade de armazenamento aproximadamente idênticos.

Fácil de implementar e conceituar, o round robin é o algoritmo de balanceamento de carga mais amplamente implantado.

Nesse método as requisições são distribuídas pelo grupo de servidores sequencialmente.

Em poucas palavras, o balanceamento de carga da rede round robin gira solicitações de conexão entre servidores web na ordem em que as solicitações são recebidas.

Para um exemplo simplificado, suponha que uma empresa tenha um cluster e tenha uma configuração de balanceamento de carga com três servidores: Servidor A com um peso 2, Servidor B com um peso 3 e Servidor C com um peso 4. Os serviços são vinculados ao Load Balancer, que está configurado para usar o método round robin..

Com essa configuração, os pedidos recebidos são entregues da seguinte maneira:

1 — O Servidor-A recebe a primeira solicitação.
2 — O Servidor-B recebe a segunda solicitação.
3 — O Servidor-C recebe a terceira solicitação.
4 — O Servidor-A recebe a quarta solicitação.
5 — O Servidor-B recebe a quinta solicitação.
6 — O Servidor-C recebe a sexta solicitação.
7 — O Servidor-B recebe a sétima solicitação.
8 — O Servidor-C recebe a oitava e a nona solicitações.

O balanceador de carga continua passando solicitações para servidores com base nesse pedido.

Least Connections

Uma nova solicitação é enviada ao servidor com o menor número de conexões atuais com os clientes.

A capacidade de computação relativa de cada servidor é fatorada para determinar qual deles tem menos conexões.

Mais útil quando há um grande número de conexões persistentes no tráfego distribuído de maneira desigual entre os servidores.

O exemplo a seguir mostra como um servidor virtual seleciona um serviço para balanceamento de carga usando o método de conexão mínima. Considere os três serviços a seguir:

O Servidor-A está tratando 3 transações ativas.
O Servidor-B está tratando 15 transações ativas.
O Servidor-C não está tratando nenhuma transação ativa.

Método Least Connection

As conexões são encaminhadas da seguinte maneira:

1 — O Servidor-C recebe a primeira solicitação, porque não está manipulando nenhuma transação ativa.

Nota: O serviço sem transação ativa é selecionado primeiro.

2 — O Servidor-C recebe a segunda e a terceira solicitações porque o serviço tem o próximo número mínimo de transações ativas.

3- — O Servidor-C recebe a quarta solicitação Como o Servidor-A e o Servidor-C têm o mesmo número de transações ativas, o servidor virtual usa o método round robin para escolher entre elas.

4 — O Servidor-C recebe a quinta solicitação.

5 — O Servidor-A recebe a sexta solicitação, e assim por diante, até que o Servidor-A e o Servidor-C estejam manipulando o mesmo número de solicitações que o Servidor-B. Agora se inicia o encaminhamento das solicitações para o Servidor-B, pois é o serviço menos carregado ou sua vez aparece na fila de rodízio.

Nota: Se as conexões com o Servidor-B forem fechadas, ele poderá obter novas conexões antes que cada um dos outros dois serviços tenha 15 transações ativas.

Least Response Time

Direciona o tráfego para o servidor com o menor número de conexões ativas, o menor número de solicitações de envio e o menor tempo médio de resposta.

O tempo de resposta também chamado Tempo até o Primeiro Byte (TTFB — Time To First Byte), é o intervalo de tempo entre o envio de um pacote de solicitação para um servidor e o recebimento do primeiro pacote de resposta.

Método Least Response Time

O servidor virtual seleciona um serviço multiplicando o número de transações ativas pelo TTFB para cada serviço e, em seguida, selecionando o serviço com o menor resultado. Para o exemplo mostrado acima, o servidor virtual encaminha solicitações da seguinte maneira:

1 — O Servidor-C recebe a primeira solicitação, porque o serviço não está manipulando nenhuma transação ativa.

2 — O Servidor-C também recebe a segunda e a terceira solicitações, porque o resultado é o mais baixo dos três serviços.

3 — O serviço-HTTP-1 recebe a quarta solicitação. Como o Servidor-A e o Servidor-C têm o mesmo resultado, o balanceador escolhe entre eles aplicando o método Round Robin.

4 — O Servidor-C recebe a quinta solicitação.

5 — O Servidor-B recebe a sexta solicitação, porque neste momento tem o resultado mais baixo.

6 — Como Servidor-A, Servidor-B e Servidor-C têm o mesmo resultado nesse momento, o dispositivo alterna para o método round robin e continua a distribuir conexões usando esse método.

A tabela a seguir explica como as conexões são distribuídas na configuração de balanceamento de carga de três serviços descrita acima.

Para não deixar o capítulo tão longo, resumo que existem diversos algoritmos e métodos para balanceamento de carga.

No próximo capítulo vamos falar sobre Consistent Hashing, uma das formas mais conhecidas de balancear carga e gerenciar dinamicamente a adição/remoção de nós em um cluster de uma arquitetura distribuída.

4— Design de Sistemas Distribuídos — Consistent Hashing (em breve)

--

--

Italo Santana
Comunidade XP

Arquiteto de Software apaixonado por tecnologia e inovação. Atualmente Tech Lead na XP Inc.