|
Essa semana estive fazendo diversos testes com HA (alta disponibilidade) em Linux. Abaixo descrevo como foi essa experiência com DRBD.
O DRBD é um software que permite fazer RAID pela rede, ou seja, podemos replicar dados de partições inteiras pela rede. É um recurso extraordinário para servidores críticos, onde seus dados não podem ser perdidos.
Nesse teste, utilizei duas máquinas virtuais criadas para documentação. As máquinas para produção são duas máquinas reais que estão funcionando atualmente com esta mesma configuração. Tive muitos problemas para encontrar informações na internet sobre este recurso, portanto, qualquer coisa a adicionar, será bem-vinda.
Primeiramente, as duas máquinas são Linux, rodando Debian lenny, instaladas apenas com o sistema básico. Abaixo o nome e o ip das máquinas que eu usei:
Nome das máquinas:
Node1 – 192.168.241.10
Node2 – 192.168.241.20
A partição que eu criei está em /dev/sda2 (segunda partição primária no primeiro disco).
É interessante observar que os dois micros devem ter partições separadas para replicação, por exemplo:
Node1
3 partições(hd de 10GB): 5GB para a partição / - /dev/sda1 5GB para a partição /kplus - /dev/sda2 – partição a ser replicada 780MB para swap - /dev/sda3
Node2
3 partições(hd de 10GB): 5GB para a partição / - /dev/sda1 5GB para a partição /kplus - /dev/sda2 - partição a ser replicada 780MB para swap - /dev/sda3
Podemos também reservar discos inteiros para a replicação, depende muito do orçamento que pode ser gasto.
O nome da pasta que estou utilizando para montar o sistema de arquivos é /kplus nas duas.
O primeiro passo é fazer com que as duas máquinas possam ser pingadas por nomes, para isso altere o arquivo hosts:
Node1:
#vim /etc/hosts
Deixar como segue:
127.0.0.1 localhost 127.0.1.1 node1.onomedoseudominiovaiapareceraqui node1 192.168.241.20 node2
Node2:
#vim /etc/hosts
Deixar como segue: 127.0.0.1 localhost 127.0.1.1 node2.onomedoseudominiovaiapareceraqui node2 192.168.241.10 node1
Para verificar:
Node1:
#ping node2
Node2:
#ping node1
Instale as ferramentas com o comando:
Node1:
#apt-get install drbd8-utils drbd8-modules-`uname -r`
Node2:
#apt-get install drbd8-utils drbd8-modules-`uname -r`
Configurar o arquivo /etc/drbd.conf nas duas máquinas (deixar o arquivo exatamente igual nas duas)
Node1:
#vim /etc/drbd.conf
Node2:
#vim /etc/drbd.conf
Coloque as informações abaixo:
global {
usage-count yes;
}
common {
# Velocidade de transferencia (utilize em torno de 40% a 60% da sua banda total)
syncer { rate 100M; }
}
# Nome do resource em questao (sera utilizado como referencia nos comandos posteriores)
resource dados {
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'
Este endereço de e-mail está protegido contra spambots. Você deve habilitar o JavaScript para visualizá-lo.
";
}
startup {
degr-wfc-timeout 120; # 2 minutes.
}
disk {
on-io-error detach;
}
net {
sndbuf-size 512k;
timeout 60; # 6 seconds (unit = 0.1 seconds)
connect-int 10; # 10 seconds (unit = 1 second)
ping-int 10; # 10 seconds (unit = 1 second)
ping-timeout 5; # 500 ms (unit = 0.1 seconds)
max-buffers 20480;
cram-hmac-alg "sha1";
shared-secret "dfadspuy234523n"; # esta chave éma senha de conexao, de qualquer valor
after-sb-0pri discard-older-primary;
after-sb-1pri violently-as0p;
after-sb-2pri disconnect;
rr-conflict disconnect;
}
syncer {
rate 100M; # novamente referente a transferencia de rede
al-extents 257;
}
on node1 {
device /dev/drbd0; #aqui será o endereço do dispositivo (disco) virtual do DRBD
disk /dev/sda2; #aqui será a partição do disco que será replicada
address 192.168.241.10:7788; #ip do node1
meta-disk internal; #onde será colocado o meta-disk do drbd (neste caso, vai ficar junto com o resto do sistema)
}
on node2 {
device /dev/drbd0; #aqui será o endereço do dispositivo (disco) virtual do DRBD
disk /dev/sda2; #aqui será a partição do disco que será replicada
address 192.168.241.20:7788; #ip do node1
meta-disk internal; #onde será colocado o meta-disk do drbd (neste caso, vai ficar junto com o resto do sistema)
}
}
Meta-disk – disco temporário utilizado pelo drbd para armazenamento.
Desmontar as partições nas duas máquinas
Node1:
#umount /kplus
Node2:
#umount /kplus
Retirar a entrada para a pasta do fstab das duas máquinas (ou comentar com tralha)
Node1:
#vim /etc/fstab
Node2:
#vim /etc/fstab
Zerar o disco nas duas máquinas
Node1:
#dd if=/dev/zero of=/dev/sda2 bs=1M count=128
Node2:
#dd if=/dev/zero of=/dev/sda2 bs=1M count=128
Criar o disco virtual
Node1:
#drbdadm create-md dados
Node2:
#drbdadm create-md dados
Atachar o disco nas duas máquinas
Node1:
#drbdadm attach dados
Node2:
#drbdadm attach dados
Sincronizar
Node1:
#drbdadm syncer dados
Node2:
#drbdadm syncer dados
Iniciar replicação no node1
Node1:
#drbdadm -- --overwrite-data-of-peer primary dados
Reiniciar o servico nas duas máquinas
Node1:
#/etc/init.d/drbd restart
Node2:
#/etc/init.d/drbd restart
Verifique se a sincronização começou:
#cat /proc/drbd
Verifique se o resultado está parecido com o apresentado abaixo:
version: 8.0.14 (api:86/proto:86)
GIT-hash: bb447522fc9a87d0069b7e14f0234911ebdab0f7 build by phil@fat-tyre, 2008-11-12 16:40:33
0: cs:SyncSource st:Secondary/Secondary ds:UpToDate/Inconsistent C r---
ns:898320 nr:0 dw:0 dr:909728 al:0 bm:54 lo:0 pe:15 ua:357 ap:0
[==>.................] sync'ed: 18.5% (3892/4769)M
finish: 0:00:39 speed: 99,760 (99,760) K/sec
resync: used:2/61 hits:56431 misses:56 starving:0 dirty:0 changed:56
act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
após a sincronização ter terminado, verifique o resultado do comando novamente:
#cat /proc/drbd
Verifique se o resultado está parecido com o apresentado abaixo:
version: 8.0.14 (api:86/proto:86)
GIT-hash: bb447522fc9a87d0069b7e14f0234911ebdab0f7 build by phil@fat-tyre, 2008-11-12 16:40:33
0: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r---
ns:4883572 nr:0 dw:0 dr:4883572 al:0 bm:299 lo:0 pe:0 ua:0 ap:0
resync: used:0/61 hits:304925 misses:299 starving:0 dirty:0 changed:299
act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
Definindo maquina primaria
Node1:
#drbdadm primary all
Node2:
#drbdadm secondary all
Formate o disco virtual no node1
Node1:
#mkfs.reiserfs /dev/drbd0
Caso precise alterar a máquina primária e secundária:
Node1:
#drbdadm secondary all
Node2:
#drbdadm primary all
Adicione no fstab das duas máquinas:
Node1:
#vim /etc/fstab
adicione a linha:
/dev/drbd0 /kplus reiserfs noauto 0 0
Node2:
#vim /etc/fstab
adicione a linha:
/dev/drbd0 /kplus reiserfs noauto 0 0
Realizando testes:
Monte a pasta no node1:
#mount /kplus
Crie um arquivo na pasta montada, com qualquer conteúdo:
#ls / > /kplus/teste.txt
Verifique se o arquivo foi criado:
#ls /kplus
Desmonte a pasta:
#umount /kplus
Defina o node1 como secundário:
#drbdadm secondary all
Defina o node2 como primário
#drbdadm primary all
Monte a pasta no node2
#mount /kplus
Verifique se o arquivo foi criado:
#ls /kplus
Instalando e configurando o Heartbeat
O Heartbeat é o software responsável por monitorar os computadores que fazem parte da replicação e tomar atitudes de acordo com os casos encontrados. Podemos dizer que este é o coração do que conhecemos como HA (alta disponibilidade). Abaixo, veremos como instalar e configurar o heartbeat, dando continuação aos passos anteriores, quando configuramos o DRBD.
A configuração que vamos realizar do Heartbeat irá criar um novo ip virtual na rede (192.168.241.15) que chamaremos de “GEMINI” (gêmeos). Os usuários acessarão os dados compartilhados pelo ip virtual e as duas máquinas (node1 e node2) responderão por ele. Em caso de perda de qualquer uma das máquinas, o Heartbeat irá reconfigurar os equipamentos para que o ip virtual continue respondendo.
Temos um desenho sobre como ficará a estrutura:

