From: Andrey Zentavr
Newsgroups:
Date: Mon, 7 Aug 2009 17:02:14 +0000 (UTC)
Subject: Создание кластера высокой доступности для XEN с Live миграцией в CentOS 5.3 с использованием VLAN и DRBD
Предисловие: Статья была написана для сайта habrahabr.ru. Дабы она не
затерялась в просторах великого и могучего Интернета, решено было её
запостить на opennet.
После прочтения статьи Какая система виртуализации лучше? хабраюзера
point212 уж очень захотелось помочь парню. Достать его данные из
хабрасайта, увы, не вышло, а сам вот-вот только занимался этим же
вопросом. Потому было решено написать статью чтобы меня услышали и,
возможно, получить инвайт в хаброобщество.
Поехали! Итак, что у нас есть?
Два сервера средней мощности - MB: TYAN Computer Corp S2865 - CPU:
AMD Athlon(tm) 64 X2 Dual Core Processor 3800+ - RAM: 4096Mb -
HDD: 2 x WDC WD1500ADFD-00NLR1 150Gb На обоих - CentOS 5.3 x86_64, Винты
сконфигурированы в RAID 1 средствами бортового NVidia-контроллера.
На eth0 подняты 7 вланов (5 на юзверов и 2 на два канала интернет)
ЗадачиПоднять на этом хозяйстве виртуальную машину высокой
доступности, которая бы имела доступ ко всем вланам. На моё
удивление, только родная сборка xen-3.0.3 корректно поднимала бриджи
на вланах. Пробовал ставить и 3.4.0 и 3.2.0 и т.д.... - нет, не
судьба. Вланы мои пропадали. Поэтому решил сторонних репозиториев не
подключать. Но.. это я забегаю на перёд - обо всём по порядку.
Установка CentOS 5.3
--------------------
Для установки список пакетов я выбирал по-минимуму, да и системный
раздел сделал всего 15Гб+4Гб свопа. Всё остальное уйдёт потом на
синхронизируемый сетевой RAID1 массив. При первой перезагрузке
отключаю SeLinux на обоих нодах
[root@ics1 ~]# cat /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
#SELINUX=enforcing
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted
Далее, конфигурирую сетевые интерфейсы, причём вланы поднимаю без
сетевого адреса (попервой для закачки пакетов можно, конечно внешние
IP прописать).
Перезагружаемся. Смотрим на uname и видим что-то похожее на это:
[root@ics2 ~]# uname -a
Linux ics2.zpr 2.6.18-164.el5xen #1 SMP Thu Sep 3 04:03:03 EDT 2009 x86_64 x86_6
4 x86_64 GNU/Linux
[root@ics2 ~]# xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 905 2 r----- 1569.3
Значит всё пока идёт по плану :) Поправим немножечко /etc/hosts - а
вдруг ДНС упадёт? (Или у нас его нет вовсе? :))
[root@ics2 ~]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
Создание ssh-rsa ключей для безпарольного доступа между нодами
Далее, для быстроты проведения копипаста файлов с одного сервера на другой
создадим ssh-rsa ключи (этот шаг можно пропустить, если хотите при
каждой операции вводить рутовский пароль): На ics1
[root@ics1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
86:80:84:54:1f:5c:f8:1e:c3:19:a5:fa:4e:fe:4f:43 root@ics1.zpr
[root@ics1 ~]# scp /root/.ssh/id_rsa.pub ics2:/root/.ssh/authorized_keys
На ics2
[root@ics2 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
ba:e5:5a:2a:d2:13:7d:41:d6:d8:95:ee:ba:de:0d:ac root@ics2.zpr
[root@ics2 ~]# scp /root/.ssh/id_rsa.pub ics1:/root/.ssh/authorized_keys
Скопипастим /etc/hosts на соседнюю ноду:
[root@ics2 ~]# scp /etc/hosts ics1:/etc/hosts
Настройка синхронизируемого дискового пространства
Теперь очередь ВRBD. Для этого создадим файл /etc/drbd.conf следуюего содержания:
# Следующий параметр необходим для Live-миграции
allow-two-primaries;
after-sb-0pri discard-least-changes;
after-sb-1pri call-pri-lost-after-sb;
after-sb-2pri call-pri-lost-after-sb;
rr-conflict disconnect;
}
syncer {
rate 50M;
al-extents 257;
}
on ics1.xen {
device /dev/drbd0;
# меняем на своё блочное устройство. Размер устройства долже быть одинаков на обоих нодах!!!
disk /dev/mapper/nvidia_ecjbdbeap3;
address 10.44.44.1:7788;
meta-disk internal;
}
on ics2.xen {
device /dev/drbd0;
disk /dev/mapper/nvidia_bjijcibhp3;
address 10.44.44.2:7788;
meta-disk internal;
}
[root@ics1 ~]# drbdadm create-md internet
[root@ics1 ~]# service drbd start
Теперь на одной из нод сделаем ресурс primary. Для этого:
[root@ics2 ~]# drbdsetup /dev/drbd0 primary -o
И смотрим как оно засинхронизируется :)
[root@ics2 ~]# watch -n1 "cat /proc/drbd"
Конфигурация гипервизора Xen
После перекура приступаем к конфигурированию Xen. Как было сказано
ранее, необходимо, чтобы DomU системы имели доступ к вланам. Также
необходима поддержка live-миграции виртуального домена. Для этого
немножко изменим конфигурационный файл xen следующим образом
(комментарии опущены):
[root@ics2 xen]# cat /etc/xen/xend-config.sxp
# Путь к логам
(logfile /var/log/xen/xend.log)
# Уровень логов.
(loglevel DEBUG)
(xend-unix-server yes)
# Опция, необходима для кросс-миграции
(xend-relocation-server yes)
# Сокет для взаимодействия с разными утиллитами управления
(xend-unix-path /var/lib/xend/xend-socket)
# RPC Порт и адрес соответственно для взаимодействия с соседями
(xend-relocation-port 8002)
(xend-relocation-address '10.44.44.2')
# кому можно к нам коннектится?
(xend-relocation-hosts-allow '^ics1\.zpr$ ^ics1\.local$ ^ics1$ ^ics1\.xen$ ^i
cs2\.zpr$ ^ics2\.local$ ^ics2$ ^ics2\.xen$ ^localhost$ ^localhost\.localdomain$')
# ВАЖНО!!!! Нестандартный скрипт создания Xen-бриджей. Должен находится в /etc/xen/scripts/
(network-script my-network-bridge)
# Далее настройки по умолчанию...
(vif-script vif-bridge)
(dom0-min-mem 256)
(dom0-cpus 0)
На ноде ics1 конфиг будет отличаться лишь ИП, к которому приbindим
RPC-сокет, т.е.
(xend-relocation-address '10.44.44.1')
Содержание чудо-файла my-network-bridge следующее:
После этого на обоих нодах - service xend start. Запустив после этого
ifconfig увидим кучу интерфейсов вида eth**, peth**, vif** и xenbr**. у
меня вышло 8*4 = 32 :) + eth1 + lo = 34 Попробуем установить
сконфигурировать виртуальный домен.
Установка CentOS в виртуальную машину
Важно! Операцию установки необходимо производить на одной из нод. В
нашем случае это ICS2.XEN. На всякий:
[root@ics2 ~]# drbdsetup /dev/drbd0 primary -o
Так как мои процессоры не поддерживают HVM-виртуализацию :(, остаётся
лишь использовать паравиртуализацию. Создадим файл для установки:
kernel - какое ядро грузить. Ядро, указанное в конфиге можно найти на
инсталляционном диске CentOS в images/xen/
ramdisk - Init-образ. находился на инсталл-диске там же где и ядро.
extra - параметры, которые отдаём ядру. Можно, например, указать
NFS-сервер установки и Kickstart файл
on_reboot - действие при перезагрузке виртуальной машине. (Уничтожить)
on_crash - действие при падении (Уничтожить) vcpus - сколько ядер процессора использовать
on_poweroff - действие при выключении (Уничтожить)
disk = [ "drbd:internet,xvda,w" ] - Диск. В нашем случае будем
устанавливать на DRBD-ноду с именем internet (она же /dev/drbd0).
Здесь неоходимо указывать именно ИМЯ а не блочное устройство!!!
Lets do it! для старта установки выполним на ics2
[root@ics2 xen]# xm create -c internet
После чего нас перебросит в виртуальную консоль. (Для выхода необходимо
нажать Alt+5 (Иногда Ctrl+5). Для возврата назад - xm console internet).
При старте установки Вам зададут несколько вопросов, а именно откуда
будем ставить ОС? Так как никаких образов мы не подключали, то можно
ставить только из Internet или NFS. Благо, NFS у нас на предприятии уже
давно есть, посему я разшарил каталог /data/centos в который просто
перекопировал содержимое установочного диска. Следуем указаниям
мастера, отвечаем на вопросы и запускаем anaconda (я конфигурировал
запуск VNC-инсталлера и потом с маздая тыкал в гуёвые кнопочки). При
установке система должна обнаружить блочное устройство /dev/xvda на
которое и необходимо произвести установку. ... При окончании установки
и перезагрузке гипервихор xen уничтожит домен internet:
[root@ics2 xen]# xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 905 2 r----- 1706.4
Танцы с бубном
Теперь немножко изменим наш конфигурационный файл виртуального домена internet
При остановке домена DRBD-массив перешео в состояние Secondary. Пробуем
запустить:
[root@ics2 xen]# xm create -c internet
Но не тут то было! Начинают валится ошибки что устройства не найдено и
бла бла бла и т.д. Ну, тут необходим бубен да и пляски. А что вы
хотели? Четыре дня гугления по инету немного для меня прояснили
ситуацию, но готового решения я так и не нашел. Ждать никого у меня не
было времени, поэтому пришлось править python-скрипты ручками
(учитывая, что я его впервые в этот день увидел). Для таких страдальцев
как я, я наваял два патча, которые дают возможность работать Xen'у с
DRBD-дисками.
Итак, идём на багзиллу Xen'а: Cannot use pygrub with
drbd blcok device as xvda. и тянем оттуда два патча - для pygrub и
blkif.py pygrub находится по /usr/bin/pygrub а blkif.py у меня
лежало в /usr/lib64/python2.4/site-packages/xen/util Положил эти файлы
соответсвенно рядом с приложениями, которыми они патчат и
patch -p0 < имя_diff Кстате, в /usr/lib64/python2.4/site-packages/xen/util я ещё на
всякслучай в сторону откинул blkif.pyc и blkif.pyo. Патчить нужно на
обоих нодах. Ну, поехали:
[root@ics2 xen]# xm create -c internet
Теперь вроде всё отлично. Свернув консоль, увидим
[root@ics2 ~]# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by buildsvn@c5-x8664-bu
ild, 2008-10-03 11:30:32
0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r---
ns:351972 nr:1465004 dw:1818064 dr:163469 al:95 bm:68 lo:0 pe:0 ua:0 ap:0 oos:0
[root@ics2 ~]# xm list
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 905 2 r----- 1725.7
internet 2 3070 2 -b---- 112.8
Пробуем мигрировать:
[root@ics2 ~]# xm migrate internet ics1.xen --live
# APC STONITH (думаю, некоторым необходимо будет это законнентить по неимению APC SmartUPS 1000 RM)
stonith_host ics1.xen apcsmart ics2.xen /dev/ttyS0
stonith_host ics2.xen apcsmart ics1.xen /dev/ttyS0
rdnames()
{
NAMES=
if ! contains_something "$XENDOMAINS_AUTO"
then
return
fi
for dom in $XENDOMAINS_AUTO/*; do
rdname $dom
if test -z $NAMES; then
NAMES=$NM;
else
NAMES="$NAMES $NM"
fi
done
}
И ещё одна
stop()
{
# Collect list of domains to shut down
if test "$XENDOMAINS_AUTO_ONLY" = "true"; then
rdnames
fi
echo -n "Shutting down Xen domains:"
while read LN; do
parseln "$LN"
if test $id = 0; then continue; fi
echo -n " $name"
if test "$XENDOMAINS_AUTO_ONLY" = "true"; then
for i in ${NAMES[@]}
do
if test $found = "0"; then
if test $i = $name; then
found=1
fi
fi
done
if test $found = "0"; then
echo -n "(skip)"
continue
fi
fi
# XENDOMAINS_SYSRQ chould be something like just "s"
# or "s e i u" or even "s e s i u o"
# for the latter, you should set XENDOMAINS_USLEEP to 1200000 or so
Всё это выполняется на обеих нодах. Или на одной, после чего копипастим
на вторую. Создадим на обоих нодах каталоги: /etc/ha.d/xen
/etc/ha.d/xen/auto.ics1 /etc/ha.d/xen/auto.ics2 Также на обеих нодах
создадим симлинки на конфигурационные файлы виртуальных машин, на
которых они должны быть запущены. Конфиги же xendomain'ов будут
отличаться:
Убираем через ntsysv или chkconfig xendomains из автозагрузки,
проверяем чтобы присутствовали xen, heartbeat, drbd и network :) Вуаля!
Всё готово!
При внезапной остановке одной из нод её виртуальные машины в течении
двух минут поднимутся у соседа, а при возврате ноды к жизни они
мигрируют в запущенном состоянии обратно на своё место. При
проделывании манипуляций активно использовалась эта статья,
google.com и http://wiki.centos.org.
917 Прочтений • [Создание кластера высокой доступности для XEN с Live миграцией в CentOS 5.3 с использованием VLAN и DRBD (xen cluster virtual centos)] [08.05.2012] [Комментариев: 0]