Vmware em HA ( high availability )
Objectivo / Introdução
O objectivo deste tutorial é disponibilizar as principais instruções passo a passo para a criação de um sistema de alta disponibilidade com 2 nós utilizando as seguintes tecnologias:
- debian etch;
- vmware;
- drbd;
- heartbeat;
Este artigo parte do principio que temos um sistema debian etch com vmware instalado nas duas máquinas.
Vamos precisar de uma partição para a replicação do filesystem. Consideremos a seguinte estrutura como exemplo:
/dev/sda1 -- 500 MB /boot (primary, ext3, Bootable flag: on)
/dev/sda5 -- 10000 MB / (logical, ext3)
/dev/sda6 -- 2000 MB swap (logical)
/dev/sda7 -- 60 GB unmounted (logical) (will contain the /var/vm directory)
Nota: Dar os comandos em ambos os servidores, salvo especificado em contrário.
Instalação de pacotes necessários
Caso estejamos a utilizar uma máquina com memória RAM superior a 4GB é necessário instalar um novo kernel denominado "bigmem" e os respectivos headers.
apt-get update
apt-get install linux-image-2.6.18-4-686-bigmem linux-headers-2.6.18.-4-686-bigmem
Instalamos o drbde alguns pacotes necessários
apt-get install ssh drbd0.7* module-assistant heartbeat build-essential psmisc
Configuração do drbd
Na instalação do pacote drbd em debian, é copiado o codigo fonte para /usr/src, sendo necessário compilar e instalar .
cd /usr/src
tar xzf drbd0.7.tar.gz
cd /usr/src/modules/drbd/drbd
make && make install
Configuramos o drbd para usar a partição definida anteriormente ( /dev/hda7 ) como um "drbd device" e criar o sistema de ficheiros para ser utilizado.
Como boa prática, podemos salvaguardar o ficheiro que vem por defeito com as configurações.
mv /etc/drbd.conf /etc/drbd.conf-sample
nano /etc/drbd.conf
resource vm1 {
protocol C;
incon-degr-cmd "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ; halt -f";
startup {
wfc-timeout 10; # 10 seconds
degr-wfc-timeout 30; # 30 seconds
}
disk {
on-io-error detach;
}
net {
max-buffers 20000; # Play with this setting to achieve highest possible performance
unplug-watermark 12000; # Play with this setting to achieve highest possible performance
max-epoch-size 20000; # Should be the same as max-buffers
}
syncer {
rate 10M; # Use more if you have a Gigabit network. Speed is in Kylobytes. e.g.: 10M = 10Megabytes
group 1;
al-extents 257;
}
on server1 { # Use the EXACT hostname of your server as give by the command "uname -n"
device /dev/drbd0; # drbd device ID
disk /dev/sda7; # physical disk device , check your partitioning scheme !!
address 172.20.20.100:7789; # Fixed IP address of server1
meta-disk internal; # I use internal metadata storage
}
on server2 {
device /dev/drbd0;
disk /dev/sda7;
address 172.20.20.200:7789;
meta-disk internal;
}
}
Podemos ligar o serviço e criar o filesystem.
( nos 2 servers executar )
modprobe drbd
drbdadm up all
No server1, definimos como master/primary server:
drbdsetup /dev/drbd0 primary --do-what-I-say
mkfs.ext3 /dev/drbd0
drbdadm connect all
Neste momento demos inicio á sincronização dos file systems e podemos observar o mirroring através do comando
cat /proc/drbd
Devemos obter um output semelhante a este.
version: 0.7.10 (api:77/proto:74)SVN Revision: 1743 build by phil@mescal, 2005-01-31 12:22:07
0: cs:SyncSource st:Primary/Secondary ld:Consistent
ns:13441632 nr:0 dw:0 dr:13467108 al:0 bm:2369 lo:0 pe:23 ua:226 ap:0
[==========>.........] sync'ed: 53.1% (11606/24733)M
finish: 1:14:16 speed: 2,644 (2,204) K/sec
1: cs:Unconfigured
Uma vez finalizada a sincronização podemos montar o filesystem criado em /var/vm, ou no directorio especificado para as maquinas virtuais definido na instalação do vmware.
mount -t ext3 /dev/drbd0 /var/vm
Neste momento deveremos ter a replicação configurada e a funcionar em ambos os servers. Podemos prosseguir com a configuração do heartbeat.
Configuração do Heartbeat
Com a instalação do heartbeat vamos ficar com a mudança automatica dos serviços entre os 2 server no caso de uma falha.
( os comandos seguintes devem ser executados nos 2 servers )
Basicamente temos de editar 3 ficheiros de configuração do heartbeat: "ha.cf", "haresources" and "authkeys".
nano /etc/ha.d/ha.cf
logfile /var/log/ha-log
logfacility local0
keepalive 1
deadtime 10
warntime 10
udpport 694
bcast eth1
auto_failback off
node server1 ## make sure both names are accessible - check /etc/hosts
node server2
ping 192.168.0.254 ## Enter an IP address that is pingable from the ETH0 network !!
respawn hacluster /usr/lib/heartbeat/ipfail
Editamos agora o ficheiro authkeys:
nano /etc/ha.d/authkeys
auth 3
3 md5 failover ## this is just a string, enter what you want ! auth 3 md5 uses md5 encryption
Temos que alterar as permissões
chmod 600 /etc/ha.d/authkeys
Editamos também o ficheiro haresources
nano /etc/ha.d/haresources
server1 192.168.0.10 drbddisk::vm1 Filesystem::/dev/drbd0::/var/vm::ext3 vmstart
# Explanation:
# Primary Server name --> virtual IP address to be used --> DRBD resource as configurd in /etc/drbd.conf
# --> where to mount the DRBD resource and the filesystem type --> resource to start/stop in case of failover
# the "vmstart" resource is a custom script needed for VMWare Server since you can't have heartbeat take control of
# the vmware services or you will run into the dreaded "not configured for this machine" errors !
Uma nota especial para o script vmstart, uma vez que é ele o responsavel pelo arranque das maquinas virtuais em caso de falha.
O script vai ficar situado em "/etc/ha.d/resource.d/" .
nano /etc/ha.d/resource.d/vmstart
#!/bin/bash
case "$1" in
start)
/usr/bin/vmware-cmd -s register "/var/vm/'virtual machine name'/'vm config file'.vmx" 2>/dev/null
/usr/bin/vmware-cmd "/var/vm/'virtual machine name'/'vm config file'.vmx" start 2>/dev/null
;;
stop)
/usr/bin/vmware-cmd "/var/vm/'virtual machine name'/'vm config file'.vmx" stop trysoft 2> /dev/null
;;
status)
if `/usr/bin/vmware-cmd "/var/vm/'virtual machine name'/'vm config file'.vmx" getstate 2>/dev/null | grep -q "getstate() = on"`
then
echo "running"
else
echo "stopped"
fi
;;
*)
echo "Usage: `basename $0` 'virtual machine file' {start|stop|status}"
echo "Where "virtual machine file" is like /var/vm/'virtual machine name'/'vm config file'.vmx"
;;
esac
exit 0
Os parametros 'virtual machine' e 'vm config file' devem ser adaptados caso a caso.
Para mais do que uma maquina virtual, replicamos os comandos ...
O script vai registar a maquina virtual e depois arrancar com a mesma.
Terminadas as configurações, podemos testar. Devemos arrancar com o serviço heartbeat primeiro no server1 e depois no server2.
/etc/init.d/heartbeat start
Se não houver problemas deveremos obter informação sobre o nosso "virtual ip" no "master server" através do comando:
ifconfig |more
Output:
eth0 Link encap:Ethernet HWaddr 00:11:09:00:BB:5D
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::211:9ff:fe00:bb5d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1025774 errors:0 dropped:0 overruns:0 frame:0
TX packets:227653 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:281072399 (268.0 MiB) TX bytes:56403081 (53.7 MiB)
eth0:0 Link encap:Ethernet HWaddr 00:11:09:00:BB:5D
inet addr:192.168.0.10 Bcast:192.168.0.255 Mask:255.255.255.0
...
Uma vez terminada a instalação podemos provocar o
failover e observar o nosso
slave server a retomar o serviço.
--
PedroRodrigues - 22 Sep 2007