terça-feira, 20 de dezembro de 2011

INSTALANDO DRBD + HEARTBEAT NO DEBIAN 6.0

Acertar repositórios# REPOSITÓRIO OFICIAL
deb ftp://ftp.br.debian.org/debian squeeze main contrib non-free
deb-src ftp://ftp.br.debian.org/debian squeeze main contrib non-free

# REPOSITÓRIO DE ATUALIZAÇÕES DE SEGURANCA
deb http://security.debian.org/ squeeze/updates main contrib non-free
deb-src http://security.debian.org/ squeeze/updates main contrib non-free

# REPOSITÓRIO DE ATUALIZAÇÕES PROPOSTAS
deb ftp://ftp.br.debian.org/debian squeeze-proposed-updates main contrib non-free
deb-src ftp://ftp.br.debian.org/debian squeeze-proposed-updates main contrib non-free

# aptitude update

Acertar o arquivo nas duas máquinas
# vim /etc/hosts127.0.0.1         localhost
192.168.254.14    node1.local       node1
192.168.254.15    node2.local       node2 
 
Por se tratar de um sistema de alta disponibilidade e importante manter a sincronia também da hora do sistema.

# aptitude install ntpdate tzdata
#
ntpdate a.ntp.br
# hwclock --systohc

Instalar o DRBD
# aptitude install drbd8-utils

# carregar os módulos, faça isso nas duas máquinas.modprobe cn
modprobe drbd
Configurando o DRBD e inserir o seguinte parâmetro
# vim /etc/drbd.d/global_common.conf

