Usando DRBD com GFS e Fencing Manual
Posted by: Tiago Cruz in Linux, Scripts, Red Hat, Cluster
* DRBD 8.x
DBRD é a acrônimo para o nome inglês Distributed Replicated Block Device. O DRBD consiste num módulo para o kernel de Linux que, juntamente com alguns scripts, oferece um dispositivo de bloco projetado para disponibilizar dispositivos de armazenamento distribuídos, geralmente utilizado em clusters de alta disponibilidade. Isto é feito espelhando conjuntos de blocos via rede (dedicada). O DRBD funciona, portanto, como um sistema RAID baseado em rede.
Referência: http://pt.wikipedia.org/wiki/DRBD
* GFS 1.x
O “Red Hat Global File System” é um Sistema de Arquivos para Cluster, que permite que vários nós leiam e escrevam dados simultaneamente em um dispositivo compartilhado.
O GFS suporta ACL’s e atributos extendidos, diferente se seu concorrente direto, o OCFS (Oracle Cluster File System)
Vale observar que a versão 2.0 do GFS ainda é considerado “Technology Preview” e não deve ser usado em produção.
Porém, o GFS congela todo o I/O se ele perde um nó (cliente), e fica congelado até o que o nó retorne ou que o mesmo seja “fenced”.
Referência: http://www.redhat.com/gfs/
http://en.wikipedia.org/wiki/Comparison_of_file_systems
* Fence Devices
Fence é algo difícil de traduzir para a nossa língua, assim como a palavra “proxy” O Babylon sugere “grade; muro; cercar; proteger” enquanto o Google Translator sugere “vedação”.
Enfim, é algo nesse sentido: Se um nó do cluster apresenta problemas, para evitar que esse cara escreva algo no FileSystem? e acabe por corromper o mesmo, é necessário que o mesmo seja “fenceado”, ou seja, tirado da jogada. As formas comuns se se fazer isso são:
- Desligando a alimentação de energia deles;
- Desligando a porta do switch;
- Reiniciando a máquina usando DRAC/RSA/ILO (Dell, IBM e HP respectivamente);
- Manualmente;
Utilizaremos a forma menos recomendada (manual) devido a falta de infra-estrutura para utilizarmos as demais. Um script do modificado do DRBD irá tornar o fencing_manual em um fencing automatizado
Referência: http://www.everlinux.com/blog/2008/04/22/redhat-enterprise-linux-51-cluster-suite/
* LVM
Usaremos LVM para garantir flexibilidade da solução:
Criar volumes LV nas duas máquinas
# pvcreate /dev/sda9
# vgcreate vol0 /dev/sda9
# lvcreate -L 105.94G -n lvm vol0
- Configurando o DRBD
Configurar o /etc/hosts para conter todas as maquinas, principalmente o hostname no IP principal e um nome para os IPs da rede de sincronismo:
127.0.0.1 localhost.localdomain localhost
10.10.10.1 hotsite-1.com.br
10.10.10.2 hotsite-2.com.br
192.168.0.3 drbd_hotsite-1 drdb_hotsite-1.com.br
192.168.0.4 drdb_hotsite-2 drdb_hotsite-2.com.br
Configurar o /etc/drbd.conf no master e slave
# DRDB Configuration
global {
usage-count no;
}resource hotsite {
protocol C;startup {
wfc-timeout 0;
degr-wfc-timeout 120;
become-primary-on both;
}
disk {
fencing resource-and-stonith;
}
handlers {
outdate-peer “/sbin/obliterate”;
}
net {
cram-hmac-alg sha1;
shared-secret “senha_secreta”;
timeout 60;
connect-int 10;
ping-int 10;
max-buffers 2048;
max-epoch-size 2048;
allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
rr-conflict violently;
}
syncer {
rate 650M;
}on hotsite-1.com.br {
device /dev/drbd0;
disk /dev/vol0/lvm;
address 192.168.0.3:7789;
flexible-meta-disk internal;
}on hotsite-2.com.br {
device /dev/drbd0;
disk /dev/vol0/lvm;
address 192.168.0.4:7789;
flexible-meta-disk internal;
}
}
Inicializar as partições para o drbd no master e slave
# drbdadm create-md hotsite |
# drbdadm attach hotsite | drbdadm up hotsite
# drbdadm connect hotsite |
# drbdadm -- --overwrite-data-of-peer primary hotsite
# watch -n1 cat /proc/drbd
# drbdadm primary hotsite
Obs: Caso de erro de carga de modulo inicie o drbd com “service drbd start” mesmo acusando erro, isso fará com que carregue o modulo corretamente.
Inicializar o drbd no master e slave
# service drbd start
- Configurando o cluster para o GFS
* Crie o arquivo de configuração do cluster (/etc/cluster/cluster.conf) para o gfs, em todas as maquinas:
Vou colocar ele em um arquivo separado pois o wordpress não está gostando as tags do mesmo
Formatar a partição DRBD com GFS
# gfs_mkfs -t hotsite:gfs-00 -p lock_dlm -j 2 /dev/drbd0
Com isto ele irá iniciar o sincronismo com slave, pode ser observado executando o comando:
# watch -n 1 cat /proc/drbd
Inicie o serviços de cluster:
# service cman start
Testando
# mount -v /dev/drbd0 /data
# for i in `seq 1 10`; do a=`echo $RANDOM`; dd if=/dev/zero of=/data/$a bs=1k count=$a; sleep 1; done
# ls -ltrk /data
Forçando um reboot:
# echo 1 > /proc/sys/kernel/sysrq
# echo b > /proc/sysrq-trigger
Para forçar o sincronismo de uma máquina
(faça somente se souber o que está fazendo)
# drbdsetup /dev/drbd0 primary -o
Ordem dos scripts:
Essa deverá ser a ordem para init level 0 e 6, pois durante o reboot/ shutdown da máquina o procedimento é o seguinte:
- Desmonta a partição
- Tira a máquina do Cluster
- Para o DRBD
[root@hotsite-2 /etc/rc0.d]# ll | egrep '(partition|drbd|cman)'
lrwxrwxrwx 1 root root 12 Jun 13 11:57 K80partition -> ../init.d/partition
lrwxrwxrwx 1 root root 14 Jun 13 11:47 K81cman -> ../init.d/cman
lrwxrwxrwx 1 root root 14 Jun 13 11:57 K82drbd -> ../init.d/drbd
Para os init level 3, 4 e 5 deverá ser:
- Coloca a máquina do Cluster
- Inicia o DRBD
- Monta a partição do drbd (pois o mesmo irá falhar durante a inicialização)
[root@hotsite-2 /etc/rc3.d]# ll | egrep '(partition|drbd|cman)'
lrwxrwxrwx 1 root root 14 Jun 13 11:55 S21cman -> ../init.d/cman
lrwxrwxrwx 1 root root 14 Jun 13 11:55 S70drbd -> ../init.d/drbd
lrwxrwxrwx 1 root root 12 Jun 13 11:55 S91partition -> ../init.d/partition
O Script obliterate
O script Obliterate foi escrito pelo Lon Hohberger e está disponível aqui.
Eu alterei as últimas linhas pois o fence_manual precisa que o comando fence_ack_manual seja executado, senão o GFS não vai liberar o I/O do cluster enquanto o outro nó não retornar com sucesso…
#
fence_node $REMOTE
fence_ack_manual -O -e -n $REMOTEif [ $? -eq 0 ]; then
# Reference:
# http://osdir.com/ml/linux.kernel.drbd.devel/2006-11/msg00005.html
# 7 = node got blown away.
exit 7
fi# Fencing failed?!
exit 1
Referência: http://sources.redhat.com/cluster/wiki/DRBD_Cookbook

