In questo articolo creeremo un setup formato da due server con hypervisor Xen e datastore locale su partizione LVM replicata sui due server in realtime utilizzando DRBD.
Questo sistema, non è certo adatto ad essere un vero e proprio cloud, ma è il metodo che preferisco per creare un sistema di virtualizzazione aziendale efficiente, performante e poco costoso… a scapito di una gestione non proprio semplicissima
In questo articolo assumeremo di avere due server con indirizzo IP 192.168.255.1 (xen1) e 192.168.255.2 (xen2) con una installazione standard di Debian e Xen secondo quanto spiegato in questo precedente articolo. Inoltre, su entrambi i server, dovrà essere creato un Volume Group LVM chiamato “vg” per ospitare i dischi delle macchine virtuali; ammettendo che la partizione che ospiterà i volumi LVM per le macchine virtuali sia /dev/sda4, creiamo il setup di LVM con questi comandi da lanciare su entrambi i server:
pvcreate /dev/sda4
vgcreate vg /dev/sda4
lvcreate -L 1G -n meta vg
Infine, su entrambi i server, bisognerà installare DRBD 8 secondo quanto spiegato in questo articolo.
A questo punto siamo pronti a configurare il sistema per gestire l’alta affidabilità che utilizzerà HeartBeat, per cui procedete pure su entrambi i server ad installare il pacchetto e ad operare la classica configurazione di ha.conf e authkeys: in questo articolo ci soffermeremo solo su come configurare correttamente il file haresources in modo da distribuire le VM sui due server e migrarle all’interno di una sola macchina in caso di guasto.
Debian mette a disposizione uno script di avvio per far partire in automatico i DomU di xen che si trova in /etc/init.d/xendomains: si tratterà di lavorare su questo per far si che gestisca due server al posto di uno soltanto.
Copiamo questo script all’interno della directory /etc/ha.d/resource.d:
cp /etc/init.d/xendomains /etc/ha.d/resource.d/xendomainsHA1
cp /etc/init.d/xendomains /etc/ha.d/resource.d/xendomainsHA2
Modifichiamo lo script /etc/ha.d/resource.d/xendomainsHA1:
LOCKFILE=/var/lock/xendomainsHA1
XENDOM_CONFIG=/etc/default/xendomainsHA1
e lo script /etc/ha.d/resource.d/xendomainsHA2:
LOCKFILE=/var/lock/xendomainsHA2
XENDOM_CONFIG=/etc/default/xendomainsHA2
Quindi andiamo ad eseguire la medesima operazione sul file /etc/default/xendomains:
cp /etc/default/xendomains /etc/default/xendomainsHA1
cp /etc/default/xendomains /etc/default/xendomainsHA2
Modifichiamo il file /etc/default/xendomainsHA1:
XENDOMAINS_MIGRATE="xen2X --live"
XENDOMAINS_SAVE=
XENDOMAINS_SHUTDOWN_ALL=
XENDOMAINS_RESTORE=false
XENDOMAINS_AUTO=/etc/xen/auto/xen1
XENDOMAINS_AUTO_ONLY=true
e il file /etc/default/xendomainsHA2:
XENDOMAINS_MIGRATE="xen2X --live"
XENDOMAINS_SAVE=
XENDOMAINS_SHUTDOWN_ALL=
XENDOMAINS_RESTORE=false
XENDOMAINS_AUTO=/etc/xen/auto/xen2
XENDOMAINS_AUTO_ONLY=true
Creiamo il file /etc/ha.d/haresources con queste righe
xen1 xendomainsHA1
xen2 xendomainsHA2
e creiamo le due directory citate nella configurazione:
mkdir -p /etc/xen/auto/xen1
mkdir -p /etc/xen/auto/xen2
Ovviamente tutte queste operazioni andranno eseguite su entrambi i server. A questo punto la configurazione dei due hypervisor xen è ultimata. Il funzionamento è semplice: per ogni macchina virtuale creeremo su entrambi i server due volumi logici LVM: uno per il disco di root e uno per lo swap; quindi configureremo DRBD8 in modalità attivo-attivo per replicare i dati tra i due server, creeremo il file di configurazione della VM che utilizzerà il driver drbd di xen per gestire i dischi e, infine, creeremo un link simbolico all’interno della directory /etc/xen/auto/xen1 o /etc/xen/auto/xen2 a seconda del server fisico all’interno del quale girerà la nostra macchina virtuale.
Questa la procedura per creare una nuova VM:
Creare i dischi attraverso lvm su entrambi i server:
lvcreate -n vm-disk --size 10g vg
lvcreate -n vm-swap --size 2g vg
Quindi, sempre su entrambi i server, aggiungere alla configurazione di drbd una sezione apposta:
/etc/drbd.conf
# VM
resource vm-disk {
protocol C;
startup {
wfc-timeout 120; ## 2 min
degr-wfc-timeout 120; ## 2 minutes.
}
disk {
on-io-error detach;
}
net {
allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
timeout 60;
connect-int 10;
ping-int 10;
max-buffers 2048;
max-epoch-size 2048;
}
syncer {
}
on xen1 {
address 192.168.255.1:7801;
device /dev/drbd1;
disk /dev/vg/vm-disk;
meta-disk /dev/vg/meta[1];
}
on xen2 {
address 192.168.255.2:7801;
device /dev/drbd1;
disk /dev/vg/vm-disk;
meta-disk /dev/vg/meta[1];
}
}
resource vm-swap {
protocol C;
startup {
wfc-timeout 120; ## 2 min
degr-wfc-timeout 120; ## 2 minutes.
}
disk {
on-io-error detach;
}
net {
allow-two-primaries;
after-sb-0pri discard-zero-changes;
after-sb-1pri discard-secondary;
timeout 60;
connect-int 10;
ping-int 10;
max-buffers 2048;
max-epoch-size 2048;
}
syncer {
}
on xen1 {
address 192.168.255.1:7802;
device /dev/drbd2;
disk /dev/vg/vm-swap;
meta-disk /dev/vg/meta[2];
}
on xen2 {
address 192.168.255.2:7802;
device /dev/drbd2;
disk /dev/vg/vm-swap;
meta-disk /dev/vg/meta[2];
}
}
Bisogna prestare particolare attenzione alla configurazione di DRBD in quanto ogni disco dovrà avere il proprio nome univoco (vm-disk e vm-swap nell’esempio), la propia porta univoca (7801 e 7802), il proprio identificativo progressivo di device (/dev/drbd1 e /dev/drbd2) e il proprio metadata univoco (/dev/vg/meta[1] e /dev/vg/meta[2]).
Creiamo quindi i metadata di drbd e ricarichiamo drbd su entrambi i server:
drbdadm create-md vm-disk
drbdadm create-md vm-swap
/etc/init.d/drbd reload
Ora sul server principale forziamo la sincronizzazione di DRBD, formattiamo il disco, montiamolo e installiamo il sistema operativo base:
drbdadm -- --overwrite-data-of-peer primary vm-disk
drbdadm -- --overwrite-data-of-peer primary vm-swap
mkfs.xfs /dev/drbd1
mkdir /tmp/mnt
mount /dev/drbd1 /tmp/mnt
debootstrap lenny /tmp/mnt/ http://ftp.it.debian.org/debian
Copiamo i driver del kernel nel disco della VM:
cp -pR /lib64/modules/* /tmp/mnt/lib64/modules
Modifichiamo il file /etc/inittab per poter accedere in console locale:
1:2345:respawn:/sbin/getty 38400 hvc0
Entriamo in chroot, installiamo il server ssh e udev e modifichiamo la password di root:
chroot /tmp/mnt
apt-get update
apt-get install udev ssh
passwd
exit
umount /tmp/mnt
A questo punto la nostra vm è pronta per essere eseguita da Xen.
Su entrambi i server creiamo il file di configurazione di XEN all’interno di /etc/xen
/etc/xen/vm
kernel = "/boot/vmlinuz-2.6.26-2-xen-amd64"
ramdisk = "/boot/initrd.img-2.6.26-2-xen-amd64"
memory = 1024
name = "vm"
vif = ['bridge=xenbr0']
disk = ['drbd:vm-disk,sda1,w', 'drbd:vm-swap,sda2,w']
root = "/dev/sda1 ro"
extra = 'console=hvc'
Ed infine creiamo il link simbolico per farla avviare automaticamente all’avvio di HeartBeat, sempre su entrambi i server:
ln -s /etc/xen/vm /etc/xen/auto/xen1
A questo punto, sul server 1, possiamo avviare manualmente la VM:
xm create /etc/xen/vm -c
Ultimi commenti