NGINX Open Source com Balanceamento de Carga e Persistência de Sessão
Atualmente, a maioria dos sistemas disponíveis na Internet são críticos e precisam ficar online todo o tempo. O Balanceamento de Carga é uma opção para que os serviços fiquem disponíveis com uma Alta Disponibilidade e o NGINX Open Source se mostra uma excelente escolha para tal cenário.
Introdução
A Alta Disponibilidade (High Availability ou HA) é um recurso essencial para os serviços disponibilizados na Internet. Uma das formas de se ter HA é utilizarmos o recurso de balanceamento de carga (Load Balancing ou LB) em vários servidores backend.
O NGINX[1] Open Source já possui uma solução de LB[2] nativa através da utilização de algumas diretrizes especiais como o ip_hash[3]. Esta solução inclusive oferece o recurso de persistência de sessão[4], porém ela definitivamente não pode ser considerada um LB eficiente, pois quando diversos clientes estão atrás de um NAT[5] ou proxy ela se tornará um grande problema.
Ou seja, em um cenário onde poderemos ter vários clientes acessando nosso servidor com o mesmo endereço IP e o balanceamento de carga é feito tomando como base o endereço IP de origem, a carga não será distribuída de maneira homogênea entre os servidores backend, o que comprometerá toda a solução.
A partir da versão 1.7.2 do NGINX Open Source, a diretiva hash[6] foi disponibilizada e podemos utilizá-la em conjunto com outras configurações para obtermos o resultado almejado.
O NGINX[1] Open Source já possui uma solução de LB[2] nativa através da utilização de algumas diretrizes especiais como o ip_hash[3]. Esta solução inclusive oferece o recurso de persistência de sessão[4], porém ela definitivamente não pode ser considerada um LB eficiente, pois quando diversos clientes estão atrás de um NAT[5] ou proxy ela se tornará um grande problema.
Ou seja, em um cenário onde poderemos ter vários clientes acessando nosso servidor com o mesmo endereço IP e o balanceamento de carga é feito tomando como base o endereço IP de origem, a carga não será distribuída de maneira homogênea entre os servidores backend, o que comprometerá toda a solução.
A partir da versão 1.7.2 do NGINX Open Source, a diretiva hash[6] foi disponibilizada e podemos utilizá-la em conjunto com outras configurações para obtermos o resultado almejado.
Como funciona
Toda a lógica é baseada na configuração abaixo, a qual será explanada ao longo do artigo.1 upstream us_backend {
2 hash $upstream_grp;
3 server backend1;
4 server backend2;
5 }
6
7 split_clients "client${remote_addr}${http_user_agent}${date_gmt}" $upstream_var {
8 50.0% "backend1";
9 * "backend2";
10 }
11
12 map $cookie_route $upstream_grp {
13 default $upstream_var;
14 "backend1" "backend1";
15 "backend2" "backend2";
16 }
17
18 server {
19 listen 80;
20 server_name apptest;
21
22 location / {
23 add_header Set-Cookie 'route=$upstream_grp;Path=/;HttpOnly';
24 proxy_pass http://us_backend;
25 }
26 }
Pretendo utilizar seu artigo para aprimorar meu sistema. Mas desculpe minha ignorância;
- como configuro os outros backends (tem que instalar o nginx neles) ?
- como faço para configurar/gerar o hash nos backends ?
Grato