Balanceamento de Cargas +Lab

No post passado Balanceamento de Cargas falamos sobre sobre os algoritmos de balanceamento de cargas, achei que ficou um pouco abstrato a explicação então resolvi complementar com um LAB. Para este LAB foi montado uma infra bastante simplificada com máquinas para simular os clientes, um balanceador de cargas e máquinas para simular os webservers de Front-end para realizar a entrega de páginas HTML.

O objetivo desse post é apresentar as possibilidades de configuração utilizando diferentes algoritmos de distribuição de cargas e poder verificar se seus os resultados batem com as propostas de funcionamento de cada algoritmo.

Componentes do teste

Arquitetura do teste

Essa arquitetura é constituída por duas máquinas para simular os clientes, uma máquina para simular o balanceador de cargas e três máquinas para simular um webserver de Front-end e realizar a entrega da página HTML.

Figura 01 - Diagrama de componentes do teste

Clientes

São (02) duas máquinas Linux preparadas para realizar os testes. São três URLs de teste e cada máquina irá fazer 500 requisições totalizando mil.

 1#!/bin/bash
 2
 3MAX="0"
 4while [ $MAX -lt 500 ];do
 5  curl -H "Host: iphash.infraascode.com.br"  http://iphash.infraascode.com.br/index.html &>/dev/null
 6  curl -H "Host: roundrobin.infraascode.com.br"  http://roundrobin.infraascode.com.br/index.html &>/dev/null
 7  curl -H "Host: wroundrobin.infraascode.com.br"  http://wroundrobin.infraascode.com.br/index.html &>/dev/null
 8  MAX=$[$MAX+1]
 9done
10
11#EOF

Balanceador de Cargas

Para simular um equipamento de balanceamento de cargas foi configurado um Nginx com três virtual hosts distintos, cada um simulando um tipo algoritmo de distribuição de cargas: IP Hash, Round Robin e Weighted Round Robin. Também foi feita uma configuração para que os logs de acesso de cada um deles sejam armazenados em arquivos distintos e posteriormente contabilizados separadamente, veja como ficou a configuração:

  • IP Hash

Um hash baseado no endereço IP do cliente é calculado e o request é redirecionado para um host específico.

 1 upstream nginx-iphash {
 2  ip_hash;
 3  server iac-web01.infraascode.com.br;
 4  server iac-web02.infraascode.com.br;
 5  server iac-web03.infraascode.com.br;
 6}
 7
 8log_format ip_hash_log '$remote_addr $server_name $host $upstream_addr $request $status';
 9
10server {
11
12  listen 80;
13  server_name iphash.infraascode.com.br;
14  access_log  /var/log/nginx/nginx-iphash-access.log ip_hash_log;
15
16  index index.html index.htm;
17
18  location / {
19    proxy_pass http://nginx-iphash;
20  }
21
22}

Link - https://github.com/leoml/blog-infraascode/blob/master/posts/Balancemento-de-Cargas-com-Nginx/roles/nginx-lb/templates/nginx-lb-iphash.conf

  • Round Robin

Este método distribui igualmente entre os hosts de Front-end.

 1upstream nginx-web {
 2  server iac-web01.infraascode.com.br;
 3  server iac-web02.infraascode.com.br;
 4  server iac-web03.infraascode.com.br;
 5}
 6
 7log_format upstreamlog '$remote_addr $server_name $host $upstream_addr $request $status';
 8
 9server {
10
11  listen 80;
12  server_name roundrobin.infraascode.com.br;
13
14  index index.html index.htm;
15  access_log /var/log/nginx/nginx-roundrobin-access.log upstreamlog;
16
17  location / {
18    proxy_pass http://nginx-web;
19  }
20
21}

https://github.com/leoml/blog-infraascode/blob/master/posts/Balancemento-de-Cargas-com-Nginx/roles/nginx-lb/templates/nginx-lb-roundrobin.conf

  • Weighted Round Robin

Este método distribui proporcional ao peso dado a um determinado host de Front-end. Nesta configuração foi dado peso 2 para o host iac-web01 e peso 3 iac-web03, isso quer dizer que um host vai receber proporcionalmente duas vezes e três vezes mais que os outros.

 1  upstream nginx-wweb {
 2  server iac-web01.infraascode.com.br weight=2;
 3  server iac-web02.infraascode.com.br;
 4  server iac-web03.infraascode.com.br weight=3;
 5}
 6
 7log_format wupstreamlog '$remote_addr $server_name $host $upstream_addr $request $status';
 8
 9server {
10
11  listen 80;
12  server_name wroundrobin.infraascode.com.br;
13
14  index index.html index.htm;
15
16  access_log  /var/log/nginx/nginx-wroundrobin-access.log wupstreamlog;
17
18  location / {
19    proxy_pass http://nginx-wweb;
20  }
21
22}

