domingo, 3 de maio de 2009

Nginx - Fazendo Global Service Load Balance (GSLB)

Mais uma vez estamos aqui... dividindo um pouco de conhecimento!

Para começar precisamos responder 2 perguntas que já devem estar rodeando a cabeça do leitor... Ná verdade são 4 em duas.

1 - O que é Ngnix? Pra que sever?
2 - O que é GSLB? Onde aplico?

Vamos a primeira!

1 - O que é Nginx? Pra que server?

O Nginx (pronuncia-se enginex), é um servidor WEB e Proxy Reverso de alta performance, podendo fazer proxy de servidores de e-mail IMAP, POP, SMTP. O Nginx também pode fazer proxy de outros protocolos, mas, seu foco são protocolos HTTP e HTTPS.
Ele é um projeto Open Source que está sendo desenvolvido por um russo chamado Igor Sysoev, no qual já está trabalhando no mesmo a uns 4 anos.
E falando em proxy... já podemos imaginar algumas centenas de coisas que podemos fazer.. uma delas e balanceamento de servidores (Load Balancing). Ele é um ótimo e robusto balanceador de carga, com configuração fácil e rápida. em poucos minutos estarás com seus servidores balanceados.

Próxima pergunta...

2 - O que é GSLB? Onde aplico?

O GSLB - Global Service Load Balance, como já diz o nome, é um balanceamento global de servidores, ou seja, poderei balancear uma determinada aplicação ou serviço entre vários datacenters localizados em um continente, país, estado ou cidade. Vamos ver se a figura abaixo nos ajuda um pouco:


Vamos lá..

Um cliente na internet requisita uma determinada aplicação. O servidor que responderá está aplicação te encaminhará para um datacenter, podendo aplicar as seguintes métricas:

  • Localização Geográfica: De acordo com a posição geográfica do cliente, o mesmo, será encaminhado para o datacenter mais próximo;
  • Disponibilidade: Se o datacenter mais próximo do cliente não estiver disponível, o mesmo será direcionado para um que possa atende-lo naquele momento;
  • Carga alta: Caso a aplicação esteja congestionada no datacenter principal, a requisição do cliente será direcionada para um datacenter que esteja mais livre;
  • Balanceamento Manual: Este balanceamento é feito de acordo com o 'peso' (weight) configurado para cada datacenter;
O GSLB é uma ótima solução para 'disaster recovery', caso um algo aconteça com um dos datacenters do ambiente, automáticamente a requisições serão direcionadas para o que estiver disponível.

Com as duas perguntas respondidas... acredito que o leitor já está imaginando o que faremos..
Sim! Utilizaremos nosso amigo Nginx para fazer o balanceamento de carga (Load Balance) de um ambiente que possui vários datacenters espalhados pelo mundo. Eis o cenário abaixo:

Dados do cenário:

Datacenter - US

Aplicação URL: http://us.app.com IP Externo: 201.x.y.1
Servidores:

Server1 10.1.1.1:80
Server2 10.1.1.2:80

Server3 10.1.1.3:80


Porta do serviço: 80

Datacenter - EU

Aplicação URL: http://eu.app.com IP Externo: 189.x.y.1
Servidores:

Server1 192.168.1.1:8001
Server2 192.168.1.2:8001

Server3 192.168.1.3:8001

Porta do serviço: 8001

Datacenter - APAC

Aplicação URL: http://apac.app.com IP Externo: 200.x.y.1
Servidores:

Server1 172.1.1.1:8080
Server2 172.1.1.2
:
8080
Server3 172.1.1.3:8080

Porta do serviço: 8080

Mãos-a-obra

1 - Download do Nginx:

# cd /usr/local/src/
# wget pacote_do_Nginx
# tar -xvzf pacote_do_Nginx.tar.gz

# cd pasta_Nginx/

# ./configure # make # make install

Ao instalar será criada uma pasta em /etc/nginx/, onde na mesma encontram os arquivos de configuração do Nginx. Você irá notar uma breve semelhança com a estrutura de pastas e arquivos do Apache2.

2- Configuração do Nginx no Datacenter US:

# cd /etc/nginx/sites-enable/
# mv default ../
# tail default > default
# vi default