Entries (RSS)
June 16th, 2008 at 5:24 pm
Olá,
estou começando a estudar DRBD e heartbeat e gostaria de saber se é possível implementar a seguinte solução para se ter um “cluster” de um banco de dados Oracle: heartbeat+drbd em servidiores idênticos com a base de dados do oracle em sistema de arquivos ext3.
June 16th, 2008 at 5:49 pm
Olá Rodrigo,
Sim, é possível. Porém apenas uma máquina ficaria “online” respondendo… o DRBD deverá ser configurado em Primário/ Secundário.
A máquina secundária só entrará em “produção” quando a primária cair… quem vai fazer isso será os scripts do heartbeat (montar a partição, iniciar o oracle…)
Abraços
June 16th, 2008 at 7:16 pm
Bacana em thiago… preciso testar qualquer hora destas…
Abraços…
June 17th, 2008 at 1:51 am
Obrigado pela resposta Tiago.
Saberia me dizer se é possível utilizar a solução que eu comentei quando já se tem um servidor oracle em produção, isto é, implementar o DRBD sem refazer as partições do oracle deste servidor que está em produção, ou sem parar este servidor. Ou levantar o segundo servidor com DRBD fazer ele responder pelas consultas, parar o que está em produção, adicioná-lo no DRBD, algo do tipo?
Acho que ví algo do tipo do guia do usuário do DRBD, não estou muito certo disso.
June 18th, 2008 at 4:27 am
Rodrigo,
Diretamente, até onde sei o DRBD precisa criar um cabeçalho no disco/partição apagando todas as informações dele, contudo, já que os 2 servidores são iguais acredito ser possível realizar uma “dobradinha” e migrar os
dados sem problemas.
Abraços.
June 18th, 2008 at 4:32 am
Rodrigo,
Cometi uma pequena gafe, existem 2 modos disso funcionar:
Select an initial sync source. If you are dealing with newly-initialized, empty disk, this choice is entirely arbitrary. If one of your nodes already has valuable data that you need to preserve, however, it is of crucial importance that you select that node as your synchronization source. If you do initial device synchronization in the wrong direction, you will lose that data. Exercise caution.
Ou seja, se você definir o servidor 1 como seu servidor primário, você pode clonar os dados para o segundo sem perder os arquivos.
June 18th, 2008 at 10:45 am
Rodrigo,
Até dá para fazer, desde que o seu Oracle já esteja em uma partição só para ele (ex: uma LVM).
Aí você cria o DRBD em cima dessa partição, ex:
on oracle-1.com.br {
device /dev/drbd0;
disk /dev/lvm/oracle;
address 192.168.0.1:7789;
flexible-meta-disk internal;
}
E na outra máquina você usa a mesma partição para replica-lo. Porém, faça isso primeiro em ambiente de testes (VM’s) e você pode até pensar em usar o OCFS (Oracle Cluster FileSystem) que já é próprio para o Oracle.
Agora, se você não tem uma partição separada, precisará de espaço em disco o suficiente para criar a partição/LVM e migrar os dados do banco para lá…
Abraços
June 20th, 2008 at 10:10 am
O que é exatamente que o GFS faz? ele pode ser comparado ao NFS?
June 20th, 2008 at 10:30 am
Ricardo,
O GFS é um FileSystem para Clusters que permite escrita simultânea no mesmo arquivo vindo de vários nós diferentes.
Dê uma olhada aqui para você entender melhor:
http://www.redhat.com/magazine/008jun05/features/gfs_nfs/
Abraços
July 30th, 2008 at 3:58 pm
Tiago, muito bom seu artigo, porem, tenho uma duvida,
fiz funcionar a escrita nos 2 discos ao mesmo tempo e tudo mas, o problema é quando eu desligo um deles, ai trava tudo e nao consigo escrever no outro node que esta ativo.
Voce ja passou por isso?
July 30th, 2008 at 4:42 pm
Olá Bruno,
Sim, já passei por isso inúmeras vezes e provavelmente o GFS está bloqueando o I/O porque seu nó morto não foi corretamente “fenceado”.
É para isso que serve o /sbin/obliterate que manda um “fence_ack_manual -O -e -n $REMOTE” no cara que caiu para o GFS parar de encher o saco e liberar o I/O novamente.
Recomendo que tenha um fence_device descente (via DRAC/RSA por exemplo) porque o manual é uma merda mesmo
Abraços
July 30th, 2008 at 4:57 pm
Na verdade eu não to utilizando o fence manual
Estou usando o uma bladecenter que faz o fence via RSA, porem continua a mesma coisa,
Nos logs eu vi que ele ta dando erro na parte de fencing agora:
Jul 30 17:18:39 node1 kernel: drbd0: helper command: /sbin/drbdadm outdate-peer
Jul 30 17:18:44 node1 fence_node[9470]: Fence of “10.0.20.35″ was unsuccessful
Jul 30 17:18:44 node1 kernel: drbd0: outdate-peer helper broken, returned 1
Vou dar uma olhada pra ver se acho algo a mais pra resolver isso ai posto aqui.. Valeuu
July 30th, 2008 at 5:09 pm
É isso mesmo, o fence do cluster.conf não está corretamente configurado — ou está correto porém não funciona :/
Passei por isso no fence_gnbd e acabei desistindo… se você conseguir algo, por favor compartilhe conosco visto que em pt_BR é difícil achar algo sobre este assunto :-/
Abraços e boa sorte
September 3rd, 2008 at 10:19 am
Bom dia;
Gostaria de saber se é possivel utilizar o Drbd para trabalhar em 2 maquinas como primarias pois eu estou balanceando as requisiçoes entre os servidores web.
E gostaria de saber também se é possivel utilizar o Drbd sem o heartbeat?
Desde já agradeço!
September 3rd, 2008 at 12:45 pm
Diego, boa tarde!
Sim, é possível usar em duas máquinas como primary desde que seu filesystem suporte a concorrência de escrita no mesmo (GFS ou OCFS, por exemplo).
Sim, é possível usa-lo sem o heartbeat, são dois projetos completamente distintos.
Abraços
September 3rd, 2008 at 1:26 pm
Tiago, boa tarde!
Seria possivel você me dar um auxilio, ou disponibilizar algum material para que posso ver e entender seu funcionamento para dar andamento no meu projeto de conclusao de curso, nele eu estou implementando servidores web em linux com alta disponibilidade, balanceamento de carga e sincronizaçao de arquivos a alta disponibilidade e o balanceamento eu consegui implementar e ja ta funcionando blz!
Agora a parte de sincronizaçao tudo que eu acho utiliza o drbd com heartbeat e uma maquina master e uma slave + com eu alterno as requisiçoes entre os servidores nao posso implementar como master e slaver!
Se puder me dar um auxilio desde já agradeço!
Abraços
September 3rd, 2008 at 1:39 pm
Diego,
Segue alguns links que podem te ajudar:
http://ha-mc.org/?q=node/15
http://sources.redhat.com/cluster/wiki/DRBD_Cookbook
http://sources.redhat.com/cluster/wiki/FAQ/GFS
September 3rd, 2008 at 1:56 pm
Ok Tiago obrigado!
September 4th, 2008 at 10:55 am
Diego,
Dê uma olhada no ChironFS que pode atender suas necessidades:
http://www.everlinux.com/blog/2008/08/06/conhecendo-o-chironfs-tolerante-a-falhas-com-replicacao-de-dados/
Eu particularmente prefiro ele ao DRBD8 com Dual Primary