Archive

Archive for December, 2012

Linux sempre disponivel para atende-lo, senhor :)

December 6, 2012 1 comment

O título do post tenta ser bem objetivo, iremos configurar alta disponibilidade em um ambiente Linux, utilizando duas máquinas com iguais configurações em que se uma cair a outra assume, no caso o serviço que iremos deixar disponivel será o firewall netfilter/iptables e squid. Usaremos sincronização das configurações utilizando o DRBD. O nosso ambiente será como abaixo já com os respectivos endereços IP’s. Uma observação na interface eth0 o qual foi designada para ser a interface externa não teremos IP, somente o endereço ip virtual na interface alias eth1:0, o heartbeat será na interface interna, no nosso exemplo a interface eth0, com o endereço ip virtual na interface eth0:0.

heartbeat

Para construir nosso ambiente precisamos do DRBD e Heartbeat, o DRBD é uma tecnologia para o sincronismo das configurações e o heartbeat para fazer a checagem do master e slave e ativar os serviços no slave quando o master ficar indisponível. O primeiro passo e instalar o heartbeat, não vou explicar aqui como faz isso, porque existe várias maneiras de se fazer isso. Eu por exemplo utilizei o ubuntu e ele ja tem o pacote no repositorios de pacotes, no CentOS, fedora também tem o pacote no repositorio, ou ainda se preferir você tem a opção de compilar a partir do código fonte. Fica a gosto do frequês.

O diretório de trabalho do heartbeat fica em /etc/ha.d, existe 3 arquivos que precisaremos configurar, são eles:

  • haresources: define quais recursos estarão em alta disponibilidade, tais como o nosso squid e iptables, além de montagem de partições sincronizadas com drbd, etc.
  • authkeys: arquivo contendo a autenticação dos nós do nosso cluster de alta disponibilidade
  • ha.cf: Configurações globais do heartbeat como tempo de dead, warning, arquivos de logs, etc.

Antes de prosseguirmos, precisamos definir quais os nomes dos nossos master e slave.

  • master: srvfw01
  • slave: srvfw02

Depois configurar a resolução de nomes no arquivo /etc/hosts

192.168.0.1       srvfw01

192.168.0.2      srvfw02

Depois de instalado o heartbeat vamos configurar o a interface eth1 mesma interface da rede interna para o heartbeat segue abaixo arquivo de configuração.

ha.cf

#Arquivo de debug
debugfile /var/log/ha-debug
# Arquivo de log
logfile /var/log/ha-log
logfacility     local0
# frequência em segundos de checagem do master
keepalive 2
# Tempo mínimo em segundos para declarar o master morto ou inativo
deadtime 30
# quanto tempo o heartbeat deve esperar por bits atrasados
warntime 10
# tempo maximo para declarar o master morto ou inativo
initdead 120
# porta de comunicação para o heartbeat
udpport 694
# interface que será utilizada para comunicação do heartbeat utilizando endereço multicast
mcast eth0 239.0.0.43 694 1 0
# qual interface ou interfaces serão utilizadas para a comunicação do heartbeat
bcast eth0
# definindo se o servico deve voltar para o master caso ele volte a responder o heartbeat
auto_failback on
# nós ou hosts que irão compor o cluster
node srvfw01
node srvfw02

authkeys

auth 1
1 crc

Esse arquivo é o arquivo que faz a autenticação dos nós ou hosts que compõem o cluster. Existem outros métodos além do crc, tais como sha1, md5, o qual você pode-se utilizar uma senha.

Vou deixar para explicar o arquivo haresources depois que mexermos no drbd para o melhor entendimento.

A tecnologia DRBD trabalha com dispositivo em rede tipo uma partição de um disco, etc. Vejamos a figura abaixo retirado do site drbd mostra bem esse conceito.

Então a idéia e criar um dispositivo tal como o dispositivo /dev/drbd0 em comum entre os dois hosts que fazem parte do cluster de alta disponibilidade e associar ele a um disco fisico em cada host, tipo /dev/sdb como no nosso laboratorio que iremos fazer. Precisamos associar o dispositivo /dev/drbd0 com o /dev/sdb1 por exemplo, teremos que fazer isso em ambos os hosts.Obs: Precisamos ter uma partição EXCLUSIVA para isso.

Então para a instalação do drbd, proceda como na instalação do heartbeat, procure no repositorio de pacotes da tua distro ou compile 🙂

