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.

[ Hits: 13.627 ]

Por: Fabiano Furtado em 29/09/2016


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.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Primeiro acesso do cliente: recebendo o cookie "route" do servidor
   3. Colocando o servidor backend em manutenção: Minimizando a perda de sessão
   4. Aumentando a segurança
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Apresentando e pondo a prova o Mono

Gnuplot - versátil ferramenta científica

Inclusão Digital

Blender - Iniciante (parte 1)

LXQT Desktop no Slackware

  
Comentários
[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 ?

Grato

[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 ?

Grato

[3] Comentário enviado por mpsnet em 30/09/2016 - 13:37h

Ajudou sim
Obrigado

[4] Comentário enviado por rdgovieira em 16/06/2018 - 13:24h

Muito bom o artigo, consegui entender e aplicar na minha infraestrutura com sucesso.
Muito obrigado!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts