Pages

Saturday, September 15, 2007

Alta Disponibilidade - Debian

Os softwares utilizados são: Heartbeat e DRBD

O Heartbeat é utilizado para fazer a alta disponibilidade, detectando quando existe falha em um nodo e ativando o outro.

O DRBD é utilizado para fazer a replicação dos dados via rede, (RAID-1).

Pré-requisitos

Debian 3.1r3
Dois computadores
3 placas de rede cada


Faça a instalação padrão do debian e começe a configuração.
Topologia

A topologia criada para esta implementação foi a seguinte:

Nó 1 (ha-cluster1)
eth0 - 192.168.12.231
eth1 - 10.0.1.1 (drbd)
eth2 - 10.0.0.1(heartbeat)

Nó 2 (ha-cluster2)
eth0 - 192.168.12.232
eth1 - 10.0.1.2 (drbd)
eth2 - 10.0.0.2 (heartbeat)



Endereço virtual do cluster: 192.168.12.233 (Este endereço não pode ser setado manualmente em nenhum dos nós, logo veremos como fazer a sua configuração)
Pacotes necessários

heartbeat
drdb0.7-util
module-assistant


DRBD

DRBD – Distributed Replicated Block Device – é um serviço projetado para construir cluster de alta disponibilidade. Consiste de um módulo de kernel e scripts associados. Isto é feito espelhando um conjunto de blocos via rede (dedicada ou não). Você pode vê-lo como um serviço semelhante a um RAID via rede.

O DRBD toma conta dos dados, escritos no disco rígido local e envia-os ao outro host. No outro host, ele escreve os dados no disco.

Cada dispositivo (drbd provê mais de um destes dispositivos) tem um estado, que pode ser primário ou secundário. No nodo com o dispositivo primário, a aplicação está executando e tem acesso ao dispositivo (/dev/drbdX). Toda escrita é enviada para o dispositivo de bloco do nível mais baixo e para o dispositivo secundário. O secundário simplesmente escreve o dado no dispositivo de bloco de nível mais baixo. Leituras são sempre realizadas localmente.

Se o nodo primário falhar, o serviço Heartbeat (veremos em seguida) tornará o dispositivo secundário para primário e iniciará as aplicações. Se o nodo que falhou retornar, ele se torna o secundário e sincroniza seus dados com o primário. Isto é feito sem nenhuma interrupção do serviço em background.

Atualizando o module-assistant

# m-a update


Baixando, compilando e instalando os módulos (este procedimento baixa o modulo do drbd que está no repositório e compila o mesmo)

# m-a a-i drbd0.7-module-source


A configuracao é feita a partir do arquivo /etc/drbd.conf e deve ser igual nas duas maquinas do cluster. O arquivo /etc/hosts deve estar configurado corretamente nos dois nodos.

192.168.12.231 ha-cluster1
192.168.12.232 ha-cluster2


O arquivo /etc/drbd.conf deve ser igual nos dois nodos do cluster, seu conteúdo está abaixo:

resource r0 {
protocol C;
incon-degr-cmd "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ; halt -f";
startup {
wfc-timeout 10; # Tempo de espera para determinar uma conexão interrompida
degr-wfc-timeout 25; # Tempo de espera pelo outro nodo para sincronia (no boot)
}
disk {
on-io-error panic; # Em caso de erro, gera um Kernel panic para a segunda assumir
}
net {
timeout 20; # 2 segundos (unit = 0.1 seconds)
connect-int 10; # 10 segundos (unit = 1 second)
ping-int 3; # 3 segundos (unit = 1 second)
on-disconnect reconnect; # Se desconectar tente reconectar
}
syncer {
rate 500M; # Taxa de sincronização
group 1; # Grupo de sincronia (como so temos um grupo r0 ativo não faz diferença)
}
on ha-cluster1 {
device /dev/drbd0; # Disco drbd utilizado
disk /dev/sda8; # Partição do disco do server ha-cluster1 utilizada
address 10.0.1.1:7788; # Endereço para comunicação entre os nodos
meta-disk internal; # Grava na mesma partição que está espelhando os dados para a sincronia
}
on ha-cluster2 {
device /dev/drbd0; # Disco drbd utilizado
disk /dev/sda6; # Partição do disco do server ha-cluster2 utilizada
address 10.0.1.2:7788; # Endereço para comunicação entre os nodos
meta-disk internal; # Grava na mesma partição que está espelhando os dados para a sincronia
}
}


O DRBD utiliza 3 tipos de protocolos e suas descrições estão abaixo, os mais confiáveis e robustos são o B e o C.

