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)