Alta disponibilidade do apache com Heartbeat e Mon

23

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).

paripiranga 10.0.1.42 apache2
moodleteste2 10.0.1.43

Comments posted (23)

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! :D

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. :D

[...] 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! :D

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.

Write a comment