Filed Under (software livre) by rafaelgomes on 21-07-2009
Para quem não sabe o que é um sistema de alta disponibilidade, aconselho que leia esse verbete do Wikipédia.

Nesse artigo irei explicar como criar um ambiente de alta disponibilidade do apache em servidor Gnu/Linux, utilizando somente ferramentas sob licenças livres.
Meu ambiente é o seguinte
Servidor 1
Nome : server1
Distro: Debian Etch
IP : 192.168.1.1
Servidor 2
Nome: server2
Distro: Debian Etch
IP : 192.168.1.2
Vamos lá! Mãos a obra.
Execute o seguinte comando em ambas máquinas:
# aptitude install mon heartbeat-2 -y
Pronto! Agora já temos os pacotes necessários instalados.
Vamos começar pela configuração do heartbeat.
Em ambas máquinas o arquivo de configuração /etc/ha.d/ha.cf deve estar com o mesmo conteúdo:
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 10
warntime 5
initdead 20
udpport 694
bcast eth0
auto_failback yes
ping <coloque aqui o ip do gateway>
node server1
node server2
Agora vamos para o arquivo /etc/ha.d/authkeys, que também deve ser igual em ambas máquinas:
auth 1
1 md5 teste
Agora no /etc/ha.d/haresources existe uma pequena diferença entre os servidores
No servidor 1 coloque o seguinte conteúdo:
server1 192.168.1.1 apache2
server2 192.168.1.2
No servidor 2 coloque o seguinte conteúdo:
server1 192.168.1.1
server2 192.168.1.2 apache2
Agora fica a pergunta; “por que a diferença?” Irei explicar mais abaixo.
Execute /etc/init.d/heartbeat start (primeiro no server1 e depois no server2).
Vamos a explicação geral de como o heartbeat irá funcionar:
Os dois daemons estarão conversando pela porta udp informada no ha.cf, que nesse caso foi udp 694. Dessa forma eles saberão se o outro está ativo. Uma vez não conseguindo se comunicar com o outro, ele fará um teste com o gateway, por isso que precisamos especificá-lo no ha.cf.
Após todos os testes de comunicação com o gateway retornando sucesso, o host irá tomar pra sí a responsabilidade dos recursos do outro host. No nosso caso o endereço ip do server2.
No caso do server1 descobrir que ele está fora, pois não consegue se comunicar com o gateway, ele mesmo irá desliga seus recursos.
Agora vem a melhor parte. Após o analista verificar o que aconteceu e resolver o problema. É apenas executar /etc/init.d/heartbeat start na maquina afetada, que ela automaticamente retornará a suas atividades automaticamente.
Atente para NÃO deixar o apache2 setado para iniciar automaticamente e nem o ip informado no haresource esteja em nenhuma interface ativa da máquina, pois o próprio heartbeat irá gerenciar esses recursos. Executando o heartbeat, automaticamente estará executando a interface virtual com o ip informado e o serviço do apache2.
Vamos usar um cenário hipotético para facilitar o entendimento:
O server1 está executando sem problemas suas atividades, porém o server 2 não está respondendo na porta UDP 694.
O server2 está ok, porém o estagiário esbarrou no cabo de rede e ele perdeu conectividade. O próprio server2 irá perceber que não consegue se comunicar com o gateway e então ele mesmo irá desligar o serviço do heartbeat, assim desligando junto a ele todos os recursos informados no haresource, nesse caso a interface virtual e o serviço apache2.
Nesse mesmo momento o server1 estará verificando o arquivo haresource, para saber qual é o recurso do server2 para que ele possa ser o responsável agora. Sendo assim o server1 agora terá duas interfaces virtuais com seus respectivos ips virtuais.
O analista foi ao CPD e verificou que o problema era apenas o cabo de rede e reconectou. Bastou ele acessar o server2 e executar o seguinte comando para que o server2 voltasse a ativa:
# /etc/init.d/heartbeat start
O server2 irá solicitar ao server1 seus recursos. Novamente o server1 irá consultar no haresource, quais os recursos do server2. Se houvesse o nome apache2 depois do ip. O server1 iria desligar seu servidor apache2, achando que somente o server2 pode ter esse serviço. Por isso tiramos o apache2 do outro nó.
Após isso o server2 estará de volta funcionando sem problemas com seu ip virtual.
Agora vamos ao Mon.
Ambos os servidores devem ter o arquivo /etc/mon/mon.cf com o seguinte conteúdo:
alertdir = /usr/lib/mon/alert.d
mondir = /usr/lib/mon/mon.d
maxprocs = 20
histlength = 100
randstart = 60s
hostgroup www 192.168.1.1 (no caso de ser o server1) ou 192.168.1.2 (no caso de ser o server2)
watch www
service http
interval 30s
monitor http.monitor
allow_empty_group
period wd {Sun-Sat}
alert heartbeat.alert
alert mail.alert -S “web server is down” seu@email.com
upalert mail.alert -S “web server is up” seu@email.com
alertevery 1m
Um detalhe importante antes de executar o mon é baixar esse arquivo e colocá-lo na pasta /usr/lib/mon/alert.d
Após isso abra o arquivo /usr/lib/mon/alert.d/heartbeat.alert e edite a seguinte linha:
De:
# shutdown heartbeat
system (“/etc/init.d/heartbeat stop”);
Para
# shutdown heartbeat
system (“sudo /etc/init.d/heartbeat stop”);
Como percebeu agora precisaremos configurar o sudo. Entre em /etc/sudoers e adicione a seguinte informação:
daemon ALL=NOPASSWD:/etc/init.d/heartbeat stop
Pronto, agora execute o daemon do mon com o comando /etc/init.d/mon start e fique mais tranquilo com dois apache rodando ao mesmo tempo em um ambiente de alta disponibilidade.
Obs: Lembre-se de verificar se os daemons estão devidamente configurados para iniciarem sozinhos (no caso do mon e heartbeat) e para NÃO iniciar sozinho (que é o caso do apache2).
moodleteste2 10.0.1.43