https://github.com/leoml/blog-infraascode/blob/master/posts/Balancemento-de-Cargas-com-Nginx/roles/nginx-lb/templates/nginx-lb-wroundrobin.conf

Front-end WEB

Foi configurado para receber as requisições dos três Virtual hosts e entregar uma simples página em HTML.

 1server {
 2  listen 80;
 3
 4  root /mnt/roundrobin;
 5  index index.html index.htm;
 6
 7  server_name {{ansible_hostname}}.infraascode.com.br;
 8
 9  location / {
10   default_type "text/html";
11   try_files $uri.html $uri $uri/ =404;
12  }
13
14}

https://github.com/leoml/blog-infraascode/blob/master/posts/Balancemento-de-Cargas-com-Nginx/roles/nginx-web/templates/nginx-web-roundrobin.conf

Configurando os ambientes de testes

O Ambiente foi criado localmente com o Vagrant, este é o Vagrantfile. O Ansible foi utilizado para realizar a configuração do ambiente e execução dos testes.

O arquivo Vagrantfile e os scripts Ansible estão disponíveis aqui na seguinte URL do github [https://github.com/leoml/blog-infraascode/blob/master/posts/ Balancemento-de-Cargas-com-Nginx/Vagrantfile](https://github.com/leoml/blog-infraascode/blob/master/posts/ Balancemento-de-Cargas-com-Nginx/Vagrantfile).

Iniciando o ambiente de testes

Essa etapa cria seis máquinas Linux, cada uma com 1G de RAM. O tempo de criação deste ambiente pode variar de acordo com as velocidades de CPU e memória do seu computador.

$ git clone repo https://github.com/leoml/blog-infraascode.git
$ cd  https://github.com/leoml/blog-infraascode/tree/master/posts/Balancemento-de-Cargas-com-Nginx
$ vagrant up

Configurando o ambiente de testes

Para a configuração do ambiente de testes é utilizada a máquina iac-client01 como ponto de partida para configurar as outras máquinas conforme a seguir:

  • SSH para uma das máquinas>
$ vagrant ssh iac-client01
  • Comando de setup de ambiente>
$ cd /vagrant/
$ ansible-playbook -i hosts.ini playbooks/setup_env_test.yaml

Realizando os testes

Comando de rodar os testes

$ cd /vagrant/
$ ansible -i hosts.ini client -a "/home/vagrant/test_lb.sh"

Comando para coletar os resultados dos testes

$ cd /vagrant/
$ ansible -i hosts.ini nginx_lb -a "/home/vagrant/test_report.sh"

Conclusão

Após o LAB espero que tenha deixado um pouco mais claro e palpável as teorias sobre balanceamento de cargas. Os resultados batem exatamente com as propostas de distribuição de carga de cada algoritmo, veja na Tabela 01.

Algoritmo Total Request Distribuição por IP de origem
IPHash 1000 1000 - 10.10.100.203
Weighted Round Robin 1000 333 - 10.10.100.203 167 - 10.10.100.204 500 - 10.10.100.205
Round Robin 1000 334 - 10.10.100.203 333 - 10.10.100.204 333 - 10.10.100.205
Tabela 01 - Resultados da distribuição de cargas por algoritmo.
  • IPHash: Concentrou todos os request em apenas um IP de destino
  • Weighted Round Robin: Fez uma distribuição proporcional aos pesos atribuídos a cada máquina
  • Round Robin: Fez uma distribuição proporcional ao número de hosts disponíveis

Saber o funcionamento desses algoritmos é muito importante, eles são algoritmos bastante conhecidos e bem testados, portanto, será bem comum encontra-los por aí principalemnte em ambientes que utilizam Kubernetes e Service Mesh.

Agora meu jovem, com o conhecimento de uma parte da teoria de distribuição de cargas, o segredo é saber onde cada uma se encaixa dentro da sua arquitetura proporcionando um melhor funcionamento da sua aplicação.

Os scripts de configuração do ambiente podem ser baixos na íntegra neste https://github.com/leoml/blog-infraascode/tree/master/posts/Balancemento-de-Cargas-com-Nginx.

Abraços!

Vida longa e próspera a todos!!

Referências


Eu adoraria ouvir suas outras histórias e situações semelhantes ao que acabei de escrever neste post, você pode me encontrar em @infraascode_br ou linkedin.com/in/leonardoml/ .

Te convido a ver os outros posts do blog Infra-as-Code garanto que tem coisas legais lá!!


--- --- IMPORTANTE --- ---
As opiniões aqui expressas são pessoais e de responsabilidade única e exclusiva do autor, elas não refletem necessariamente a posição das empresas que eu trabalho(ei) e/ou presto(ei) serviço.