Balanceamento de cargas Lab - UPDATE

Um amigo leu o post passado [Balanceamento de Cargas +Lab] (https://infraascode.com.br/balanceamento-de-cargas-lab/) e me chamou atenção sobre o resultado do teste do algoritmo IP Hash. Segundo ele, ao mostrar que todos os requests caem no mesmo host, “o resultado apresentado induz a pensar que esse método não funciona”.

Conversamos um pouco sobre a que poderia ter acontecido: se a massa de testes era muito pequena limitada a dois hosts de teste, ou sobre o comportamento algoritmo para uma rede local poderia ser diferente ou não.

O problema

Descobrimos o problema!!! Como sempre, a resposta estava na documentação oficial. Por padrão o Nginx implementa o hash baseado nos primeiros três octetos do IP de origem para construir o hash de distribuição. Nos testes, os clientes tem os ips 10.200.200.200 e 10.200.200.201. Os dois IPs são da mesma sub rede, logo os três primeiros octetos serão sempre iguais, resultando numa mesma chave de distribuição Hash fazendo todos os requests caírem num mesmo destino.

A solução do problema

A solução do problema foi simples, foi fazer o Nginx utilizar o IP de origem com os quatro octetos para gerar o hash de distribuição e colocar o seguinte parâmetro de configuração:

 hash $remote_addr;

Foi criado um novo virtual host na configuração do Ngix com esse novo parâmentro e foram refeitos os testes, veja como ficou a nova configuração.

 1  upstream nginx-iphash-raddr {
 2  hash $remote_addr;
 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_raddr '$remote_addr $server_name $host $upstream_addr $request $status';
 9
10server {
11
12  listen 80;
13  server_name iphashraddr.infraascode.com.br;
14  access_log  /var/log/nginx/nginx-iphash-raddr-access.log ip_hash_log_raddr;
15
16  index index.html index.htm;
17
18  location / {
19    proxy_pass http://nginx-iphash-raddr;
20  }
21
22}

Link : https://github.com/leoml/blog-infraascode/tree/master/posts/Balancemento-de-Cargas-com-Nginx

Novos teste e novos resultados

Para validar a nova configuração, foram refeitos os testes seguindo os mesmos procedimentos do post anterior. Os resultados podem ser encontrados na Tabela 01.

Executando os testes

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

Coletando os resultados do post

cd /vagrant/
ansible -i hosts.ini nginx_lb -a "/home/vagrant/test_report.sh"
Algoritmo Total Request Distribuição por IP de origem
IPHash ipaddr 1000 500 - 10.10.100.203:80 500 - 10.10.100.205:80
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.

Conclusão

A observação do meu amigo foi muito válida (Tks!Brother!). Um parâmetro de configuração mudou completamente os resultados!! Os resultados do post de laboratório não estavam errados, mas poderiam levar o leitor a acreditar que o algoritmo IPhash era uma forma ruim de distribuição ou pouco eficiente, o que não é verdade. O IPhash é muito utilizado mas depende muito do tipo de aplicação.

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.