Pow Rafael… Parabens. Bem explicado. Clustering é um assunto muito interessante.
Hola Rafael,
Muy bueno el artículo…
Un duda ¿Porqué GNU/Linux Debian en lugar de Fedora/CentOS? Tiene algún motivo técnico..
Tengo que hacer un montaje parecido al que explicas en tu artículo y estoy valorando que distribución utilizar.
Muchas gracias.
Oscar,
Não há nenhum motivo técnico. O debian é a distribuição utilizada na empresa que trabalho. Sendo me pouparia trabalho para criação do artigo.
Minha máquina desktop é Fedora 11, ou seja, não tem problema.
Com esse artigo muda bem pouco para o Fedora/Centos.
O comando de instalação dos pacotes para ser mais exato:
Onde tem:
aptitude install mon heartbeat-2 -y
Use:
yum install mon heartbeat -y
Pronto!
Opa, eu acabei chegando aqui para tentar resolver um problema bem simples que eu estou tendo com o heartbeat.
Seguindo o GettinStarted.html que vem no pacote, no meu caso é CentOS, eu fiz tudo bem parecido com o que você descreve (não estou usando o tal mon), menos no haresources, aonde é dito que o arquivo deve ser identico nas duas máquinas, entao eu seto algo assim:
maquina1 IP::/servicos (nas duas maquinas)
E também é dito que você deve ter duas ethernet’s, no caso uma para a comunicação interna e a outra que vai assumir quando der pepino, aí:
bcast eth1
A coisa roda, eu analisei tudo, desde o trafego na eth1 de cada maquina como fiquei observando os log’s delas, quando eu derrubo uma maquina, e está tudo lá, tudo ok, mas o problema é que se eu derrubo o server1, maquina1, a principal, a maquina2 nao ativa o IP ‘externo’, que no caso é tudo interno.
No caso, eu não tinha setado o ping no ha.cf (vou setar quando chegar em casa, e setar também as novas modificações no haresource para testar).
Agora, desculpe-me te usar como fonte de pesquisa, aonde eu estou errando?
Eu acredito que o problema possa ser o ping mesmo, pois isso serve para o host verificar se o outro caiu ou ele próprio, assim ele pinga o gateway e verifica se está up ou não.
Se após isso o problema persistir, verifique o log de ambas máquinas.
Como você está utilizando CentOS veja isso em:
# tail -f /var/log/messages
Deixe isso rodando em ambas máquinas e derrube uma em outro terminal e veja os logs, isso me ajudou bastante.
[...] devem lembrar, fiz um post sobre como configurar o mon e o heartbeat para alta disponibilidade do Apache, [...]
ola rafaelgomes, muito bem explicado os passos, so tou com um probleminha basico…
qual o ip posso utilizar como gateway??
fiz como vc estou utilizando apenas duas maquinas.
Jamilson,
O ip que configurou para essas máquinas não estão em uma rede que tem um gateway?
Tipo, máquina 1 ip 192.168.0.10 e máquina 2 ip 192.168.0.11 ambas estão na rede 192.168.0.0/24 que têm como gateway dessa rede o ativo 192.168.0.1
Nesse caso o gateway seria o 192.168.0.1.
Se estiver usando uma rede /30 para apenas os dois ips, coloca que um é o gateway do outro e pronto!
tenho o seguinte….
estou utilizando maquina virtual, instalei 2 maquinas virtuais ambas com sistema ubuntu e configurado da maneira q esta descrita aqui..
server1-> ip: 192.168.80.10
server2-> ip: 192.168.80.11
a maquina virtual por sua vez traz ip para minha maquina real como 192.168.80.1 e outra rede com ip 192.168.152.1
posso utilizar o gateway 192.168.80.1??
Nesse caso o gateway pode ser o 192.168.80.1 mesmo, já que o 192.168.152.1 seria ainda roteado.
Teste e nos informe se ficou tudo ok.
pois é rafael… depois de um bom tempo tentando ainda naum consegui… quando inicializo o serviço do heartbeat ele traz a mensagem..
INFO: Resouces is stopped
INFO: Resouces is stopped
DONE.
me da uma luz ai…
Essa mensagem é normal, isso aparece dessa forma mesmo, porém veja se há outros erros no log do seu so, no caso do Debian olha no /var/log/syslog, dessa forma toda informação de erro necessária para debugar.
IPaddr[4960]: 2009/09/17_19:39:23 ERROR: /usr/lib/heartbeat/findif failed [rc=1].
IPaddr[4945]: 2009/09/17_19:39:23 ERROR: Generic error
ResourceManager[4860]: 2009/09/17_19:39:23 ERROR: Return code 1 from /etc/ha.d/resource.d/IPaddr
essa saum as linhas de erros… tou utilizando o ubuntu 9.04 e heartbeat 2.1.4.
ok… rafael… ta funfando aki agora…
agora tenho q testar…
configurei como vc falou, mais me tira uma duvida, quando vou testar na minha maquina (win XP) eu coloco o ip do gateway??
fiz assim… coloquei no meu browser IE o ip 192.168.80.1 (gateway) mais diz pagina nao encontrada… como realizo os testes???
obrigado..
O teste é somente derrubar uma máquina, assim a outra assumirá tranquilamente.
isso… mais tou testando como um servidor web.. onde tenho q acessar uma pagina web vinda de um servidor…
so que como faço para acessar essa pagina web… tentei acessar com o ip do gateway mais nao encontra…
como acesso a pagina web..???
hei rafael como faço para configurar o ip virtual..?? até agora nao consegui…
O ip virtual é configurado no resources. No post tem explicando como fazer.
aew rafael depois d muito tentar vi q a versao do heartbeat q tou utilizando e 2.X…
e para essa versao nao usa o haresources como configuracao por isso tava dando erro.. [e usado o arquivo cib.xml… valeu pela ajuda..
Opa, muito bom artigo Rafael!! Parabéns!
Comecei trabalhar com linux a pouco tempo e estou tentando implementar o Heartbeat tbm. Fiquei com dúvida na seguinte parte:
“Em ambas máquinas o arquivo de configuração /etc/ha.d/ha.cf deve estar com o mesmo conteúdo”
Não tem esse arquivo nessa pasta. Estou usando o Ubuntu 9.04.
root@elsonjr:/etc/ha.d# ls
conf cts harc rc.d README.config resource.d shellfuncs
Vc pode dar essa ajudinha ae??
Abraçs
Meu caro Elson,
Realmente o arquivo não vem criado. Pode criar o arquivo do zero com o conteúdo que informei.
olá, gostei do seu artigo, bem explicado,
mas fiquei com uma dúvida:
de acordo com o arquivo haresources
Os dois server assumem IPs virtuais diferentes?
e outra coisa, no caso do Mon, se o serviço voltar a funcionar, tem como gerar um comando para o heartbeat startar novamente?
Ricardo,
Ele assume ips virtuais diferentes, caso queria que seja alta-disponibilidade e alto-desempenho.
Para o caso do Mon, não aconselho fazer isso, pois em caso de intermitência, será um problema.