Скрипты, вызываемые при переходе узлов кластера из одного состояния в другое, могут быть дополнены списком сервисов, для которых необходимо гарантировать отказоустойчивость, а конфигурационные файлы и файлы данных этих сервисов могут быть перемещены на файловую систему, созданную поверх 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.