Xen-ha

De Xen-BR wiki

Xen-BR 
Xen-HA

Xenlogo.png




Howto de como utilizar Xen + DRBD + Heartbeat no Dom0 para Alta Disponibilidade de maquinas virtuais.

Tabela de conteúdo

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')
Ferramentas pessoais