A Uma operação de escrita é considerada completa tão logo o dado é escrito no disco e enviado para a rede.
B Uma operação de escrita é considerada completa tão logo a confirmação de recepção pelo outro nodo chegue.
C Uma operação de escrita é considerada completa tão logo a confirmação de escrita venha do outro nodo.


Para que o drbd funcione, é necessário que seja carregado o seu módulo nas duas máquinas que irão executar o sistema.

Execute o comando abaixo nas nas duas máquinas:

# modprobe drbd

Para verificar se o módulo carregou corretamente verifique o conteúdo do arquivo /proc/drbd com o seguinte comando:

# cat /proc/drbd

O resultado deverá ser parecido com:

version: 0.7.10 (api:77/proto:74)
SVN Revision: 1743 build by phil@mescal, 2005-01-31 12:22:07
0: cs:Unconfigured
1: cs:Unconfigured

Após a carga dos módulos, será necessário iniciar e conectar o drbd dos dois servidores. Para esta finalidade execute o comando abaixo:

# drbdadm up all

Para verificar se o DRBD iniciou e conectou com sucesso, execute o comando:

# cat /proc/drbd

O resultado deverá ser semelhante a:

version: 0.7.10 (api:77/proto:74)
SVN Revision: 1743 build by phil@mescal, 2005-01-31 12:22:07
0: cs:Connected st:Secondary/Secondary ld:Inconsistent
ns:0 nr:0 dw:0 dr:0 al:0 bm:656 lo:0 pe:0 ua:0 ap:0
1: cs:Unconfigured

O importante nessa saída são as a linhas do dispositivo drbd que foi criado, observe o número 0.

É necessário tornar uma das máquinas primária do cluster, para isso deve ser executado o comando abaixo.

# drbdadm -- --do-what-I-say primary all

Para acompanhar o progresso da sincronização.

# watch -n1 cat /proc/drbd

Algo parecido com isto abaixo deve ser mostrado…

version: 0.7.10 (api:77/proto:74)
SVN Revision: 1743 build by phil@mescal, 2005-01-31 12:22:07
0: cs:SyncSource st:Primary/Secondary ld:Consistent
ns:2574832 nr:0 dw:0 dr:2582936 al:0 bm:157 lo:0 pe:25 ua:2026 ap:0
[==========>.........] sync'ed: 54.3% (2126/4641)M
finish: 0:03:08 speed: 11,512 (11,340) K/sec
1: cs:Unconfigured

Quando a sincronização estiver concluída, o resultado do comando “cat /proc/drbd” deverá ser semelhante ao abaixo:

version: 0.7.10 (api:77/proto:74)
SVN Revision: 1743 build by phil@mescal, 2005-01-31 12:22:07
0: cs:Connected st:Primary/Secondary ld:Consistent
ns:4752656 nr:0 dw:0 dr:4752656 al:0 bm:291 lo:0 pe:0 ua:0 ap:0
1: cs:Unconfigured

Um detalhe importante e que deverá ser reparado é que o estado em uma das máquinas será primário e na outra secundário, além disso é importante reparar que o ld está consistente, demonstrando que os dispositivos das duas máquinas estão sincronizados.

Caso não tenha definido um sistema de arquivo, pode ser criado com o comando abaixo (em caso de ext3)

# mkfs.ext3 /dev/drbd0

Montando o dispositivo criado: Para montar o dispositivo criado execute o comando na máquina primária.

# mount -t ext3 /dev/drbd0 /mnt

Para desmontando o dispositivo criado execute o comando na máquina primária.

# umount /dev/drbd0

Se necessário rodar o fsck, na máquina primária execute o comando:

# fsck /dev/drbd0

Para alternando entre Primário e Secundário, se for realmente necessário fazer isso. Na máquina primária execute o comando:

# drbdadm secondary all

Na máquina secundária execute o comando:

# drbdadm primary all

Parando e iniciando o serviço DRBD. Pode ser feito através do seu script.

# /etc/init.d/drbd stop
# /etc/init.d/drbd start

Ou manualmente, torne a máquina secundária:

# drbdadm secondary all

Desligue e desconecte o drbd:

# drbdadm down all

Por fim, remova o módulo:

# rmmod drbd

Altere o arquivo /etc/fstab deixando semelhante ao abaixo, pois a partição não deve ser montada pelo sistema e sim pelo DRBD.

/dev/drbd0 /dados ext3 noauto 0 0


Heartbeat

