Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

linux:artigos:heartbeat-drbd-mon [13/01/2015 10:44] (atual)
Linha 1: Linha 1:
 +~~NOTOC~~
 +====== Alta Disponibilidade (HA) com Debian (Heartbeat + DRBD + Mon) ======
 +
 +**Observações:​**
 +  * Iremos levar em consideração que você possui uma instalação "​limpa"​ do S.O. Debian GNU/Linux.
 +  * Os serviços que estão sendo usandos na solução também devem estar devidamente configurados e em operação.
 +  * Todos os passos a seguir deverão ser realizados em ambas as máquinas para que o HA funcione corretamente.
 +
 +===== Ambiente =====
 +
 +==== Máquina Master ====
 +
 +  * SO: Debian GNU/Linux
 +  * Kernel: 2.6.25-2-686
 +  * Eth0: 172.16.1.241 (HA)
 +  * Eth1: 192.168.1.240 (Lan)
 +  * Eth2: 200.1.1.240 (Wan)
 +  * Serviços: Apache2, Postfix, Heartbeat, DRBD, Mon
 +
 +==== Máquina Slave ====
 +
 +  * SO: Debian GNU/Linux
 +  * Kernel: 2.6.25-2-686
 +  * Eth0: 172.16.1.242 (HA)
 +  * Eth1: 192.168.1.240 (Lan)
 +  * Eth2: 200.1.1.240 (Wan)
 +  * Serviços: Apache2, Postfix, Heartbeat, DRBD, Mon
 +
 +===== Heartbeat =====
 +
 +==== Instalação ====
 +
 +Primeiramente instale o pacote do //​heartbeat//​ (versão2).
 +
 +<​code>​
 +root@debian:​~#​ aptitude install heartbeat-2
 +</​code>​
 +
 +Em seguida, precisamos copiar os arquivos necessários para a configuração do mesmo da área de documentação do //​heartbeat//​ já que no Debian esses arquivos não vem no diretório de config por padrão.
 +
 +<​code>​
 +root@debian:​~#​ cd /​usr/​share/​doc/​heartbeat-2
 +root@debian:/​usr/​share/​doc/​heartbeat-2#​ cp authkeys ha.cf.gz haresources.gz /etc/ha.d
 +root@debian:/​usr/​share/​doc/​heartbeat-2#​ cd /etc/ha.d
 +root@debian:/​etc/​ha.d#​ gunzip ha.cf.gz haresources.gz
 +</​code>​
 +
 +==== Configuração ====
 +
 +Em seguida, vamos configurar os arquivos. ​
 +
 +O primeiro arquivo que iremos configurar é o //​**authkeys**//,​ que cuida da autenticação entre os dois nodos.
 +
 +<​code>​
 +root@debian:/​etc/​ha.d#​ vi authkeys
 +
 +auth 3
 +#1 crc
 +#2 sha1 HI!
 +3 md5 sua_senha
 +</​code>​
 +
 +Precisamos configurar as permissões do arquivo authkeys. Para isso, execute:
 +
 +<​code>​
 +root@debian:/​etc/​ha.d#​ chmod 600 authkeys
 +</​code>​
 +
 +Em seguida configure o arquivo principal do serviço, o //​**ha.cf**//​.
 +
 +<​code>​
 +root@debian:/​etc/​ha.d#​ vi ha.cf
 +
 +logfile /​var/​log/​ha-log
 +logfacility local0
 +keepalive 2
 +deadtime 10
 +warntime 5
 +initdead 20
 +udpport 694
 +bcast eth0
 +auto_failback off
 +node master
 +node slave
 +</​code>​
 +
 +E por fim, o arquivo //​**haresources**//​ que gerencia os //daemons// de responsabilidade do //​heartbeat//​.
 +
 +<​code>​
 +root@debian:/​etc/​ha.d#​ vi haresources
 +
 +master \
 + IPaddr2::​192.168.1.240/​24/​eth1/​192.168.1.255 \
 + IPaddr2::​200.1.1.240/​24/​eth2/​200.1.1.255 \
 + apache2
 +</​code>​
 +
 +**NOTA:** Se for utilizar IP virtual, retire as entradas //​**IPaddr2::​**//​ do arquivo //​**haresources**//​.
 +
 +**IMPORTANTE:​** É necessário desabilitar da inicialização os serviços declarado no arquivo //​haresources//,​ pois quem irá levantá-los será o serviço heartbeat.
 +
 +Para desativar os serviços, execute:
 +
 +<​code>​
 +root@debian:​~#​ cd /etc/rc2.d
 +root@debian:/​etc/​rc2.d#​ mv S91apache2 K91apache2
 +</​code>​
 +
 +Além disso, é preciso **desabilitar o carregamento da placa de rede eth1 e eth2 nos dois nodos**, já que a mesma também será carregada pelo //​heartbeat//​. Isso é realizado no arquivo //​**/​etc/​network/​interfaces**//​.
 +
 +Depois de tudo configurado,​ reinicie ambas as máquinas para que possamos testar o //​heartbeat//,​ porém, reinicie primeiro a máquina **master** e depois a **slave**.
 +
 +===== DRBD =====
 +
 +==== Pré-requisitos do sistema ====
 +
 +No caso do DRBD, iremos compilá-lo. Com isso, iremos preparar o sistema com os pacotes necessários para que possamos continuar. ​
 +
 +Primeiramente iremos instalar o //​kernel-headers//​ e //​kernel-source//,​ necessários para a compilação do DRBD.
 +
 +<​code>​
 +root@debian:​~#​ aptitude install linux-headers-2.6.25-2-686 linux-source-2.6.25
 +</​code>​
 +
 +Em seguida desempacote o //​kernel-source//​.
 +
 +<​code>​
 +root@debian:​~#​ cd /usr/src
 +root@debian:/​usr/​src#​ tar xjvf linux-source-2.6.25.tar.bz2
 +</​code>​
 +
 +Agora vamos instalar os pacotes adicionar, necessários para a compilação.
 +
 +<​code>​
 +root@debian:​~#​ aptitude install gcc g++ make kernel-package dpkg-dev gettext flex
 +</​code>​
 +
 +==== Compilando ... ====
 +
 +Primeiramente vamos realizar o download do DRBD e desempacotá-lo.
 +
 +<​code>​
 +root@debian:​~#​ cd /usr/src
 +root@debian:/​usr/​src#​ wget -c http://​oss.linbit.com/​drbd/​8.2/​drbd-8.2.6.tar.gz
 +root@debian:/​usr/​src#​ tar xzvf drbd-8.2.6.tar.gz
 +</​code>​
 +
 +Em seguida vamos preparar o kernel para que a compilação seja realizada.
 +
 +<​code>​
 +root@debian:/​usr/​src#​ cd linux-source-2.6.25
 +root@debian:/​usr/​src/​linux-source-2.6.25#​ make mrproper
 +root@debian:/​usr/​src/​linux-source-2.6.25#​ cp /​boot/​config-2.6.25-2-686 .config
 +root@debian:/​usr/​src/​linux-source-2.6.25#​ make modules_prepare
 +root@debian:/​usr/​src/​linux-source-2.6.25#​ cd ..
 +</​code>​
 +
 +Agora vamos compilar o DRBD.
 +
 +<​code>​
 +root@debian:/​usr/​src#​ cd drbd-8.2.6/​drbd
 +root@debian:/​usr/​src/​drbd-8.2.6/​drbd#​ make clean all
 +root@debian:/​usr/​src/​drbd-8.2.6/​drbd#​ make clean
 +root@debian:/​usr/​src/​drbd-8.2.6/​drbd#​ make KDIR=/​usr/​src/​linux-source-2.6.25/​
 +root@debian:/​usr/​src/​drbd-8.2.6/​drbd#​ cd ..
 +root@debian:/​usr/​src/​drbd-8.2.6#​ make tools
 +root@debian:/​usr/​src/​drbd-8.2.6#​ make install
 +root@debian:/​usr/​src/​drbd-8.2.6#​ make install-tools
 +root@debian:/​usr/​src/​drbd-8.2.6#​ make all install
 +</​code>​
 +
 +E por fim, carregue o módulo do DRBD.
 +
 +<​code>​
 +root@debian:/​usr/​src#​ modprobe drbd
 +</​code>​
 +
 +==== Configuração ====
 +
 +Primeiramente precisamos configurar os nomes das máquinas utilizadas.
 +
 +<​code>​
 +root@debian:​~#​ vi /etc/hosts
 +
 +127.0.0.1 localhost
 +172.16.1.241 master
 +172.16.1.242 slave
 +</​code>​
 +
 +**IMPORTANTE:​** Antes de continuarmos,​ precisamos parar o DRBD para configurá-lo e criar os recursos isoladamente na máquinas, evitando a sincronização imediata dos mesmos, já que a sincronização deverá ser iniciada somente após a sua configuração e após os recursos estiverem devidamente formatados.
 +
 +<​code>​
 +root@debian:​~#​ /​etc/​init.d/​drbd stop
 +</​code>​
 +
 +Em seguida vamos configurar o DRBD.
 +
 +<​code>​
 +root@debian:​~#​ vi /​etc/​drbd.conf
 +
 +resource nome_do_recurso {
 +        protocol C;
 +        disk {  ​
 +                on-io-error detach;
 +        }
 +        net {   
 +                timeout 60;     
 +                connect-int 10; 
 +                ping-int 10;
 +        }
 +        syncer {        ​
 +                rate 100M;
 +                #group 1;
 +        }
 +        on master {
 +                device /dev/drbd2;
 +                disk /dev/md2;
 +                address 172.16.1.241:​7788;​
 +                meta-disk internal;
 +        }
 +        on slave {
 +                device /dev/drbd2;
 +                disk /dev/md2;
 +                address 172.16.1.242:​7788;​
 +                meta-disk internal;
 +        }
 +}
 +</​code>​
 +
 +**OBSEVAÇÃO:​** Não esqueça de comentar a linha referente a montagem do device //​**/​dev/​md2**//​ no //​**/​etc/​fstab**//,​ lembrando que esse device está sendo utilizado em nosso exemplo, podendo variar em outras instalações.
 +
 +A seguir iremos criar o recurso DRBD (nome_do_recurso) e ativar e formatar o device (//​**/​dev/​drbd2**//​).
 +
 +<​code>​
 +root@debian:​~#​ dd if=/​dev/​zero bs=1M count=1 of=/dev/md2
 +root@debian:​~#​ sync
 +root@debian:​~#​ modprobe drbd
 +root@debian:​~#​ drbdadm create-md nome_do_recurso
 +root@debian:​~#​ drbdadm up all
 +root@debian:​~#​ drbdadm -- -o primary nome_do_recurso
 +root@debian:​~#​ mkfs.xfs /dev/drbd2
 +</​code>​
 +
 +E por fim, iremos inicializar o serviço DRBD.
 +
 +**IMPORTANTE:​ O serviço só deverá ser iniciado se todos os passos anteriores estiverem sido executados nas duas máquina.**
 +
 +<​code>​
 +root@debian:​~#​ /​etc/​init.d/​drbd start
 +</​code>​
 +
 +Com isso, o DRBD já está ativo, funcionando e já deve estar sincronizando os dados. Para verificar a sincronização,​ execute:
 +
 +<​code>​
 +root@debian:​~#​ watch -n1 cat /proc/drbd
 +
 +version: 8.2.6 (api:​88/​proto:​86-88)
 +GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@master,​ 2008-08-20 13:29:43
 +
 + 2: cs:​SyncSource st:​Primary/​Secondary ds:​UpToDate/​Inconsistent C r---
 +    ns:1138640 nr:0 dw:0 dr:1146720 al:0 bm:70 lo:1 pe:5 ua:253 ap:0 oos:​967033512
 + [.>​...................] sync'​ed: ​ 1.2% (944168/​945480)M
 + finish: 15:37:02 speed: 16,960 (11,272) K/sec
 +</​code>​
 +
 +Para finalizar, precisamos configurar o DRBD para ser carregado na inicialização do sistema.
 +
 +<​code>​
 +root@debian~#​ cd /etc/rc2.d
 +root@debian~#​ ln -s ../​init.d/​drbd S20drbd
 +</​code>​
 +
 +**IMPORTANTE:​** O //device// só deverá ser montado após o processo de sincronização ter sido concluído por completo.
 +
 +==== Problemas Conhecidos ====
 +
 +=== Split-Brain ===
 +
 +Este problema ocorre quando ambas as máquinas são carregadas de maneira isolada, não havendo conectividade entre os recursos. Com isso, as máquinas não conseguem conectar os devices ao recursos sincronizador.
 +
 +Para solucionar esse problema, é necessário limpar os dados de conexão do recurso em um dos nós.
 +
 +Na máquina //​**slave**//,​ execute:
 +
 +<​code>​
 +root@debian-slave:​~#​ drbdadm secondary nome_do_recurso
 +root@debian-slave:​~#​ drbdadm -- --discard-my-data connect nome_do_recurso
 +</​code>​
 +
 +**Explicando:​** O primeiro comando irá tranformar o recurso em secundário,​ em seguida, você descarta os dados de conexão do recurso.
 +
 +Na máquina //​**master**//,​ execute:
 +
 +<​code>​
 +root@debian-master:​~#​ /​etc/​init.d/​drbd stop
 +root@debian-master:​~#​ /​etc/​init.d/​drbd start
 +root@debian-master:​~#​ drbdadm primary nome_do_recurso
 +</​code>​
 +
 +==== ADD-ON ====
 +
 +Para um melhor gerenciamento do sistema DRBD, em relação a montagem do volume nas duas máquinas, nós criamos um script que irá gerenciar a montagem dos //​devices//,​ onde o mesmo será gerenciado pelo //​heartbeat//​.
 +
 +Esse script será utilizado para tranformar o nodo que está em operação em primário além de montar, no nosso exemplo, o //​**/​dev/​drbd2**//​. Quando o nodo que está em operação cair, o outro nodo assume. Nesse caso, o //​heartbeat//​ irá utilizar esse script para tranformar esse nodo em secundário no DRBD e desmontar o device. Com isso, o nodo que assumiu faz o processo inverso, tranformado o DRBD em primário e montando o //device//.
 +
 +Vamos ao script:
 +
 +<​code>​
 +root@debian:​~#​ vi /​etc/​init.d/​drbd.ha
 +
 +#!/bin/bash
 +#
 +DRBDADM="/​sbin/​drbdadm"​
 +MODPROBE="/​sbin/​modprobe"​
 +RMMOD="/​sbin/​rmmod"​
 +MOUNT="/​bin/​mount"​
 +UMOUNT="/​bin/​umount"​
 +
 +case "​$1"​ in
 +    start)
 + echo -n "​Starting all DRBD devices: "
 +
 + $DRBDADM primary all
 + $MOUNT /dev/drbd2 /srv
 +
 + echo "​Done."​
 +
 + ;;
 +    stop)
 + echo -n "​Stopping all DRBD devices: "
 +
 + $UMOUNT /dev/drbd2
 + $DRBDADM secondary all
 +
 + echo "​Done."​
 + ;;
 +    *)
 + echo "​Usage:​ $0 {start|stop}"​
 + exit 1
 + ;;
 +esac
 +
 +exit 0
 +</​code>​
 +
 +Não esqueça de dar permissão de execução ao script ...
 +
 +<​code>​
 +root@debian:​~#​ chmod +x /​etc/​init.d/​drbd.ha
 +</​code>​
 +
 +E de incluir a chamada do mesmo no arquvo do //​heartbeat//​.
 +
 +<​code>​
 +root@debian:/​etc/​ha.d#​ vi haresources
 +
 +master \
 + IPaddr2::​192.168.1.240/​24/​eth0/​192.168.1.255 \
 + apache2 drbd.ha
 +</​code>​
 +
 +Finalizado, reinicie o serviço //​heartbear//​.
 +
 +<​code>​
 +root@debian:​~#​ /​etc/​init.d/​heartbeat stop
 +root@debian:​~#​ /​etc/​init.d/​heartbeat start
 +</​code>​
 +
 +**NOTA:** Isso poderá fazer com que a máquina //slave// assuma a //master//, pois vc está paralizando o //​heartbeat//​.
 +
 +===== Mon =====
 +
 +O //mon// será utilizado para monitorar os serviços locais da máquina e executar uma tarefa caso ocorra algum problema com o serviço monitorado.
 +
 +No nosso exemplo, usaremos ele para monitorar o //apache// e caso o mesmo tenha problemas de requisição,​ o //mon// irá derrubar o //​heartbeat//​ forçando assim a máquina //slave// a assumir os serviços.
 +
 +**OBSERVAÇÃO:​** O //mon// tem opções para enviar e-mail de alerta caso ocorra algum problema. Para isso, você poderá configurar um servidor de e-mail na máquina para enviar e-mails de alerta. Em nosso servidor, utilizamos o Postfix com Host Relay.
 +
 +==== Instalação ====
 +
 +Aqui, iremos apenas instalar o pacote.
 +
 +<​code>​
 +root@debian:​~#​ aptitude install mon
 +</​code>​
 +
 +==== Configuração ====
 +
 +Primeiramente,​ configure o arquivo principal do //mon//.
 +
 +<​code>​
 +root@debian:​~#​ vi /​etc/​mon/​mon.cf
 +
 +alertdir ​  = /​usr/​lib/​mon/​alert.d
 +mondir ​    = /​usr/​lib/​mon/​mon.d
 +maxprocs ​  = 20
 +histlength = 100
 +randstart ​ = 60s
 +
 +hostgroup www localhost
 +
 +watch www
 +        service http
 +        interval 10s
 +        monitor http.monitor
 +        allow_empty_group
 +        period wd {Sun-Sat}
 +                alert heartbeat.alert
 +                alert mail.alert -S "web server is down" root@localhost
 +                upalert mail.alert -S "web server is up" root@localhost
 +                alertevery 1m
 +</​code>​
 +
 +Essa configuração irá monitorar o processo do //apache// da seguinte maneira: ele irá verificar de 10 em 10 segundos (interval) se o //apache// está respondendo. Caso o mesmo apresenta falha de conexão na máquina local, ele irá executar o script //​heartbeat.alert//,​ responsável pela paralização do //​heartbeat//,​ obrigando assim a máquina //slave// assumir e irá disparar um e-mail através do script //​mail.alert//​ com o assunto explicito em //-S ASSUNTO// para //​root@localhost//​.
 +
 +O arquivo //​heartbeat.alert//​ poderá ser baixado [[http://​downloads.fabriciovc.eti.br/​ha/​ |aqui]], já que o mesmo não vem instalado por //​default//​.
 +
 +Com isso, podemos iniciá-lo.
 +
 +<​code>​
 +root@debian:​~#​ /​etc/​init.d/​mon stop
 +root@debian:​~#​ /​etc/​init.d/​mon start
 +</​code>​
 +
 +==== Ajustes de SUDO ====
 +
 +Em nossos testes, detectamos que o //daemon// do //mon// é executado no sistema com o usuário //daemon//. Isso nos gerou um problema pois esse usuário não tem permissões para derrubar o //​heartbeat//​ quando o //apache// cai.
 +
 +Para solucionar esse problema, vamos usar o SUDO para dar as permissões necessárias para o usuário //daemon// executar a tarefa corretamente.
 +
 +Vamos ao processo:
 +
 +<​code>​
 +root@debian:​~#​ aptitude install sudo
 +</​code>​
 +
 +Em seguida, configure o SUDO.
 +
 +<​code>​
 +root@debian:​~#​ visudo
 +
 +Defaults ​       env_reset
 +
 +root    ALL=(ALL) ALL
 +
 +daemon ​ ALL=NOPASSWD:/​etc/​init.d/​heartbeat stop
 +</​code>​
 +
 +E para finalizar, ajuste o arquivo //​heartbeat.alert//​ para utilizar o SUDO.
 +
 +Você deverá alterar a linha a seguir:
 +
 +<​code>​
 +root@debian:​~#​ vi /​usr/​lib/​mon/​alert.d/​heartbeat.alert
 +
 +[...]
 +
 +# system ("/​etc/​init.d/​heartbeat stop"​);​
 +system ("sudo /​etc/​init.d/​heartbeat stop"​);​
 +</​code>​
 +
 +E por fim, reinicie o //mon//.
 +
 +<​code>​
 +root@debian:​~#​ /​etc/​init.d/​mon stop
 +root@debian:​~#​ /​etc/​init.d/​mon start
 +</​code>​
 +
 +----
 +
 +Criado por:\\
 +**Ciro Siqueira** - siqueira.ciro[em]gmail.com\\
 +**Fabricio Vaccari Constanski** - fabriciovc[em]fabriciovc.eti.br\\
 +
 +----
 +<​html>​
 +<a href="​javascript:​window.history.go(-1)">​Voltar</​a>​
 +</​html>​
  
linux/artigos/heartbeat-drbd-mon.txt · Última modificação: 13/01/2015 10:44 (edição externa)