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.
Primeiro acesso do cliente: recebendo o cookie "route" do servidor
A lógica da nossa configuração para estabelecer a persistência de sessão é baseada na utilização de um cookie, por isso o comportamento do primeiro acesso realizado pelo cliente é diferente dos acessos subsequentes.
Em seu primeiro acesso, o cliente ainda não possui o cookie "route" definido em seu navegador. O NGINX irá adicionar um cookie para o cliente, mas para isso deverá ser processada a variável $upstream_grp (linha 23).
Desta forma, a diretiva map[7] (linha 12) vai inicializar a variável $upstream_grp com o valor padrão (default), ou seja, o valor da variável $upstream_var (linha 13).
Como o valor da variável $upstream_var também é nulo, a diretiva split_clients[8] (linha 7) é chamada para inicializá-la. A inicialização desta variável funciona como uma semente (seed) que identifica o acesso daquele cliente de forma única, pois concatena o endereço IP de origem, o user agent do navegador e a data e hora de acesso, transformando este identificador em um número dentro de um espaço de endereçamento de 32 bits.
De acordo com o nosso exemplo, 50% dos clientes ficará no espaço de endereçamento correspondente ao primeiro servidor backend (backend1) e o restante ficará no espaço de endereçamento correspondente ao segundo servidor backend (backend2).
Detalhe que esta função não executa o método round-robin[4] para escolher o backend e, portanto, podem existir mais clientes acessando um servidor backend que o outro. Esta diferença na quantidade de clientes acessando os servidores tende a se equilibrar quando há vários acessos acontecendo e utilizamos valores proporcionais para cada backend. Por exemplo, utilizando-se 3 servidores backend, podemos utilizar os valores 33,3% (linha 8) e 33,3% (linha 9).
Uma vez que a variável $upstream_var (linha 7) foi inicializada, o seu valor é retornado para a variável $upstream_grp (linha 12), e o cookie "route" é enviado ao cliente com o valor desta variável (linha 23).
A partir deste momento, o cliente é direcionado para o upstream (linha 1) através da diretiva proxy_pass (linha 24), a variável $upstream_grp é então analisada pela diretiva hash[6] (linha 2), direcionando o acesso do cliente para o backend correspondente ao hash analisado.
Próximos acessos do cliente: utilizando o cookie "route" existente
Com o cookie "route" já armazenado no navegador, no acesso do cliente a variável $upstream_grp (linha 23) é inicializada logo na diretiva map (linha 12), sendo o valor do cookie "route" ($cookie_route) atribuído à variável $upstream_grp e o cliente direcionado para o upstream (linha 1) através da diretiva proxy_pass (linha 24), onde a variável $upstream_grp deverá ser analisada pela diretiva hash (linha 2) para que o acesso do cliente seja direcionado para o backend correspondente ao hash analisado.
[1] Comentário enviado por mpsnet em 30/09/2016 - 10:42h
Parabéns pelo artigo.
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 ?
[2] Comentário enviado por fusca em 30/09/2016 - 13:06h
Obrigado mpsnet!
Olha... não existe ignorância. Ninguém nasce sabendo de nada. Basta um pouco de estudo, dedicação e compromisso com aquilo que se deseja alcançar que a sabedoria aparece.
Sobre a primeira pergunta, os backends não precisam do NGINX. Por se tratar de um proxy reverso, somente a borda precisa dele instalado. No NGINX, basta colocar mais backend na conf, exemplo... backend3, backend4, ....
Em relação à outra dúvida, o HASH é utilizado para "esconder" o nome real dos seus backends. Você pode usar qualquer nome (exemplo: b1, b2, b3, ...), mas, por questões de segurança, sugiro você usar um HASH, pois o mesmo aparece no cookie enviado para o cliente. No Linux, vc pode usar o comando "sha1sum" ou "sha224sum" ou "sha256sum" ou "sha384sum" ou "sha512sum" para gerar o HASH.
Espero ter ajudado.
[1] Comentário enviado por mpsnet em 30/09/2016 - 10:42h
Parabéns pelo artigo.
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 ?