É um serviço capaz de encaminhar requisições para vários servidores dentro de um cluster, de modo que cada nó do cluster não fique sobrecarregado, garantindo assim a utilização nivelada de todos os recursos computacionais dentro do cluster.
Neste projeto o Apache será o responsável pelo balanceamento da carga entre dois Tomcats. O Apache irá receber as requisições vindas dos clientes e de acordo com a quantidade de requisições enviadas a cada Tomcat, o mesmo irá transferir para cada um deles.
A figura abaixo mostra a arquitetura do cluster de Tomcat com balanceamento de carga:
Configurando o balanceador de carga
Como foi falado nos posts anteriores, o responsável pelo balanceamento de carga será o
Apache. Para isso o Apache utiliza o
mod_proxy e o
mod_proxy_balancer. Com o mod_proxy o Apache trabalha como um proxy FTP, http e ssl. Já o mod_proxy_balancer provê um serviço de balanceamento de carga para protocolos HTTP, FTP e AJP13. O mod_proxy_balancer depende do uso do mod_proxy.
Atualmente existem dois métodos de balanceamento de carga:
- Por quantidades de requisições, onde cada nó do cluster irá receber uma requisição por vez de modo em que nenhum dos nós fique sobrecarregado.
- Por tráfego, onde o balanceador dedica um nó do cluster para a requisição que for trafegar maior quantidade de informações enquanto que as demais requisições serão enviadas para os outros servidores.
O cenário onde será feito a configuração do cluster será descrito logo abaixo:
- IP do servidor = 192.168.56.101
- Aplicação que será utilizada neste exemplo será um sistema para pedir almoço que foi desenvolvido na empresa que eu trabalho. O Sistema é jBroca.
A configuração do balanceador de carga será feita no arquivo de configuração do Apache "httpd.conf". No CentOS arquivo de configuração do Apache fica dentro do diretório /etc/httpd/conf/.
Insira este trecho no final do arquivo
httpd.conf:
<VirtualHost 192.168.56.101:80>
ServerName 192.168.56.101
ProxyRequests Off
<Proxy 192.168.56:80>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /teste balancer://balancer lbmethod=byrequests stickysession=JSESSIONID nofailover=off
ProxyPassReverse /teste http://192.168.56.101:8080/jbroca
ProxyPassReverse /teste http://192.168.56.101:8081/jbroca
<Proxy balancer://balancer>
BalancerMember http://192.168.56.101:8080/jbroca route=node01 loadfactor=1
BalancerMember http://192.168.56.101:8081/jbroca route=node02 loadfactor=1
</Proxy>
<Location /balancer-manager>
setHandler balancer-manager
Order Deny,Allow
Deny from all
Allow from 192.168.56.101
</Location>
</VirtualHost>
Neste trecho temos a configuração de um virtualhost que será responsável pelo recebimento das requisições destinadas a url 192.168.56.101/jbroca. Segue abaixo a descrição de cada item desta configuração:
- ServerName: determina o nome do virtual host, neste caso o 192.168.56.101/jbroca.
- ProxyRequest off: determina que o Apache não será utilizado como um servidor proxy ou um reverse proxy.
- ProxyPass /teste balancer://balancer lbmethod=byrequests stickysession=JSESSIONID nofailover=off: qualquer requisição destinada ao context /teste será utilizado o balanceador de carga balancer para atender as requisições.
- lbmethod=byrequests: é onde define o tipo de balanceamento de carga, onde neste caso o balanceamento de carga é por requisição.
- stickysession=JSESSIONID : define que o Apache irá direcionar os pedidos de uma mesma seção para o mesmo servidor.
- nofailover=off: define que todos os servidores dentro cluster serão capazes de superar a falha algum servidor do cluster que se tornar inativo, o Apache desviará as requisições deste servidor para outro servidor.
As opções abaixo são configurações utilizadas para corrigir as respostas vindas dos servidores no cluster que são balanceados, baseando na requisição vinda do cliente:
ProxyPassReverse /jbroca http://192.168.56.101:8080/jbroca
ProxyPassReverse /jbroca http://192.168.56.101:8081/jbroca
Agora é onde declaramos ao balanceador de carga os membros do cluster com suas respectivas características:
<Proxy balancer://balancer>
BalancerMember http://192.168.56.101:8080/jbroca route=node01 loadfactor=1
BalancerMember http://192.168.56.101:8081/jbroca route=node02 loadfactor=1
</Proxy>
A última opção habilita o gerenciamento do balanceador de carga para os navegadores do domínio 192.168.56.101. Para visualizar o balancer-manager no navegador basta digitar:
http://192.168.56.101/balancer-manager
<Location /balancer-manager>
setHandler balancer-manager
Order Deny,Allow
Deny from all
Allow from 192.168.56.101
</Location>
Com isto, o Apache está configurado para realizar o balanceamento de carga, encaminhando as requisições para os dois servidores dentro do cluster.
Para testar se toda configuração está correta, inicie os Tomcats e inicie o Apache, se iniciar corretamente os servidores, seu cluster está funcionando e basta acessar no navegador para verificar se o balanceador está funcionando corretamente. No exemplo citado basta acessar:
http://192.168.56.101/jbroca
Acesse em diferentes navegadores e verifique se realmente o balanceador está direcionando as requisições para cada servidor. Neste exemplo que foi utilizado, a barra de endereço mostra que as requisições estão sendo balanceadas:
http://192.168.56.101/jbroca/autenticarUsuario.do;jsessionid=9225E01A70F0A90B2283244B2CF554D3.
node01
http://192.168.56.101/jbroca/autenticarUsuario.do;jsessionid=4B2BF75B6B2F99EAB791D512E52AC626.
node02
O endereço retornado mostra as requisições divididas nos dois Tomcats do cluster. O balancer-manager também mostra se as requisições estão sendo balanceadas.
Finalizamos aqui, espero que todos tenham conseguido compreender o que eu tinha para passar. A aplicação não será disponibilizada por ser utilizada somente na empresa que eu trabalho, então desenvolvam a aplicação de vocês e testem as aplicações rodando em cluster.
Qualquer dúvida é só entrar em contato que eu estarei disponível para a ajudá-los, muito obrigado a todos.