#==========================================================
http {
upstream us.app.com {
server 10.1.1.1:80 weight=3; # Caso você queira dividir a carga entre servidores manualmente,
# acrescente o weight e altere o peso, nos outros servidores
server 10.1.1.2:80;
server 10.1.1.3:80;
}
server {
listen 80;
server_name www.app.com app.com; # URL chamada pelo cliente
location / {
proxy_pass http://us.app.com; # Note: Este é o upstream configurado
}
}

geo $gslb {
default us;
include conf/gslb.conf;
}

if ($gslb=eu) {
rewrite ^(.*) http://eu.app.com$1 redirect;
}

if ($gslb=apac) {
rewrite ^(.*) http://apac.app.com$1 redirect;
}
}
#=======================================================

3 - Criaremos o arquivo gslc.conf em /etc/nginx/conf/:
Obs.: Este procedimento terá que ser feito nos três datacenters


# mkdir /etc/nginx/conf
# touch
/etc/nginx/conf/gslb.conf
# cd
/etc/nginx/conf
# vi
gslb.conf

O conteúdo deste arquivo é formado pelar redes que atendem cada região, exemplo:

98.0.0.0/24 us;
189.0.0.0/24 us;
50.0.0.0/24 eu;
201.0.0.0/24 eu;
20.0.0.0/24 apac;
200.0.0.0/24 apac;
...
...
...


OBS.: Estas redes descritas acima são apenas para demonstração e entendimento da funcionalidade da solução;

4- Configuração do Nginx no Datacenter EU:

# cd /etc/nginx/sites-enable/
# mv default ../
# tail default > default
# vi default

#==========================================================
http {
upstream eu.app.com {
server 192.168.1.1:8001 weight=3; # Caso você queira dividir a carga entre servidores manualmente,
# acrescente o weight e altere o peso, nos outros servidores
server 192.168.1.2:8001;
server 192.168.1.3:8001;
}
server {
listen 80;
server_name www.app.com app.com; # URL chamada pelo cliente
location / {
proxy_pass http://eu.app.com; # Note: Este é o upstream configurado
}
}

geo $gslb {
default eu;
include conf/gslb.conf;
}

if ($gslb=us) {
rewrite ^(.*) http://us.app.com$1 redirect;
}

if ($gslb=apac) {
rewrite ^(.*) http://apac.app.com$1 redirect;
}
}
#=======================================================

5- Configuração do Nginx no Datacenter APAC:

# cd /etc/nginx/sites-enable/
# mv default ../
# tail default > default
# vi default

#==========================================================
http {
upstream apac.app.com {
server 172.1.1.1:8080 weight=3; # Caso você queira dividir a carga entre servidores manualmente,
# acrescente o weight e altere o peso, nos outros servidores
server 172.1.1.2:8080
server 172.1.1.3:8080
}
server {
listen 80;
server_name www.app.com app.com; # URL chamada pelo cliente
location / {
proxy_pass http://apac.app.com; # Note: Este é o upstream configurado
}
}

geo $gslb {
default apac;
include conf/gslb.conf;
}

if ($gslb=eu) {
rewrite ^(.*) http://eu.app.com$1 redirect;
}

if ($gslb=us) {
rewrite ^(.*) http://us.app.com$1 redirect;
}
}
#=======================================================

Após estes 5 passos, você terá um ambiente 100% balanceado e preparado para um 'disater recovery'.

Lembrando que esta é uma solução Open Source, a mesma pode ser atendida por appliance pelas seguintes empresas:

Mais uma vez.. obrigado pela atenção e espero ter ajudado!
Agora eu vou dormir!
Abraços.

OSB.:(Se tiverem tempo assistam os vídeos abaixo, não falam do Nginx, mas de um ambiente 100% disponível)








2 comentários:

  1. Alfredo, achei ótimo seu tutorial de como fazer um load balance com o Nginx.
    Penso numa estrutura diferente para um projeto que estou desenvolvendo. Teria um Front-End com toda a aplicação em PHP e quem faria o processamento seria o Back-End. Você sabe me dizer se isso é possível com Nginx?

    ResponderExcluir
  2. Com o Ngnix podemos fazer o balanceamento da camada 4, ou seja, você pode balancear qualquer protocolo (SQL, SIP, FTP, etc). Quanto a "Cluster" de processamento é possível porem não é o Ngnix que faz.

    ResponderExcluir