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}
-
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}
-
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}
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}
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
- Repositório das configurações: https://github.com/leoml/blog-infraascode/tree/master/posts/Balancemento-de-Cargas-com-Nginx
- Nginx configuration: https://www.nginx.com/resources/wiki/start/topics/examples/full/
Convido você a ver os outros posts do blog Infra-as-Code.
Nossos contatos são:
Email – [email protected]
Twitter - @infraascodebr
|