Строим контейнер для виртуальных серверов и кластеризуем его

Традиционно после конфигурирования общего файлового хранилища файл /etc/ha.d/haresources дополняется списком сервисов, для которых необходимо гарантировать отказоустойчивость, а конфигурационные файлы и файлы данных этих сервисов перемещаются на файловую систему, созданную поверх drbd-устройства. Часто также конфигурируется алиас для сетевого интерфейса, который автоматически создается на ведущем узле "-- тем самым все сервисы оказываются доступными по одному адресу.

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

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

Приступим к установке выбранной нами системы виртуализации "-- OpenVZ. Она представляет собой набор патчей к стандартному ядру Linux и userspace-инструменты для управления. В ALT Linux Sisyphus ядро с поддержкой 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/hda2
    initrd=/boot/initrd.img
    read-only

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

[root@m1 ~]# ls -l /boot/
total 6892
-rw-r--r-- 1 root root  755493 Sep 22 22:45 System.map-2.6.16-ovz-smp-alt7
-rw-r--r-- 1 root root  686841 Oct  9 23:54 System.map-2.6.16-std26-up-alt10
-rw-r--r-- 1 root root     512 Oct  9 23:54 boot.0300
-rw-r--r-- 1 root root     512 Oct  9 23:54 boot.0800
-rw-r--r-- 1 root root   65929 Sep 22 22:39 config-2.6.16-ovz-smp-alt7
-rw-r--r-- 1 root root   66100 Oct  9 23:54 config-2.6.16-std26-up-alt10
-rw------- 1 root root  321240 Oct 10 23:34 initrd-2.6.16-ovz-smp-alt7.img
-rw------- 1 root root  204992 Oct  9 23:54 initrd-2.6.16-std26-up-alt10.img
lrwxrwxrwx 1 root root      30 Oct 10 23:34 initrd-smp.img -> initrd-2.6.16-ovz-smp-alt7.img
lrwxrwxrwx 1 root root      32 Oct  9 23:54 initrd-up.img -> initrd-2.6.16-std26-up-alt10.img
lrwxrwxrwx 1 root root      30 Oct 10 23:34 initrd.img -> initrd-2.6.16-ovz-smp-alt7.img
-rw------- 1 root root   31744 Oct 10 23:38 map
lrwxrwxrwx 1 root root      27 Oct 10 23:34 vmlinuz -> vmlinuz-2.6.16-ovz-smp-alt7
-rw-r--r-- 1 root root 1246789 Sep 22 22:45 vmlinuz-2.6.16-ovz-smp-alt7
-rw-r--r-- 1 root root 1132834 Oct  9 23:54 vmlinuz-2.6.16-std26-up-alt10
lrwxrwxrwx 1 root root      27 Oct 10 23:34 vmlinuz-smp -> vmlinuz-2.6.16-ovz-smp-alt7
lrwxrwxrwx 1 root root      29 Oct  9 23:54 vmlinuz-up -> vmlinuz-2.6.16-std26-up-alt10

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

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

[root@m1 ~]# mkdir /d0/vz
[root@m1 ~]# mkdir /d0/vz/etc
[root@m1 ~]# mkdir /d0/vz/etc/sysconfig
[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 /etc/sysconfig/vz-scripts /d0/vz/etc/sysconfig
[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 /etc/sysconfig/vz-scripts
[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/etc/sysconfig/vz-scripts /etc/sysconfig/vz-scripts
[root@m1 ~]# ln -s /d0/vz/var/lib/vz /var/lib/vz
[root@m1 ~]# ln -s /d0/vz/var/lib/vzquota /var/lib/vzquota

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

После того, как OpenVZ перенесен на drbd-раздел, необходимо указать сервису heartbeat, что сервис vz должен работать на узле m1, для чего отредактировать файл /etc/ha.d/haresources на обоих узлах:

m1.mydomain.com drbddisk Filesystem::/dev/drbd0::/d0::ext3 vz

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



Eugene 2012-05-28