global {
    usage-count no;
( Este arquivo deve existir nas 2 máquinas)
# vim /etc/drbd.d/r0.res
( Este arquivo deve existir nas 2 máquinas)
#!/bin/bash


resource r0   {
protocol C;
handlers                     {
                                     pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";
                                     pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";
                                     local-io-error "echo o > /proc/sysrq-trigger ; halt -f";
                                     pri-lost "echo primary DRBD lost  | mail -s ‘DRBD Alert’ adm@gmail.com adm@gmail.com";
                                     }
startup           {
                                     degr-wfc-timeout 60;   
                         }
disk                 {
                                     on-io-error   detach;
                         }
net                   {
                                     sndbuf-size 512k;
                                     timeout       60;   
                                     connect-int   12;  
                                     ping-int      12; 
                                     ping-timeout   9;
                                     max-buffers     20480;
                                     cram-hmac-alg "sha1";
                                     shared-secret "ff3421bc";
                                     after-sb-0pri discard-older-primary;
                                     after-sb-1pri violently-as0p;
                                     after-sb-2pri disconnect;
                                     rr-conflict disconnect;
                         }
syncer            {
                                     rate 100M;                               
                                     al-extents 257;
                         }
                on hachi     {
                                     device     /dev/drbd0;
                                     disk       /dev/sda7;
                                     address    192.168.254.14:7793;
                                     meta-disk internal;
                                     }

                on narnia                {
                                     device    /dev/drbd0;
                                     disk      /dev/sda7;
                                     address   192.168.254.15:7793;
                                     meta-disk internal;
                                     }
            }
Criar os meta dados e a partição  (Executar nas 2 máquinas)
Preparar o disco, faça isso nos dois servidores.










Selecione o espaço livre, depois clique em [New] digite o tamanho desejado para a partição: Ex 5120 (5GB) pressione [Enter] em seguida [Beginning] logo em seguida aperte [Write] aparecerá a mensagem
Are you sure you want to write the partition table to disk? (yes or no): yes depois pressione [Quit.]

[Reinicie as duas máquinas]
Zerar as partições (os comandos devem ser executado nas duas máquinas)
dd if=/dev/zero of=/dev/sda7 bs=1M count=128
Inicializando os recursos (Executar nas  2 máquinas)
#  drbdadm create-md r0
#  modprobe drbd
#  drbdadm up r0


Sincronizando pela primeira vez (Executar só no primeiro nó)
# drbdadm -- --overwrite-data-of-peer primary r0
Aguardar a finalização do sincronismo, o tempo depende do tamanho do recurso e velocidade da conexão entre os nó. Os logs podem ser acompanhados em cat /proc/drbd.
 Após a sincronia o log deverá ter a seguinte saída:
version: 8.3.7 (api:88/proto:86-91)
srcversion: EE47D8BF18AC166BE219757
 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r----    ns:247044 nr:0 dw:0 dr:253992 al:0 bm:14 lo:1 pe:46 ua:211 ap:0 ep:1 wo:b os:4750388
        [>...................] sync'ed:  5.0% (4636/4876)M
        finish: 0:04:42 speed: 16,640 (24,560) K/sec
Iniciando o servico do DRBD (Executar nos 2 nós)# /etc/init.d/drbd startFormatando o dispositivos criados nos passos anteriores (somente no primeiro nó)
mkfs.ext4 /dev/drbd0
mkdir /dados
( nome do diretório opcional – executa nos dois nós ) mount -t ext4 /dev/drbd0 /dados (Executar no nó primário)
Para certificar se realmente o dispositivo foi montado digite:
df-h verifique se o diretório /dados foi montado
Realizando Testes
Crie um arquivo no diretório onde foi montado o drbd, por exemplo: # cd /dados
# touch teste

Desmonte o dispositivo: 
# cd /
# umount /dados

Torne o nó primário em secundário: 
# drbdadm secondary all 
Tornar a outra máquina em primária: 
Na outra máquina digite: 

# drbdadm primary all 

Montar o dispositivo na nova máquina primária: 
# mount -t ext4 /dev/drbd0 /dados

Verificar se o arquivo criado no nó primário antigo, existe na nova primária:

Instalando Heartbeat
(Executar nos dois nós)
# aptitude install heartbeat
Configurações
No debian por padrão não existe os arquivos modelos no diretório /etc/had.d então temos que copiar uma copia dos mesmos.

# cp /usr/share/doc/heartbeat/authkeys /etc/ha.d/authkeys
# zcat /usr/share/doc/heartbeat/ha.cf.gz > /etc/ha.d/ha.cf
# zcat /usr/share/doc/heartbeat/haresources.gz > /etc/ha.d/haresources

logfile      /var/log/ha-log
logfacility   local0
keepalive   2
deadtime   10
warntime   5
initdead   20
udpport      694
bcast      eth0
auto_failback   no
ping    192.168.254.254
node      node1
node      node2

O arquivo authkeys é responsável pela autenticação deixo da seguinte forma:

auth 1
1 md5 digite_sua-senha

Mude as permissões do arquivo
# chmod 600 /etc/ha.d/authkeys
Edite o arquivo /etc/ha.d/ha.cf
# vim /etc/há.d/há,cf

node node1
node node2
# QUAL A INTERFACE QUE SERA USADA PARA COMUNICAÇÃO
bcast      eth0
# ARQUIVOS DE LOGS
debugfile /var/log/ha-debug
logfile /var/log/ha-log
# FREQUENCIA EM SEGUNDOS DA VERIFICAÇÃO DOS SERVIDORES
keepalive 2
# TEMPO MINIMO PARA DECLARAR A OUTRA MAQUINA DESATIVADA
deadtime 30
# QUANTO TEMPO O HEARTBEAT DEVE ESPERAR POR BITS ATRASADOS
warntime 10
# TEMPO MAXIMO PARA DECLARAR O OUTRO SERVIDOR COMO MORTO
initdead 90
# VELOCIDADE DA SERIAL BPS  – CASO ESTEJA USANDO CABO SERIAL
baud 19200
# PORTA QUE SERA USADA
udpport 694
# DETERMINANDO SE O SERVIÇO DEVE VOLTAR PARA O MASTER, CASO ELE VOLTE A RESPONDER
auto_failback off
# COMPACTAÇÃO DOS DADOS
compression    bz2
# COMPACTAÇÃO DOS DADOS
compression_threshold 2

Edite também o arquivo haresources esse será responsável por quais recursos estarão no cluster bem como  qual será o nó primário.
No  arquivo abaixo iremos monitorar Apache e o drbd.

# vim /etc/ha.d/haresources
#
node1 IPaddr::192.168.254.10/24/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/dados::ext4 apache2Nota: Vale lembrar que o ip declarado no arquivo 192.168.254.10 é o ip de virtual de serviço que os usuários irão acessar as aplicações.
##################################################
# Todos os arquivos de configuração do heartbeat deverão existir na duas # #máquinas.                                                                                                       #
# É necessário retirar da inicialização automática do sistema os recursos   #  #utilizados, ou seja o drbd e o apache, pois quem iniciará os recursos         #   # agora é o heartbeat.                                                                                                    #        #################################################

Devemos colocar a montagem da partição de forma automática edite o arquivo fstab devendo ficar conforme exemplo abaixo.
# vim /etc/fstab
/dev/drbd0 /dados ext4 _netdev,defaults 0 0

Inicie o heartebeat nos dois nós
# /etc/init.d/heartbeat start
Em seguida confira se a interface virtual foi iniciada no nó primário:
# ifconfig
Se a interface virtual aparecer é sinal que correu tudo bem. Agora vamos testar nosso ambiente. Ainda no nó1 vamos parar o heartbeat
# /etc/init.d/heartbear stopNesse momento deverá ocorrer a migração dos dados para  o nó2.Conforme imagem.
Agora que o nó2 é o no primário, iremos simular um reboot na mesma e acompanhar o processo de migração novamente.
 # watch cat/proc/drbdenquanto a máquina estiver no processo de reinício o estado do outro nó que assume será de Primary/Unknow visto que o mesmo perderá a conexão com o nó em reboot. Portanto assim que a máquina que estava reboot voltar ao seu estado normal o status do nó que assumiu os recursos mudará para Primary/Secondary e maquina que estava em reboot Secondary/Primary.
Notas de erro:
Caso aconteça dos recursos não serem migrados, durante o reinício do heartbeat checar se os serviços foram iniciados.
Caso o apache2 esteja parado e ao iniciar receber a seguinte mensagem Starting web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.254.15 for ServerName. Basta editar o arquivo  etc/apache2/apache2 e adicionar seguinte linha ServerName Ipdoservidor

É possível ao iniciar o hearbeat no nó primário,os recursos não iniciarem e o ip de serviço ou virtual não está disponível onde pode ser visto no log a mensagem semelhante a: tail –f /var/log/messages
No local resources [/usr/share/heartbeat/ResourceManager listkeys node2] to acquire.
Nov  6 17:47:26 node2 heartbeat: [1200]: info: node1 wants to go standby [foreign]
Nov  6 17:47:27 node2 heartbeat: [1200]: info: standby: acquire [foreign] resources from node1
Nov  6 17:47:27 node2 heartbeat: [1306]: info: acquire local HA resources (standby).
Nov  6 17:47:27 node2 heartbeat: [1306]: info: local HA resource acquisition completed (standby).
Nov  6 17:47:27 node2 heartbeat: [1200]: info: Standby resource acquisition done [foreign].
Para corrigir isso faça o seguinte:
No nó primário entre com os commandos:

#  modprobe drbd
# drbdadm secondary r0
#  drbdadm primary r0
#  drbdadm disconnect r0
#   drbdadm connect r0
# /etc/init.d/heartbeat restart
Já no nó secundário entre com os comandos:

#  modprobe drbd
#  drbdadm -- --discard-my-data connect r0
#  /etc/init.d/heartbeat restart
Como o nó primário apresentou erros, ao executar os comandos acima o heartbeat criará o ip de serviço e irá mudar para o servidor secundário que a partir de agora passa a ser primário. Para conferir se os recursos foram migrados verifique ser a interface virtual foi criada digitando
# ifconfig
# a saída deve ser algo semelhante a:
É possível ocorrer outro erro ao reiniciar o heartbeat
# cat /proc/drbd

Se isso ocorrer proceda da seguinte forma nos dois nós:modprobe drbd
drbdadm attach r0
     drbdadm syncer r0
     drbdadm connect r0
    drbdadm disconnect r0
    drbdadm -- --discard-my-data connect r0
   drbdadm get-gi r0
Verifique a saída dos logs em ambos os nós deverá ser algo semelhante a:
# cat /proc/drbd

Defina um dos nós como primário:
# drbdadm primary all

No nó secundário digite:
# drbdadm secondary all
Reinicie o heartbeat nos dois nós
# /etc/init.d/heartbeat restart
 Verifique se o ip virtual foi iniciado# ifconfig

Referências e agradecimentos.http://gnulinuxbr.com/
http://www.drbd.org/
http://www.drbd.org/docs/about/
http://www.douglas.wiki.br/doku.php
 Agradeço ao Evandro Couto, Douglas Quintiliano, Roosevelt, e ao Victor Sartori pela grande ajuda para criar esse material.