O Heartbeat, desenvolvido pela equipe www.linux-ha.org, é usado para construir clusters de alta disponibilidade. Ele pode fazer 2 nodos IP (na versão 2 é possível criar até 16 nodos) capazes de assumirem os recursos e serviços de um número ilimitado de interfaces IP. Ele trabalha enviando um “heartbeat” (Batida de coração) entre 2 máquinas através de uma ligação serial, Ethernet, ou ambas. Se o heartbeat falhar, a máquina secundária irá detectar que a primária falhou, e assume os serviços que estavam rodando na máquina primária.

O diretorio padrão de configuração é /etc/ha.d/

O Arquivo ha.cf é onde definimos as configurações para o heartbeat. Pode ser visto logo abaixo o conteúdo deste arquivo em ambos os nodos.

Nodo principal

logfacility daemon
ucast eth2 10.1.1.2
node ha-cluster1
node ha-cluster2
keepalive 3
deadtime 10
warntime 10
initdead 60
ping 192.168.12.1
auto_failback off
respawn hacluster /usr/lib/heartbeat/ipfail

Nodo Secundário

logfacility daemon
ucast eth2 10.1.1.1
node ha-cluster2
node ha-cluster1
keepalive 3
deadtime 10
warntime 10
initdead 60
ping 192.168.12.1
auto_failback off
respawn hacluster /usr/lib/heartbeat/ipfail


Uma breve explicação sobre os parâmetros utilizados

logfacility - Utiliza o syslog para gravar os logs utilizando a opção daemon
ucast - Utiliza a interface eth2 para se comunicar com o outro outro nodo
node - Indica os nodos do cluster (sendo o primeiro ele mesmo)
keepalive - Tempo que o heartbeat utiliza para verificar se a outra máquina está ativa
deadtime - Tempo que indica se um nodo está morto
warntime - Tempo de espera antes de emitir o aviso de heartbeat atrasado
initdead - Tempo de espera após reinicialização do sistema (casos onde a rede demore algum tempo para se tornar ativa)
ping - Endereço da rede que não caia nunca utilizado pelo heartbeat para verificar a disponibilidade da rede
auto_failback - Faz com que a máquina retorne ou não os serviços. Neste caso está setado para off
respawn - Utilizado pelo heartbeat

Para que as máquinas tenham uma relação de confiança é preciso criar um par de chaves e pode ser criado automaticamente, baixe o arquivo abaixo.

# wget http://www.linux-ha.org/_cache/GeneratingAuthkeysAutomatically__gen_authkeys.sh

Execute o mesmo e verifique o conteúdo do arquivo /etc/ha.d/authkeys, estará setada uma chave como abaixo.

# Key automatically generated by GeneratingAuthkeysAutomatically__gen_authkeys.sh
auth 1
1 sha1 ed6444182f5dd573c6abc31d563419f3

Copie o arquivo authkeys para o outro nodo utilizando o scp.

# scp authkeys root@ha-cluster2:/etc/ha.d/

O arquivo /etc/ha.d/haresources é onde se configura os comandos que serão executados quando um nó cair e o outro assumir e deve ser igual nos dois nodos do cluster, seu conteúdo está abaixo:

ha-cluster1 192.168.12.233 MailTo::root@localhost::Problema-Cluster drbddisk::r0 Filesystem::/dev/drbd0::/dados::ext3 apache2 mysql


Onde,

ha-cluster1 - É o nome de uma das máquinas
192.168.12.233 - É o endereço IP virtual do Cluster (as aplicações da rede devem chamar os sistemas através deste endereço
MailTo - Envia um email para o usuário que você configurar informando quando o cluster tem algum problema de reinicialização
drbddisk - Monta o disco do DRBD

apache2 e mysql - São os serviços utilizados no cluster

Ex.: Se o nodo principal cair, ele para o apache2 e o mysql e starta os serviços no nodo secundário. Quando o nodo principal retornar, o secundário continua respondendo como o nodo principal e só retorna a ser secundário manualmente, isso para não deixar o sistema inoperante, pois uma vez que esta mudança é feita existe um delay de aproximadamente 20 segundos para um nodo parar e o outro assumir.

1 comment:

  1. Bom dia Fábio meu nome é Alan estou fazendo meu projeto de TCC1 e gostaria de falar sobre Cluster de Alta Disponibilidade.
    Eu levei o tema ao professor e ele mim perguntou o que eu tenho para acrescentar com relação ao tema? e eu realmente não soube lhe responder.

    Gostaria de uma opinião sua que é um cara mais experiente nessa área do que eu, o que posso acrescentar (colocar nem que seja um tijolinho) nesse projeto de cluster de Alta Disponibilidade?

    Um abrço e estou esperando a resposta.

    meu msn: slinkp@hotmail.com

    Alan

    ReplyDelete