Vamos a instalação:
Node1:
apt-get install heartbeat-2
Node2:
apt-get install heartbeat-2
Configurar o arquivo ha.cf nas duas máquinas:
Node1:
#vim /etc/ha.d/ha.cf
Node2:
#vim /etc/ha.d/ha.cf
Deixar como segue:
#informe os nomes dos computadores que formam a replicação(deve ser igual a saída do comando #uname -n
node node1
node node2
#qual a interface vai ser usada para comunicação
udp eth0
#arquivos de log
debugfile /var/log/ha-debug
logfile /var/log/ha-log
#freqüência, em segundos, da verificação das máquinas
keepalive 1
#tempo mínimo para declarar a outra máquina como morta
deadtime 5
Configurar o arquivo haresources nas duas máquinas
Node1:
#vim /etc/ha.d/haresources
Node2:
#vim /etc/ha.d/haresources
Deixar como segue:
node1 drbddisk::dados Filesystem::/dev/drbd0::/kplus::reiserfs 192.168.241.15 samba
Obs.:
node1 – nome da máquina principal
drbddisk – utilitário do heartbeat para gerenciar o drbd
dados – nome do dispositivo do drbd (configurado no drbd.conf)
Filesystem – utilitário para montagem de partição
/dev/drbd0 – nome da unidade do drbd
/kplus – nome do local de montagem do disco do drbd
reiserfs – sistema de arquivos do disco do drbd
192.168.241.15 – ip virtual
samba – script do init.d para o samba
Configurar o arquivo authkeys nas duas máquinas (para efeito da autenticação da replicação)
Node1:
#vim /etc/ha.d/authkeys
Node2:
#vim /etc/ha.d/authkeys
Deixar como segue:
auth 3
3 md5 digiteumafrase
Mudar os atributos do arquivo authkeys
Node1:
#chmod 600 /etc/ha.d/authkeys
Node2:
# chmod 600 /etc/ha.d/authkeys
Reinicie o serviço do heartbeat
Node1:
#/etc/init.d/heartbeat restart
Node2:
#/etc/init.d/heartbeat restart
Testando
Verifique se o ip virtual está respondendo executando um ping de uma máquina da rede rodando Windows ou Linux (supondo que você tenha uma máquina cliente).
Ping 192.168.241.15 –t
Desligue, reinicie ou retire o cabo de rede do node1 (se for uma máquina física).
Verifique que o ip pára de responder no momento em que o node1 cai e após alguns segundos retorna, sendo gerenciado pelo node2.

