Esse tipo de cluster tem como função controlar a distribuição equilibrada do processamento.
Requer um monitoramento constante na sua comunicação e em seus mecanismos de redundância,
pois se ocorrer alguma falha haverá uma interrupção no seu funcionamento. Wikipédia
Vou assumir que já temos duas máquinas rodando a aplicação criada no passo I e devidamente configuradas para gravar
as sessões em um terceiro servidor, o banco de dados.
Estas máquinas podem ser configuradas com qualquer sistema operacional que suporte um servidor web com PHP
Para o servidor responsável pelo balanceamento de carga eu utilizo o Linux, e neste exemplo o Ubuntu Linux.
Bom, selecionei duas formas de balanceamento para exemplificar: por DNS e por Proxy.
Para o DNS vamos usar o software BIND9 e para o Proxy o Apache + mod_proxy_balancer
A tarefa destes softwares é receber as requisições e dividi-las entre os dois servidores PHP utilizando o algorítimo
mais simples de balancemento: o Round Robin.
Round Robin divide as requisições de forma igual, uma para o servidor A - outra pro servidor B,
sem levar em consideração se A já está executando muitas tarefas ou se B está com consumo muito alto de CPU e etc…
Existe vários tipos de algorítimos e o melhor deve ser escolhido após um estudo aprofundado que leve em consideração
o número de máquinas disponíveis para balanceamento e suas configurações de memória, CPU, link de rede, número de sistemas instalados…
Balanceamento por DNS
Para instalar o BIND9 no Ubuntu basta digitar a linha abaixo
sudo apt-get install bind9
Após a instalação, o servidor já está configurado para ser um servidor de DNS e ouvindo na porta 53.
O próximo passo é configurá-lo de forma que as requisições para o domínio www.exemplo.com.br
sejam redirecionadas para as máquinas com o PHP.
Criaremos então o arquivo /etc/bind/db.exemplo
$TTL 0
IN SOA dns1.exemplo.com.br. email.exemplo.com.br. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
IN MX 10 mail
mail IN A 192.168.56.107
www IN A 192.168.56.101
IN A 192.168.56.103
Note que em www eu adicionei os IPs dos servidores que vão rodar a aplicação PHP, isso já faz com que o BIND use o Round Robin
para balancear as requisições.
E agora adicionamos uma referência ao db.exemplo no arquivo /etc/bind/named.conf
zone “localhost” {
type master;
file “/etc/bind/db.local”;
};
zone “127.in-addr.arpa” {
type master;
file “/etc/bind/db.127″;
};
zone “0.in-addr.arpa” {
type master;
file “/etc/bind/db.0″;
};
zone “255.in-addr.arpa” {
type master;
file “/etc/bind/db.255″;
};
zone “exemplo.com.br” {
type master;
file “/etc/bind/db.exemplo”;
};
include “/etc/bind/named.conf.local”;
Reinicie o serviço com a linha abaixo:
sudo /etc/init.d/bin9 restart
É interessante neste momento alterar uma linha do arquivo teste.php para melhor visualização do balanceamento:
Servidor A: $_SESSION['server']= “server 1″;
Servidor B: $_SESSION['server']= “server 2″;
Hora de testar: abra a URL http://www.exemplo.com.br/teste.php com o browser e veja o resultado do balanceamento.
Balanceamento via Proxy
O Apache2 possui um módulo chamado mod_proxy_balancer. Ele é uma extensão do mod_proxy, que portanto também deve estar presente
na configuração do balanceamento de carga. O proxy balancer suporta os protocolos HTTP, FTP e AJ13.
Para quem não possui o apache2 instalado pode instalar a partir da linha abaixo:
sudo apt-get install apache2
Para instalar o mod_proxy_balance devemos copiar os arquivos do diretório /etc/apache2/mods-available
proxy_balancer.load
proxy.load
proxy.conf
proxy_http.load
para o diretório:
/etc/apache2/mods-enabled
Vamos agora configurar o módulo para operar no modo reverse proxy (ou gateway). Neste modo a requisição chega ao servidor proxy que decide quem a atenderá, e retorna o resultado ao cliente origem.
Para isso alteramos no arquivo proxy.conf a diretiva ProxyRequests para o valor off.
Segue abaixo um exemplo de como deve ficar o arquivo proxy.load
<IfModule mod_proxy.c>
ProxyRequests Off
<Proxy *>
AddDefaultCharset off
Order deny,allow
Allow from all #Isso é apenas um exemplo, configure seu proxy com segurança!!!!
</Proxy>
<Proxy balancer://meucluster>
BalancerMember http://192.168.56.103:80 #Servidor PHP A
BalancerMember http://192.168.56.102:80 #Servidor PHP B
</Proxy>
ProxyPass /teste balancer://meucluster
</IfModule>
Reinicie o Apache:
sudo /etc/init.d/apache2 restart
Neste exemplo meu servidor proxy atende pela URL www.appteste.com.br e redireciona para os IPs 192.168.56.103 e 192.168.56.102 que estão rodando a aplicação de teste.
Hora de testar: abra a URL http://www.appteste.com.br/teste/teste.php com o browser e veja o resultado do balanceamento.
Bom, acho que consegui passar uma visão de como podemos configurar um balanceamento com PHP. O assunto, claro,
não para por aqui. Existem inúmeras outras situações, configurações, problemas, soluções, algorítimos… Mas, um problema que fica claro na solução acima é o fato do load balancer se tornar mais um ponto de falha na arquitetura. Basta imaginar que se ele cair, todo trabalho está perdido e será um assunto que quero tratar nos próximos posts.
Valeu!