Depois de instalado o drbd normalmente já carrega o módulo do kernel drbd, mas se precisar utilize o comando modprobe(modprobe drbd). O arquivo de configuração do drbd é /etc/drbd.conf. Segue abaixo o arquivo que utilizei.
Não vou comentar todos os parametros do arquivo de configuração, por ser extenso e caso precise de algo mais especifico as páginas man são suas confidentes 🙂 Alguns paramêtros que o drbd utiliza para subir são obrigatorios, tais como:

  • global:
  • common:
  • resource:

Iremos configurar apenas o recurso ou resource:

drbd.conf

resource srvfw {
     protocol C;
     disk {
          on-io-error detach;
     }
     net {
          timeout 60;
          connect-int 10;
          ping-int 10;
     }
    syncer {
          rate 100M;
    }
    on srvfw01 {
          device /dev/drbd0;
          disk /dev/sdb1;
          address 192.168.0.1:7788;
          meta-disk internal;
    }
    on srvfw02 {
          device /dev/drbd0;
          disk /dev/sdb1;
          address 192.168.0.2:7788;
          meta-disk internal;
    }
}

 

Explicando alguns paramêtros mais importantes.

  • device: Dispositivo virtual o que será utilizado nos dois hosts.
  • disk: disco físico que será mapeado pelo dispositivo virtual.
  • address: Endereço IP e porta do host.
  • meta-disk: onde será colocado o meta-disk do drbd, meta-data são informações de replicação.

Não coloquei as configurações de global e common utilizei o padrão do ubuntu que veio auto-configurado no pacote.

include “drbd.d/global_common.conf”;

Vamos colocar o drbd para funcionar, primeiro vamos definir um diretório em comum em ambos hosts, escolhi o diretório /srvfw

host srvfw01 e srvfw02

mkdir /srvfw

Particione o disco /dev/sdb para /dev/sdb1.

zerar a partição com o comando:

dd if=/dev/zero of=/dev/sdb1 bs=1M count=128

Depois iremos criar o dispositivo drbd

drbdadm create-md recurso

ou seja, para nosso exemplo rodar o comando nos dois hosts

drbdadm create-md srvfw

Atachar o disco nos dois hosts

drbdadm attach srvfw

sincronizar

drbdadm syncer srvfw

Iniciar a replicação apenas no master, ou srvfw01

drbdadm — –overwrite-data-of-peer primary srvfw

Reinicie o serviço drbd nos dois hosts

/etc/init.d/drbd restart

Verifique se a sincronização ocorreu

root@srvfw01:~# cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
srcversion: 71955441799F513ACA6DA60
0: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r—–
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
root@srvfw01:~# 15:48:26

Definindo quem é primario e secundario

srvfw01

drbdadm primary all

srvfw02

drbdadm secondary all

Agora vamos formatar o dispositivo /dev/drbd0 com o sistema de arquivo de sua preferência. Primeiro execute no master como ele sendo o drbd primario, depois promova o master como secundario no drbd e formate o dispositivo /dev/drbd0 no slave.

mkfs.reiserfs /dev/drbd0

Depois de formatado o dispositivo nos dois hosts podemos monta-ló e testa-ló. Neste ponto reinicie o serviço drbd0. obs: Estou montando depois de formatar o dispositivo /dev/drbd0 nos dois hosts e estou no master(srvfw01)

mount -t reiserfs /dev/drbd0 /srvfw

Crie um arquivo para teste

touch /srvfw/arquivo.txt

Agora desmonte o /srvfw e promova o master(srvfw01) à secundario no drbd e o slave(srvfw02) à primario.

srvfw01

drbdadm secondary all

srvfw02

drbdadm primary all

Monte novamente o /dev/drbd0 mas agora no slave(srvfw02)

mount -t reiserfs /dev/drbd0 /srvfw

Liste o conteudo do ponto de montagem e veja que o arquivo criado “arquivo.txt” estará lá. Estamos com o drbd funcionando e replicando. A idéia aqui e colocar as configurações do iptables e squid dentro do diretório ou ponto de montagem /srvfw.

Editar o arquivo /etc/fstab para montagem automática.

/dev/drbd0 /srvfw reiserfs noauto 0 0

Agora vamos configurar o ultimo item o arquivo haresources.

haresources

