Xen + SAN + blokady czyli „prawie jak klaster”
Jedną z zalet wirtualizacji jest możliwość migrowania maszyn między maszynami fizycznymi. Migrowanie rzecz jasna wymaga więcej niż jednej maszyny fizycznej z dostępem do konfiguracji i zasobów maszyny wirtualnej – czyli współdzielonej pamięci masowej. I tu zaczyna się mały problem. Jeśli przez przypadek maszyna zostanie uruchomiona na więcej niż jednym hoście – uszkodzenie dysku wirtualnego mamy jak w banku. Jak temu zapobiec bez stawiania klastra HA? Rozwiązaniem jest włączenie blokad na współdzielonym zasobie…
Mechanizm blokowania w Xenie opiera się na wywołaniu skryptu zakładającego bądź usuwającego blokadę w formie pliku tekstowego i sterują nim trzy parametry z plik konfiguracyjnego /etc/xen/xend-config.sxp:
- (xend-domain-lock yes)
- (xend-domain-lock-path /path/to/lock/directory)
- (xend-domain-lock-utility domain-lock)
Pierwszy parametr włącza mechanizm blokowania, drugi precyzuje katalog z blokadami a trzeci pozwala na zmianę narzędzia blokującego (domyślnie demon xend używa skryptu /etc/xen/scripts/domain-lock).
Aby zabezpieczyć się przed przypadkowym równoczesnym uruchomieniu tej samej maszyny wirtualnej na dwóch hostach, wystarczy włączyć mechanizm blokowania, zamontować do wybranego katalogu udział sieciowy (NFS/Samba/OCFS/etc.), wskazać znajdujący się na nim katalog w zmiennej xend-domain-lock-path i przeładować konfigurację demona xend (/etc/ini.t/xend reload). Od tej chwili demon xend będzie zakładał blokady dla wszystkich uruchamianych maszyn, a próba wystartowania tak zablokowanej maszyny na innym hoście zakończy się błędem.
Jeśli restartowanie maszyn wydaje się być niewygodne można ręcznie założyć blokady dla wszystkich już działających domen takim prostym poleceniem (przy założeniu że katalog na blokady to /mnt/vm/lock):
xm list --state=running | tail +3 | cut -d' ' -f1 | while read domain
do
virsh dumpxml $domain | sed -n '2,3{s/.*>\(.*\)<.*/\1/;p}'
done | xargs -n 2 echo | while read domain uuid
do
mkdir /mnt/vm/lock/$uuid && \
/etc/xen/scripts/domain-lock -l -n $domain -i $uuid -p `hostname` \
/mnt/vm/lock/$uuid
done
Blokowanie domen jest prostym rozwiązaniem i zabezpiecza przed uszkodzeniem dysków maszyn wirtualnych. Następnym krokiem może być skonfigurowanie klastra HA opartego o pakiet Pacemaker, ale to już inna historia