Você pode conferir o resultado do comando ifconfig no node1, veja que ele tem um ip virtual (antes de desliga-lo):

No momento do desligamento do node1, o ip virtual passa a ser gerenciado pelo node2, como pode ser visto no resultado do comando ifconfig no node2:

Samba
Agora só falta dar alguma função para este servidor. Para isso iremos instalar o samba e compartilhar uma pasta no ip virtual:
Instalar o samba:
Node1:
#apt-get install samba
Node2:
#apt-get install samba
Configurar o smb.conf
Node1:
#vim /etc/samba/smb.conf
Node2:
#vim /etc/samba/smb.conf
Deixe como o arquivo abaixo
[global]
workgroup = digiteonomedogrupodetrabalho
server string = Gemini
netbios name = Gemini
dns proxy = no
log file = /var/log/samba/%m.log
max log size = 500
debug level = 1
security = share
encrypt passwords = yes
smb passwd file = /etc/samba/smbpasswd
username map = /etc/samba/smbusers
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
unix charset = iso-8859-1
winbind uid = 10000-20000
winbind gid = 10000-20000
winbind enum users = yes
winbind enum groups = yes
template homedir = /dev/null
template shell = /dev/null
winbind use default domain = yes
passdb backend = smbpasswd
preferred master = no
wins support = yes
[kplus]
path = /kplus/
read only = No
create mask = 0777
force create mode = 0777
directory mask = 0777
force directory mode = 0777
guest ok = yes
Restarte o serviço do samba e faça os testes de acesso, desligando o node1 e verificando se o acesso permanece.
Node1:
#/etc/init.d/samba restart
Node2:
#/etc/init.d/samba restart
Caso aconteça o que chamamos de split brain (os micros passam a trabalhar separados) terão que ser feita algumas ações.
Você pode verificar em /proc/drbd: se aparecer Standalone, é provável que você tenha o problema.
Maquina que você acha que tem dados inválidos:
#drbdadm secondary dados #drbdadm -- --discard-my-data connect dados
E na máquina que está correta:
#drbdadm connect dados
Sites consultados
http://ha-mc.org/node/15
http://www.vivaolinux.com.br/dica/HeartBeat-Web-server-com-Alta-Disponibilidade-(HA)
e muita busca no google
|