Строим систему виртуализации и кластеризуем ее

Скрипты, вызываемые при переходе узлов кластера из одного состояния в другое, могут быть дополнены списком сервисов, для которых необходимо гарантировать отказоустойчивость, а конфигурационные файлы и файлы данных этих сервисов могут быть перемещены на файловую систему, созданную поверх drbd-устройства. Можно также сконфигурировать алиас для сетевого интерфейса, который автоматически создается на ведущем узле "-- тем самым все сервисы будут доступными по одному адресу.

Недостатки такого подхода очевидны "-- чем больше сервисов, тем более запутанной становится такая конфигурация, а установка новых версий сервисов становится очень неудобной. Про общие проблемы использования различных сервисов на одном сервере я и не говорю "-- это специфично не только для кластерных конфигураций.

Самым простым и изящным выходом в данной ситуации является виртуализация. Если использовать этот подход, нам потребуется обеспечить отказоустойчивость только для одного сервиса "-- системы виртуализации, в которой будут жить виртуальные сервера, причем последние можно конфигурировать, не задумываясь о сложностях, связанных с кластеризацией.

Приступим к установке выбранной нами системы виртуализации "-- OpenVZ. Она представляет собой набор патчей к стандартному ядру Linux и userspace-инструменты для управления. В ALT Linux ядро с поддержкой OpenVZ собрано отдельно, поэтому, если оно еще не установлено, его необходимо установить в дополнение к существующему ядру или вместо него, установить модуль поддержки DRBD в этом ядре и userspace-инструменты, представленные пакетами vzctl и vzquota:

[root@m1 ~]# apt-get install kernel-image-ovz-smp kernel-modules-drbd-ovz-smp vzctl vzquota

После установки нового ядра необходимо проверить конфигурацию загрузчика и удостовериться в том, что после перезапуска будет загружено ovz-ядро, а если это не так, предпринять для загрузки требуемого ядра необходимые действия. Например, если в качестве загрузчика используется lilo, то его конфигурационный файл может выглядеть так:

boot=/dev/hda
map=/boot/map
default=linux
image=/boot/vmlinuz
    label=linux
    root=/dev/sda2
    initrd=/boot/initrd.img
    read-only

При этом /boot/vmlinuz и /boot/initrd.img должны ссылаться на образ ядра и образ initrd соответственно:

[root@m1 ~]# ls -l /boot/
-rw-r--r-- 1 root root  993322 Aug  4 01:05 System.map-2.6.18-ovz-smp-alt15
-rw-r--r-- 1 root root     512 Aug 14 22:33 boot.0800
-rw-r--r-- 1 root root   63357 Aug  4 01:00 config-2.6.18-ovz-smp-alt15
-rw------- 1 root root  421499 Aug 17 10:57 initrd-2.6.18-ovz-smp-alt15.img
lrwxrwxrwx 1 root root      31 Aug 17 10:57 initrd-smp.img -> initrd-2.6.18-ovz-smp-alt15.img
lrwxrwxrwx 1 root root      31 Aug 17 10:57 initrd.img -> initrd-2.6.18-ovz-smp-alt15.img
-rw------- 1 root root   36352 Aug 17 10:59 map
lrwxrwxrwx 1 root root      28 Aug 17 10:57 vmlinuz -> vmlinuz-2.6.18-ovz-smp-alt15
-rw-r--r-- 1 root root 1615274 Aug  4 01:05 vmlinuz-2.6.18-ovz-smp-alt15
lrwxrwxrwx 1 root root      28 Aug 17 10:57 vmlinuz-smp -> vmlinuz-2.6.18-ovz-smp-alt15

Также с помощью chkconfig -list необходимо удостовериться, что сервис vz не будет запущен после перезагрузки, и затем перезагрузиться.

После перезагрузки необходимо переместить файлы OpenVZ в каталог /d0, куда уже должно быть смонтировано устройство /dev/drbd0, а на старом месте создать символьные ссылки:

[root@m1 ~]# mkdir /d0/vz
[root@m1 ~]# mkdir /d0/vz/etc
[root@m1 ~]# mkdir /d0/vz/var
[root@m1 ~]# mkdir /d0/vz/var/lib
[root@m1 ~]# cp -r /etc/vz /d0/vz/etc
[root@m1 ~]# cp -r /var/lib/vz /d0/vz/var/lib
[root@m1 ~]# cp -r /var/lib/vzquota /d0/vz/var/lib
[root@m1 ~]# rm -rf /etc/vz
[root@m1 ~]# rm -rf /var/lib/vz
[root@m1 ~]# rm -rf /var/lib/vzquota
[root@m1 ~]# ln -s /d0/vz/etc/vz /etc/vz
[root@m1 ~]# ln -s /d0/vz/var/lib/vz /var/lib/vz
[root@m1 ~]# ln -s /d0/vz/var/lib/vzquota /var/lib/vzquota

После остановки HAD на узле m1 и монтирования drbd-устройства на узле m2 на нем необходимо аналогичным образом удалить каталоги OpenVZ и создать вместо них ссылки на /d0/vz.

После того, как OpenVZ перенесен на drbd-раздел, необходимо отредактировать скрипты, вызываемые при переходе узлов кластера из одного состояния в другое, так:

[root@m1 ~]# cat /etc/had/hasrv/starthasrv 
#!/bin/sh -e

drbdadm primary all
mount /dev/drbd0 /d0
/etc/init.d/vz start

[root@m1 ~]# cat /etc/had/hasrv/stophasrv 
#!/bin/sh

/etc/init.d/vz stop
umount /dev/drbd0
drbdadm secondary all

После перезапуска HAD на обоих узлах необходимо смоделировать отказ узла m1 и убедиться в том, что сервис vz запускается на узле m2.



Eugene 2012-05-28