Xen-ha
De Xen-BR wiki
Howto de como utilizar Xen + DRBD + Heartbeat no Dom0 para Alta Disponibilidade de maquinas virtuais.
Sobre este documento
Este documento apresenta as considerações e informações necessárias para a configuração e utilização de máquinas virtuais xen em um ambiente de alta disponibilidade entre dois servidores.
Serão utilizados 2 servidores que possuem a seguinte configuração de hardware:
* Server 1 - 1 GB de Ram - 01 Processador AMD Athlon(tm) 64 Processor 3000+ - 01 x Disco IDE de 80GB * Server 2 - 1 GB de Ram - 01 Processador AMD Athlon(tm) 64 Processor 3000+ - 01 x Disco IDE de 80GB
Serão criadas quatro máquinas virtuais, denominadas:
* vm0 * vm1 * vm2 * vm3
Sendo que, a vm0 e vm1 estarão preferencialmente alocadas no Server 1, e a vm2 e vm3 estarão preferencialmente alocadas no Server 2.
No caso de um dos servidores falhar, as vms que encontravam-se preferencialmente nele, serão migradas para o outro servidor disponível.
É importante ressaltar que a memória máxima usada por todas as vm's nos dois servidores deverá ser menor que a memória do servidor que possuir menos memória ram. Também é necessário levar em consideração a memória utilizada pelo Dom0.
Ex: 4 máquinas virtuais (vm0, vm1, vm2, vm3) sendo que. vm0 e vm1 encontram-se no Server 1 e vm2 e vm3 encontram-se no Server 2.
Como os dois servidores possuem uma quantidade de memória ram igual:
A quantidade total de memória ram usada pelas vm's deverá ser 1GB. Sendo, que deverá constar nesta quantidade total a memória de um Dom0 e de todos os DomU's.
Neste documento serão utilizados os seguintes softwares:
* Debian Etch Gnu/Linux * Xen versão 3 * Drbd versão 0.7 * Heartbeat versão 1
Responsáveis por esta documentação
- Leonardo Rodrigues de Mello <l AT lmello DOT eu DOT org>
- Marco Sinhoreli <marco AT xen-br DOT org>
Instalação do Debian
Faça uma instalação básica do Debian Etch em dois computadores considerando uma das partições reservadas para LVM. A partição LVM será indispensável para a criação dos VDBs (Virtual Block Devices) das maquinas virtuais que estarão hospedadas no Xen. Não instale nada além do básico!
Vamos considerar os hostnames (eles serão empregados no restante deste howto mas você poderá escolher outro nome) como sendo para o primeiro servidor como server1 e para o segundo como server2.
Não há necessidade de serem computadores com CPU e quantidade de memoria idênticos. Considere que a quantidade de memória deverá ser capaz de suportar o número total de memória alocada nos arquivos de configuração das maquinas virtuais.
Empregaremos neste Howto somente uma placa de rede, embora é recomendo o uso de uma placa exclusiva para a função de HA conectado com um cabo macrossoro.
Instalação dos pacotes
Após concluída a instalação, se logue como root e configure o sources.list do apt:
deb http://ftp.br.debian.org/debian etch main contrib
Agora, atualize o seu sistema apt e instale os pacotes necessários:
root@server1# apt-get update root@server2# apt-get update root@server1# apt-get dist-upgrade root@server2# apt-get dist-upgrade root@server1# apt-get install xen-utils-3.0.3-1 xen-linux-system-2.6.18-3-xen-686 xen-hypervisor-3.0.3-1-i386 bridge-utils \ lvm2 linux-headers-2.6-xen-686 linux-source-2.6.18 libncurses5-dev drbd0.7-utils drbd0.7-module-source gcc libc6-xen heartbeat root@server2# apt-get install xen-utils-3.0.3-1 xen-linux-system-2.6.18-3-xen-686 xen-hypervisor-3.0.3-1-i386 bridge-utils \ lvm2 linux-headers-2.6-xen-686 linux-source-2.6.18 libncurses5-dev drbd0.7-utils drbd0.7-module-source gcc libc6-xen heartbeat
Configure a libc6-xen:
root@server1# echo "hwcap 0 nosegneg" > /etc/ld.so.conf.d/libc6-xen.conf root@server2# echo "hwcap 0 nosegneg" > /etc/ld.so.conf.d/libc6-xen.conf
Após todos os passos, reinicie ambos servidores para iniciar com o kernel Xen.
root@server1# reboot root@server2# reboot
Compilação e instalação do módulos para kernel ( >= 2.6.18 ) sem DEVFS
Descompacte o fonte do módulo do drbd:
# cd /usr/src # tar -xzvf drbd0.7.tar.gz
No diretório dos fontes do módulo, aplique o patch:
# cd /usr/src/modules/drbd # patch -p1 < /usr/src/drbd0.7-krn-2.6.18.patch
Agora descompacte o kernel:
# cd /usr/src # tar -xjvf linux-source-2.6.18.tar.bz2
Rode o module-assistant para resolver as dependencias e deixar o ambiente preparado:
# m-a prepare
Crie o pacote do módulo do drbd para o kernel corrente do xen:
# ARCH=xen m-a build drbd
Instale o pacote:
# dpkg -i /usr/src/drbd0.7-modules*.deb
Inclua o módulo e verifique se foi carregado corretamente.
# modprobe drbd # lsmod | grep drbd
Se tudo correu bem, o modulo drbd esta instalado e pronto para uso.
Configuração dos Volumes LVM
Na tabela abaixo está a arquitetura de discos para as maquinas virtuais
| Tabela de VBDs para as maquinas virtuais |
|---|
| Maquina Virtual | Servidor físico | Disco da VM | Volume lógico | Arquivo de configuração da VM |
|---|---|---|---|---|
| vm0 | server1 | /dev/drbd0 | /dev/samurai/vm0 | /etc/xen/vm0.cfg |
| vm1 | server1 | /dev/drbd1 | /dev/samurai/vm1 | /etc/xen/vm1.cfg |
| vm2 | server2 | /dev/drbd2 | /dev/samurai/vm2 | /etc/xen/vm2.cfg |
| vm3 | server2 | /dev/drbd3 | /dev/samurai/vm3 | /etc/xen/vm3.cfg |
Vamos então criar a estrutura LVM em ambos server (server1 e server2) considerando que a partição que configuramos para ser do tipo LVM é a /dev/hda4:
# pvcreate /dev/hda4 # vgcreate vg /dev/hda4 # vgchange -a y vg # lvcreate -L2G -n vm1 vg # lvcreate -L2G -n vm2 vg # lvcreate -L2G -n vm3 vg # lvcreate -L2G -n vm4 vg
A estrutura de discos das maquinas virtuais estão prontas, passamos agora para o próximo passo.
Configuração do DRBD
No server1, edite o arquivo /etc/network/interfaces:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# This is a list of hotpluggable network interfaces.
# They will be activated automatically by the hotplug subsystem.
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.0.152
netmask 255.255.255.0
gateway 192.168.0.1
Reinicie a rede:
root@server1# /etc/init.d/networking restart
No server2, edite o arquivo /etc/network/interfaces:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.0.153
netmask 255.255.255.0
gateway 192.168.0.1
Reinicie a rede:
root@server2# /etc/init.d/networking restart
Em ambos servers, edite o arquivo /etc/hosts
127.0.0.1 localhost 192.168.0.152 server1 192.168.0.153 server2
Em ambos servers (server1 e server2), edite o arquivo /etc/drbd.conf
resource r0 {
protocol C;
incon-degr-cmd "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ; halt -f";
startup {
degr-wfc-timeout 90;
}
disk {
on-io-error detach;
}
syncer {
rate 10M;
group 2;
al-extents 257;
}
on server1 {
device /dev/drbd0;
disk /dev/samurai/vm0;
address 192.168.0.152:7789;
meta-disk internal;
}
on server2 {
device /dev/drbd0;
disk /dev/samurai/vm0;
address 192.168.0.153:7789;
meta-disk internal;
}
}
resource r1 {
protocol C;
incon-degr-cmd "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ; halt -f";
startup {
degr-wfc-timeout 90;
}
disk {
on-io-error detach;
}
syncer {
rate 10M;
group 2;
al-extents 257;
}
on server1 {
device /dev/drbd1;
disk /dev/samurai/vm1;
address 192.168.0.152:7790;
meta-disk internal;
}
on server2 {
device /dev/drbd1;
disk /dev/samurai/vm1;
address 192.168.0.153:7790;
meta-disk internal;
}
}
resource r2 {
protocol C;
incon-degr-cmd "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ; halt -f";
startup {
degr-wfc-timeout 90;
}
disk {
on-io-error detach;
}
syncer {
rate 10M;
group 2;
al-extents 257;
}
on server1 {
device /dev/drbd2;
disk /dev/samurai/vm2;
address 192.168.0.152:7791;
meta-disk internal;
}
on server2 {
device /dev/drbd2;
disk /dev/samurai/vm2;
address 192.168.0.153:7791;
meta-disk internal;
}
}
resource r3 {
protocol C;
incon-degr-cmd "echo '!DRBD! pri on incon-degr' | wall ; sleep 60 ; halt -f";
startup {
degr-wfc-timeout 90;
}
disk {
on-io-error detach;
}
syncer {
rate 10M;
group 2;
al-extents 257;
}
on server1 {
device /dev/drbd3;
disk /dev/samurai/vm3;
address 192.168.0.152:7792;
meta-disk internal;
}
on server2 {
device /dev/drbd3;
disk /dev/samurai/vm3;
address 192.168.0.153:7792;
meta-disk internal;
}
}
Inicie o serviço drbd em ambos servidores:
root@server1# /etc/init.d/drbd start root@server2# /etc/init.d/drbd start
Deixe o drbd no server1 como primário:
root@server1# drbdadm primary all
Configuração do heartbeat
O heartbeat será responsável pela carga das maquinas virtuais em caso de parada de um dos servidores. As configurações abaixo contemplam um ambiente de alta disponibilidade em caso de desastre.
Nos dois server, edite os arquivos:
- Server1: /etc/ha.d/ha.cf
debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility local7 keepalive 2 deadtime 10 warntime 10 initdead 120 udpport 694 bcast eth0 ucast eth0 192.168.0.152 auto_failback on node server1 node server2 respawn hacluster /usr/lib/heartbeat/ipfail
- Server2: /etc/ha.d/ha.cf
debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility local7 keepalive 2 deadtime 10 warntime 10 initdead 120 udpport 694 bcast eth0 ucast eth0 192.168.0.153 auto_failback on node server1 node server2 respawn hacluster /usr/lib/heartbeat/ipfail
- /etc/ha.d/haresources
server1 drbddisk::r0 drbddisk::r2 xen::/etc/xen/vm0.cfg::vm0 xen::/etc/xen/vm2.cfg::vm2 server2 drbddisk::r1 drbddisk::r3 xen::/etc/xen/vm1.cfg::vm1 xen::/etc/xen/vm3.cfg::vm3
- /etc/ha.d/resource.d/xen
#! /bin/bash
FILE="$1"
VM="$2"
ACT="$3"
XM=/usr/sbin/xm
case "${ACT}" in
start)
$XM create $FILE
;;
stop)
$XM shutdown --halt --wait $VM
;;
esac
- /etc/ha.d/authkeys
auth 1 1 crc
Altere as permissões do arquivo /etc/ha.d/authkeys para que somente o root possa ler e escrever:
chmod 600 /etc/ha.d/authkeys
O heartbeat está configurado. Iremos agora para os proximos passos para depois então fazer os testes necessários.
Configuração do Xen
Será necessário desabilitar o serviço de inicalização das maquinas virtuais xendomains. Para isso remova o serviço da inicialização com o comando abaixo:
server1# update-rc.d -f xendomains remove . server2#
Pare o serviço xendomains:
server1# /etc/init.d/xendomains stop server2#
Configure o xen para utilizar os scripts para bridge na interface física eth0:
(xend-address localhost) (xend-relocation-hosts-allow '^localhost$ ^localhost\\.localdomain$') (network-script network-bridge) (vif-script vif-bridge) (dom0-min-mem 196) (dom0-cpus 0) (vncpasswd )
Reinicie o serviço xend:
/etc/init.d/xend restart
O Xen está corretamente configurado.
Criação das Maquinas virtuais
Vamos inicialmente fazer a instalação da primeira maquina virtual (vm0) que será replicada para as demais utilizando o debootstrap:
server1# mkdir /mnt/vm-base server1# mkfs.ext3 /dev/vg/vm0 server1# mount /dev/vg/vm0 /mnt/vm-base server1# debootstrap --include=libc6-xen etch /mnt/vm-base http://ftp.br.debian.org/debian server1# cat << EOF > /mnt/vm-base/etc/fstab proc /proc proc defaults 0 0 /dev/sda1 / ext3 defaults,errors=remount-ro 0 1 EOF
Preparamos agora as demais maquinas virtuais com este exemplo de shell script abaixo:
mkdir /mnt/vm-copia
for vm in vm1 vm2 vm3
do
mkfs.ext3 /dev/vg/${vm}
mount /dev/vg/${vm} /mnt/vm-copia
cp -av /mnt/vm-base/* /mnt/vm-copia/
umount /mnt/vm-copia
done
Configure o seguintes arquivos em cada volume: /etc/fstab /etc/inittab
Considerações sobre a Alta Disponibilidade do Sistema
O sistema desenvolvido aborda as seguintes possibilidades de falha:
- Falha nos discos ou sistema LVM de uma das máquinas:
A diretiva 'on-io-error detach' do /etc/drbd.conf garante que caso o dispositivo de blocos utilizado pelo drbd em um dos servidores falhe, o servidor irá continuar operando, utilizando o dispositivo remoto.
- Falha do hardware físico de um dos servidores:
O sistema heartbeat será responsável por levantar os serviços em outro servidor, caso ocorram falhas ou desligamento de um dos servidores.
Testes de tolerância à falhas
Foram realizados os seguintes testes de tolerância à falhas:
Falha no Server 1
- Server 1 está rodando as máquinas virtuais vm1 e vm2
- Server 2 está rodando as máquinas virtuais vm3 e vm4
- Server 1 é desligado ou apresenta defeitos de funcionamento
- Heartbeat em Server 2 detecta falha do Server 1
- Heartbeat inicializa máquinas virtuais vm1 e vm2 no Server 2
- Server 1 é restabelecido
- Heartbeat no Server 1 se comunica com Heartbeat em Server 2
- Heartbeat no Server 2 paralisa as máquinas virtuais vm1 e vm2
- Heartbeat no Server 1 inicializa máquinas virtuais vm1 e vm2
- Serviço retorna ao normal
Falha no Server 2
- Server 2 possui máquinas virtuais vm1 e vm2
- Server 1 possui máquinas virtuais vm3 e vm4
- Server 2 é desligado ou apresenta defeitos de funcionamento
- Heartbeat em Server 1 detecta falha do Server 2
- Heartbeat inicializa máquinas virtuais vm3 e vm4 no Server 1
- Server 2 é restabelecido
- Heartbeat no Server 2 se comunica com Heartbeat em Server 1
- Heartbeat no Server 1 paralisa as máquinas virtuais vm3 e vm4
- Heartbeat no Server 2 inicializa máquinas virtuais vm3 e vm4
- Serviço retorna ao normal
Estes testes de tolerância à falhas foram realizados da seguinte forma:
- Simulação da falha do servidor através da parada do serviço de heartbeat
Ex: Caso deseje simular a falha do server 1, digite o seguinte comando no server 1:
root@server1#/etc/init.d/heartbeat stop
- Parada do servidor através do seu desligamento forçado (puxando cabo de
alimentação da tomada)
- Parada do servidor através do seu desligamento correto. (comando 'shutdown')