sexta-feira, 28 de dezembro de 2012

Alta disponibilidade com Ucarp

Uma forma muito fácil e eficiente de ter alta disponibilidade em um sistema é utilizando dois servidores rodando o Ucarp.


Vamos supor que tenhamos dois servidores rodando o Squid (pode ser com qualquer software). O master está com o ip 10.50.0.144, e o slave com 10.50.0.146. O cluster funciona disponibilizando um terceiro ip 10.50.0.145 que vai migrar entre os servidor em caso de pane no master.

O primeiro passo é instalar o Ucarp. No Debian, use:

$ apt-get install ucarp

As opções do Ucarp são as seguintes:

-i Interface de rede a ser monitorada. Ex: -i eth0
-s Ip real da interface. Ex: -s 10.50.0.144
-v Id da vlan. Podem haver outros dispositivos em cluster na rede. Cada conjunto deve conter um id único. Ex: -v 140
-p Senha usada no cluster. Ex: -p 123456
-a Ip virtual da interface. Ex: -a 10.50.0.145
-u Script a ser executado quando o equipamento em questão assumir o cluster. Ex: -a /usr/local/sbin/up.sh
-d Script a ser executado quando o equipamento em questão deixar de ser o master no cluster. Ex: -d /usr/local/sbin/down.sh
-P Diz ao ucarp para sempre tentar ser o master no cluster, mesmo após um problema neste nó. Se essa opção não for especificada, caso aconteça algo no master, o cluster vai migrar para o slave, mas não voltará quando o master voltar a operar normalmente.
-B Faz o ucarp rodar em segundo plano. 

No nosso exemplo, basta colocar a seguinte linha dentro do arquivo /etc/rc.local do servidor que será master.

/usr/sbin/ucarp -i eth0 -s 10.50.0.144 -v 140 -p 123456 -a 10.50.0.145 -u /usr/local/sbin/up.sh -d /usr/local/sbin/down.sh -P -B

No slave, inclua a mesma linha, omitindo o parâmetro -P

/usr/sbin/ucarp -i eth0 -s 10.50.0.144 -v 140 -p 123456 -a 10.50.0.145 -u /usr/local/sbin/up.sh -d /usr/local/sbin/down.sh -B

Em seguida, crie o arquivo /usr/local/sbin/up.sh em ambos os servidores. Este arquivo deve conter os comandos necessários para que o servidor assuma as funções de master, como por exemplo levantar a interface virtual e reiniciar os processos para que estes façam bind na nova interface. No nosso exemplo,  o script terá o seguinte conteúdo:

#!/bin/bash
/sbin/ifconfig eth0:0 10.50.0.145 netmask 255.255.255.0
/etc/init.d/squid3 start

Crie também o arquivo /usr/local/sbin/down.sh em ambos os servidores. Esse arquivos deve conter os  comandos necessários para que o servidor deixe de ser master. No nosso exemplo, bastaria o seguinte:

#!/bin/bash
/sbin/ifconfig eth0:0 down
/etc/init.d/squid3 stop

Torne os dois arquivos executáveis em ambos os servidores.

$ chmod +x /usr/local/sbin/up.sh /usr/local/sbin/down.sh

Reinicie os servidores e faça os testes. Eu uso o Ucarp em cluster de gateways, proxys e bancos de dados há quase dois anos e ele sempre funcionou perfeitamente. 

Obs: Essa solução envolve alta disponibilidade para problemas de rede. Problemas com desempenho e bug em aplicações não são contemplados nesta solução.