srvfw01 IPaddr::192.168.0.10/24/eth0/192.168.0.255 drbddisk::srvfw Filesystem::/dev/drbd0::/srvfw::reiserfs
srvfw01 IPaddr::172.31.1.151/24/eth1/172.31.1.255 gateway::172.31.1.150 iptables squid

Vamos lá este útimo item e minucioso e cheio de detalhes e esses detalhes são essenciais para o entendimento. Para o start do serviço no slave ou no master é necessário existir um script que inicie o serviço em questão o heartbeat já vem com um conjunto default de script de inicialização de serviços que ficam em /etc/ha.d/resource.d. Cada script dentro deste diretório inicializa e interrompe serviços. Não temos script para inicialização do iptables e nem para o squid então vamos criar um shellscript simples para fazer isso. Vamos entendendo linha a linha.

  • srvfw01: Nome do host que é definido como master
  • IPaddr::192.168.0.10/24/eth0/192.168.0.255: Aqui ele vai chamar o script que inicializa um serviço. O script IPaddr vai configurar um endereço IP 192.168.1.10 com mascara de rede /24 na interface eth0 com endereço de broadcast 192.168.0.255.
  • drbddisk::srvfw: Este script vai iniciar o recurso drbd(aquele mesmo recurso configurado no /etc/drbd.conf) host em questão como primario do drbd
  • Filesystem::/dev/drbd0::/srvfw::reiserfs: Script para fazer a montagem do dispositivo /dev/drbd0 no ponto de montagem /srvfw utilizando sistema de arquivo reiserfs. Simples não

Repare que eu passo paramêtros para o script atráves da sintaxe “::”, ou seja, por exemplo o comando ou shellscript “Filesystem” se fosse executar na linha de comando seria o mesmo que

./Filesystem /dev/drdb0 /srvfw reiserfs start

Simples não. Um detalhe que se você procurar no diretório /etc/ha.d/resource.d você encontra-rá o script Filesystem la dentro.

Próxima linha, na linha acima configuramos o endereço IP virtual da interface LAN e montamos a partição drbd e agora iremos explicar a linha que inicializa o endereço ip virtual da interface WAN

  • srvfw01: Nome do host que é definido como master
  • IPaddr::172.31.1.151/24/eth1/172.31.1.255: Aqui ele vai chamar o script que inicializa um serviço. O script IPaddr vai configurar um endereço IP 172.31.1.151 com mascara de rede /24 na interface eth1 com endereço de broadcast 172.31.1.255.
  • gateway::172.31.1.150:  Script que configura o gateway default.
  • iptables: script que carrega as regras de firewall
  • squid: script que inicializa o squid

O script “iptables” e “squid”, foram criado pela minha pessoa os scripts que eu criei ficaram um pouco complexo. Então nesse post vou diminuir a complexidade deixado eles bem simples para ficar didático

script iptables

#!/bin/bash

IPT=$(which iptables)

usage() {
echo “Uso: $0 {start|stop}”
exit 1
}

case $1 in
start)
/srvfw/config/iptables/firewall
;;
stop)
$IPT -t filter -F
$IPT -t nat -F
$IPT -t mangle -F

$IPT -t filter -X
$IPT -t nat -X
$IPT -t mangle -X

$IPT -t filter -P INPUT ACCEPT
$IPT -t filter -P FORWARD ACCEPT
$IPT -t filter -P OUTPUT ACCEPT
;;
*)    usage
;;
esac

Este script inicializa ou interrompe um firewall a sintaxe para iniciar e interromper seguem abaixo respectivamente.

./iptables start
./iptables stop

No script do squid como estamos utilizando o ubuntu, sendo assim resolvi somente alterar a varíavel que indica o arquivo de configuração do script que inicia e interrompe o squid nativo no caso do ubuntu ele utiliza o sistema de inicialização upstart. Então somente alterar a variavel “CONFIG” no arquivo /etc/init/squid3.conf, para /srvfw/config/squid/squid.conf, depois podemos utilizar o script de inicialização nativo do ubuntu.

#!/bin/bash
#
#
case $1 in
start)
/etc/init.d/squid3 start
;;
stop)
/etc/init.d/squid3 stop
;;
*)    usage
;;
esac

Facil né. Bom depois e somente testar, simular quedas no master e ver o slave assumindo qualquer dúvida mailme.

Att.

Categories: Uncategorized