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
- https://www.nginx.com/blog/choosing-nginx-plus-load-balancing-techniques/
- https://infraascode.com.br/balanceamento-de-cargas-lab/
- https://github.com/leoml/blog-infraascode/tree/master/posts/Balancemento-de-Cargas-com-Nginx
Convido você a ver os outros posts do blog Infra-as-Code.
Nossos contatos são:
Email – [email protected]
Twitter - @infraascodebr
|