Monitoramento e gerência de processos no servidor

Filed Under (Failover) by admin on 11-09-2009

Vários são os serviços disponibilizados por um servidor: e-mail, http, database…. e todos sujeitos a falhas ou a um mal funcionamento que pode comprometer outros sistemas e na pior hipótese toda máquina.
É preciso então que estes sistemas sejam monitorados e em caso de falha ou mal funcionamento que os
administradores sejam notificados.
Neste post vou apresentar como isso pode ser facilmente configurado através do Monit.

O Monit é um utilitário UNIX de monitoração e gerência de processos. Ele é capaz de
 identificar que um processo (serviço, sistema…) caiu ou se está consumindo memória ou cpu excessivamente.
Quando identifica uma situação anormal o Monit notifica os administradores e restaura o processo.
Existem também recursos de monitoramento de arquivos, diretórios e sistema de arquivos que não serão abordados neste post,
mas que são muito úteis.

O site do Monit é o http://mmonit.com/monit/

Instalação

Neste exemplo vamos monitorar o funcionamento do apache (obs: o Monit pode ser configurado para monitorar vários processos)

Faça o download do arquivo e descompacte-o:

 tar zxvf monit-x.y.z.tar.gz
 cd monit-x.y.z

Execute o ./configure e verifique se todas as dependências estão instaladas no seu Linux.

Se estiver tudo ok entao: make && make install

O Monit é instalado no /usr/local/bin e o arquivo de configuração monitrc eu criarei no /etc
Configuração
extraído do original http://mmonit.com/monit/documentation/monit.pdf

(1) # Monit control file
(2)
(3) set daemon 60
(4) set logfile syslog facility LOG_daemon
(5) set mailserver mail.meuserver.com
(6) set alert sysadm@meuserver.com
(7) set httpd port 2812 address localhost
(8) allow localhost
(9) allow admin:monit
(10)
(11) check process apache with pidfile “/var/run/apache2.pid”
(12) start = “/etc/init.d/apache2 start”
(13) stop = “/etc/init.d/apache2 stop”
(14) if failed port 80 and protocol http
(15) and request “/index.html” then restart
(16) if cpu usage is greater than 60 percent for 2 cycles then alert
(17) if cpu usage > 98% for 5 cycles then restart
(18) if 2 restarts within 3 cycles then timeout
(19) alert foo@meuserver.com
A linha é apenas um comentário. Na linha 3, o monit é configurado para iniciar no modo dæmon e verificar cada serviço em
ciclos de 1 minuto (valor em segundos). na linha 4 , o monit informa que o  log de erros e as mensagens de status utilizarao o  syslog.
O Monit precisa de um servidor SMTP server para enviar as mensagens de alerta, e na linha 5 especificamos
o endereço do SMTP server que o monit deve usar. A linha 6 define o e-mail que receberá os alertas sysadm@meuserver.com
A linha 7 inicia o servidor http próprio do monit. Este servidor HTTP será acessado para visualizar a interface de monitoramento e gerência (fig. 1 e fig. 2)
A linha 8 define que o servidor http dele poderá ser acessado apenas de localhost
e a linha 9 adiciona um usuário/senha para que o o servidor http do monit possa ser acessado via
HTTP Basic Authentication

Informações sobre o processo a ser monitorado

A linha 11 informa qual processo vamos monitorar, ela contém um identificador para o processo e o caminho para o pidfile dele.
Se desejamos que o monit inicie, pare ou reinicie um processo devemos configurar os comandos start e stop.
As linhas 12-13 definem os comandos para parar e iniciar o apache.
Na linha 4 configuramos o monit para estabelecer uma conexao com o servidor apache e solicitar o arquivo index.html
Se este teste falhar, monit irá reiniciar o processo do apache.
Nas linhas 16-17 o processo é testado quanto ao uso dos recursos de cpu da máquina e executa as tarefas necessárias de alerta ou reiniciar.
Finalizando o e-mail para onde o monit enviará e-mails caso o serviço configurado falhe.
O ideal é que o monit inicie junto com o linux, mas para testar você pode iniciá-lo simplesmente chamndo: monit e para para-lo: monit quit
É prudente antes de iniciá-lo executar monit -t para verificar se não existem erros na configuração do monitrc.

Até apróxima ;-)

Balanceamento de Carga com PHP - Parte II

Filed Under (Clustering, PHP) by admin on 19-08-2009

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!