Ключевые слова:xen, cluster, virtual, centos, (найти похожие документы)
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 -
Network: Broadcom Corporation NetXtreme BCM5721 Gigabit Ethernet PCI
Express nVidia Corporation CK804 Ethernet Controller
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 прописать).
[root@ics2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth*
#ifcfg-eth0
# Broadcom Corporation NetXtreme BCM5721 Gigabit Ethernet PCI Express
DEVICE=eth0
BOOTPROTO=static
HWADDR=00:E0:81:59:20:22
IPADDR=192.168.10.2
NETMASK=255.255.0.0
ONBOOT=yes
#ifcfg-eth0.100
# ISP
DEVICE=eth0.100
BOOTPROTO=static
IPADDR=11.22.33.44
NETMASK=255.255.255.248
ONBOOT=yes
VLAN=yes
#ifcfg-eth0.101
# Broadcom Corporation NetXtreme BCM5721 Gigabit Ethernet PCI Express
DEVICE=eth0.101
BOOTPROTO=static
#IPADDR=
#NETMASK=
ONBOOT=yes
VLAN=yes
#ifcfg-eth0.2
# Broadcom Corporation NetXtreme BCM5721 Gigabit Ethernet PCI Express
DEVICE=eth0.2
BOOTPROTO=static
#IPADDR=
#NETMASK=
ONBOOT=yes
VLAN=yes
#ifcfg-eth.200
# Broadcom Corporation NetXtreme BCM5721 Gigabit Ethernet PCI Express
DEVICE=eth0.200
BOOTPROTO=static
#IPADDR=
#NETMASK=
ONBOOT=yes
VLAN=yes
#ifcfg-eth0.300
# Broadcom Corporation NetXtreme BCM5721 Gigabit Ethernet PCI Express
DEVICE=eth0.300
BOOTPROTO=static
#IPADDR=
#NETMASK=
ONBOOT=yes
VLAN=yes
#ifcfg-eth0.415
# Broadcom Corporation NetXtreme BCM5721 Gigabit Ethernet PCI Express
DEVICE=eth0.415
BOOTPROTO=static
#IPADDR=
#NETMASK=
ONBOOT=yes
VLAN=yes
#ifcfg-eth0.5
# Broadcom Corporation NetXtreme BCM5721 Gigabit Ethernet PCI Express
DEVICE=eth0.5
BOOTPROTO=static
#IPADDR=
#NETMASK=
ONBOOT=yes
VLAN=yes
#ifcfg-eth1
# nVidia Corporation CK804 Ethernet Controller
DEVICE=eth1
BOOTPROTO=static
BROADCAST=10.44.44.3
HWADDR=00:E0:81:59:20:23
IPADDR=10.44.44.2
NETMASK=255.255.255.252
NETWORK=10.44.44.0
ONBOOT=yes
На соседней ноде ics1 вместо 192.168.10.2 конфигурирую адрес
192.168.10.1, вместо 10.44.44.2 конфигурирую 10.44.44.1, ну и на интернет
******.66
Настройка служб Так как runlevel у меня 3й (без X-сервера), то службы
оставляю следующие:
[root@ics2 ~]# chkconfig --list | grep "3:вкл"
acpid 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
auditd 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
cpuspeed 0:выкл 1:вкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
crond 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
gpm 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
haldaemon 0:выкл 1:выкл 2:выкл 3:вкл 4:вкл 5:вкл 6:выкл
hidd 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
iptables 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
irqbalance 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
iscsi 0:выкл 1:выкл 2:выкл 3:вкл 4:вкл 5:вкл 6:выкл
iscsid 0:выкл 1:выкл 2:выкл 3:вкл 4:вкл 5:вкл 6:выкл
lm_sensors 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
lvm2-monitor 0:выкл 1:вкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
mcstrans 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
mdmonitor 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
messagebus 0:выкл 1:выкл 2:выкл 3:вкл 4:вкл 5:вкл 6:выкл
netfs 0:выкл 1:выкл 2:выкл 3:вкл 4:вкл 5:вкл 6:выкл
network 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
nfslock 0:выкл 1:выкл 2:выкл 3:вкл 4:вкл 5:вкл 6:выкл
ospfd 0:выкл 1:выкл 2:выкл 3:вкл 4:выкл 5:выкл 6:выкл
portmap 0:выкл 1:выкл 2:выкл 3:вкл 4:вкл 5:вкл 6:выкл
readahead_early 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
restorecond 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
rpcgssd 0:выкл 1:выкл 2:выкл 3:вкл 4:вкл 5:вкл 6:выкл
rpcidmapd 0:выкл 1:выкл 2:выкл 3:вкл 4:вкл 5:вкл 6:выкл
smartd 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
snmpd 0:выкл 1:выкл 2:выкл 3:вкл 4:выкл 5:выкл 6:выкл
sshd 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
syslog 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
xfs 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл
zebra 0:выкл 1:выкл 2:выкл 3:вкл 4:выкл 5:выкл 6:выкл
Перезагрузка.
Установка пакетов для виртуализации и HA-кластера
-------------------------------------------------
После перезагрузки на обоих нодах устанавливаем следующие пакеты:
# yum install kernel-xen xen kmod-drbd82-xen kmod-drbd82 drbd82 libvirt qemu heartbeat
После этого удостоверимся, что в grub.conf по-умолчанию грузится
xen-изированое ядро:
[root@ics2 ~]# cat /boot/grub/grub.conf
# grub.conf generated by anaconda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-164.el5xen)
root (hd0,0)
kernel /boot/xen.gz-2.6.18-164.el5
module /boot/vmlinuz-2.6.18-164.el5xen ro root=LABEL=/
module /boot/initrd-2.6.18-164.el5xen.img
Перезагружаемся. Смотрим на 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
192.168.10.2 ics2.zpr ics2
192.168.10.1 ics1.zpr ics1
10.44.44.2 ics2.local ics2.xen
10.44.44.1 ics1.local ics1.xen
Создание 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 [email protected]
[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 [email protected]
[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 следуюего содержания:
[root@ics2 ~]# cat /etc/drbd.conf
global {
minor-count 64;
dialog-refresh 5;
usage-count yes;
}
common {
syncer { rate 50M;}
}
resource internet {
protocol C;
handlers {
pri-on-incon-degr "echo o > /proc/sysrq-trigger ; halt -f";
pri-lost-after-sb "echo o > /proc/sysrq-trigger ; halt -f";
local-io-error "echo o > /proc/sysrq-trigger ; halt -f";
outdate-peer "/usr/lib64/heartbeat/drbd-peer-outdater -t 5";
}
startup {
wfc-timeout 60;
degr-wfc-timeout 120;
}
disk {
on-io-error detach;
}
net {
timeout 60; # 6 seconds (unit = 0.1 seconds)
connect-int 10; # 10 seconds (unit = 1 second)
ping-int 10; # 10 seconds (unit = 1 second)
ping-timeout 5; # 500 ms (unit = 0.1 seconds)
max-buffers 2048;
unplug-watermark 128;
max-epoch-size 2048;
ko-count 4;
# Следующий параметр необходим для 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@ics2 ~]# scp /etc/drbd.conf ics1:/etc/drbd.conf
Инициализируем DRBD-ноду:
[root@ics2 ~]# drbdadm create-md internet
Стартуем службу:
[root@ics2 ~]# service drbd start
На соседней ноде:
[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 следующее:
[root@ics2 scripts]# cat /etc/xen/scripts/my-network-bridge
#!/bin/bash
dir=$(dirname "$0")
"$dir/network-bridge" "$@" vifnum=0 netdev=eth0 bridge=xenbr0
"$dir/network-bridge" "$@" vifnum=1 netdev=eth0.2 bridge=xenbr2
"$dir/network-bridge" "$@" vifnum=2 netdev=eth0.5 bridge=xenbr5
"$dir/network-bridge" "$@" vifnum=3 netdev=eth0.100 bridge=xenbr100
"$dir/network-bridge" "$@" vifnum=4 netdev=eth0.101 bridge=xenbr101
"$dir/network-bridge" "$@" vifnum=5 netdev=eth0.200 bridge=xenbr200
"$dir/network-bridge" "$@" vifnum=6 netdev=eth0.300 bridge=xenbr300
"$dir/network-bridge" "$@" vifnum=7 netdev=eth0.415 bridge=xenbr415
После этого на обоих нодах - 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-виртуализацию :(, остаётся
лишь использовать паравиртуализацию. Создадим файл для установки:
[root@ics2 xen]# cat /etc/xen/internet
kernel = "/opt/images/xen/vmlinuz"
ramdisk = "/opt/images/xen/initrd.img"
extra = "text"
on_reboot = "destroy"
on_crash = "destroy"
name = "internet"
uuid = "ed310594-db0e-457a-be11-1961bc84ff5a"
maxmem = 3072
memory = 3072
vcpus = 2
on_poweroff = "destroy"
vfb = [ ]
# Virtual Hard Drive
disk = [ "drbd:internet,xvda,w" ]
# Networking
vif = [ "mac=00:16:3e:01:00:00,bridge=xenbr0",
"mac=00:16:3e:01:00:02,bridge=xenbr2",
"mac=00:16:3e:02:00:05,bridge=xenbr5",
"mac=00:16:3e:03:01:00,bridge=xenbr100",
"mac=00:16:3e:04:01:01,bridge=xenbr101",
"mac=00:16:3e:05:02:00,bridge=xenbr200",
"mac=00:16:3e:06:03:00,bridge=xenbr300",
"mac=00:16:3e:07:04:15,bridge=xenbr415" ]
Краткое описание параметров:
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
[root@ics2 xen]# cat /etc/xen/internet
name = "internet"
uuid = "ed310594-db0e-457a-be11-1961bc84ff5a"
maxmem = 3072
memory = 3072
vcpus = 2
bootloader = "/usr/bin/pygrub"
on_reboot = "restart"
on_crash = "restart"
on_poweroff = "destroy"
vfb = [ ]
# Virtual Hard Drive
disk = [ "drbd:internet,xvda,w" ]
# Networking
vif = [ "mac=00:16:3e:01:00:00,bridge=xenbr0",
"mac=00:16:3e:01:00:02,bridge=xenbr2",
"mac=00:16:3e:02:00:05,bridge=xenbr5",
"mac=00:16:3e:03:01:00,bridge=xenbr100",
"mac=00:16:3e:04:01:01,bridge=xenbr101",
"mac=00:16:3e:05:02:00,bridge=xenbr200",
"mac=00:16:3e:06:03:00,bridge=xenbr300",
"mac=00:16:3e:07:04:15,bridge=xenbr415" ]
Изменений в принципе не много.
[root@ics2 xen]# 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:Secondary/Secondary ds:UpToDate/UpToDate C r---
ns:1465004 nr:347516 dw:1812520 dr:76948 al:117 bm:87 lo:0 pe:0 ua:0 ap:0 oos:0
При остановке домена 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
В это время на соседе наблюдаем процесс
[root@ics2 ~]# watch -n1 "cat /proc/drbd && echo && xm list"
Every 1,0s: cat /proc/drbd && echo && xm list
Tue Sep 29 00:52:17 2009
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/Primary ds:UpToDate/UpToDate C r---
ns:1465004 nr:353140 dw:1818144 dr:76948 al:117 bm:87 lo:0 pe:0 ua:0 ap:0 oos:0
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 905 2 r----- 1724.4
internet 2 1858 0 -bp--- 0.0
Когда всё устаканится, получим:
[root@ics1 ~]# cat /proc/drbd && echo && xm list
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:1465772 nr:353272 dw:1819044 dr:76948 al:118 bm:87 lo:0 pe:0 ua:0 ap:0 oos:0
Name ID Mem(MiB) VCPUs State Time(s)
Domain-0 0 905 2 r----- 1776.0
internet 2 3069 2 -b----0.3
При этом, если пинговать машину извне - она пингуется в процессе
переноса! Пинг пропадает только один-два раза при окончании процесса.
Настройка Heartbeat
-------------------
Уже почти всё готово, необходимо только всё более-менее
автоматизировать. Для этого остановим виртуальную машину:
[root@ics1 ~]# xm shutdown internet
Периодически смотрим xm list.Когда домен отключится, приступаем к
настройке heartbeat. Создадим мегасекретный ключ:
[root@ics2 ha.d]# cat /etc/ha.d/authkeys
auth 1
1 sha1 6723jsp[;.;,m,er23r54235665v90jnsdcmsc%$jnsdc8*(sdcnk
Далее файл конфигурации:
[root@ics2 ha.d]# cat /etc/ha.d/ha.cf
keepalive 2
deadtime 30
warntime 10
initdead 30
debugfile /var/log/heartbeat/debug.log
logfile /var/log/heartbeat/logfile.log
logfacility local0
bcast eth1
auto_failback on
# APC STONITH (думаю, некоторым необходимо будет это законнентить по неимению APC SmartUPS 1000 RM)
stonith_host ics1.xen apcsmart ics2.xen /dev/ttyS0
stonith_host ics2.xen apcsmart ics1.xen /dev/ttyS0
node ics1.xen
node ics2.xen
respawn hacluster /usr/lib64/heartbeat/ipfail
compression bz2
compression_threshold 2
Файл ресурсов:
[root@ics2 ha.d]# cat /etc/ha.d/haresources
ics1.xen xendomains.ics1
ics2.xen xendomains.ics2
копипастим три этих конфига на соседа. Создаём xendomains.ics1 и
xendomains.ics2. Для этого:
[root@ics2 ha.d]# cp /etc/init.d/xendomains /etc/ha.d/resource.d/xendomains.ics1
[root@ics2 ha.d]# cp /etc/init.d/xendomains /etc/ha.d/resource.d/xendomains.ics2
Немного изменяем первый:
LOCKFILE=/var/lock/subsys/xendomains.ics1
XENDOM_CONFIG=/etc/ha.d/xen/ics1
И второй:
LOCKFILE=/var/lock/subsys/xendomains.ics2
XENDOM_CONFIG=/etc/ha.d/xen/ics2
Не много поправим две функции в обоих скриптах:
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'ов будут
отличаться:
[root@ics2 xen]# cat /etc/ha.d/xen/ics1
XENDOMAINS_SYSRQ=""
XENDOMAINS_USLEEP=100000
XENDOMAINS_CREATE_USLEEP=5000000
XENDOMAINS_MIGRATE="ics1.xen --live"
XENDOMAINS_SAVE=
XENDOMAINS_SHUTDOWN="--halt --wait"
XENDOMAINS_SHUTDOWN_ALL=
XENDOMAINS_RESTORE=false
XENDOMAINS_AUTO=/etc/ha.d/xen/auto.ics1
XENDOMAINS_AUTO_ONLY=true
XENDOMAINS_STOP_MAXWAIT=300
[root@ics2 xen]# cat /etc/ha.d/xen/ics2
XENDOMAINS_SYSRQ=""
XENDOMAINS_USLEEP=100000
XENDOMAINS_CREATE_USLEEP=5000000
XENDOMAINS_MIGRATE="ics1.xen --live"
XENDOMAINS_SAVE=
XENDOMAINS_SHUTDOWN="--halt --wait"
XENDOMAINS_SHUTDOWN_ALL=
XENDOMAINS_RESTORE=false
XENDOMAINS_AUTO=/etc/ha.d/xen/auto.ics2
XENDOMAINS_AUTO_ONLY=true
XENDOMAINS_STOP_MAXWAIT=300
У соседа
[root@ics1 xen]# cat /etc/ha.d/xen/ics1
XENDOMAINS_SYSRQ=""
XENDOMAINS_USLEEP=100000
XENDOMAINS_CREATE_USLEEP=5000000
XENDOMAINS_MIGRATE="ics2.xen --live"
XENDOMAINS_SAVE=
XENDOMAINS_SHUTDOWN="--halt --wait"
XENDOMAINS_SHUTDOWN_ALL=
XENDOMAINS_RESTORE=false
XENDOMAINS_AUTO=/etc/ha.d/xen/auto.ics1
XENDOMAINS_AUTO_ONLY=true
XENDOMAINS_STOP_MAXWAIT=300
[root@ics1 xen]# cat /etc/ha.d/xen/ics2
XENDOMAINS_SYSRQ=""
XENDOMAINS_USLEEP=100000
XENDOMAINS_CREATE_USLEEP=5000000
XENDOMAINS_MIGRATE="ics2.xen --live"
XENDOMAINS_SAVE=
XENDOMAINS_SHUTDOWN="--halt --wait"
XENDOMAINS_SHUTDOWN_ALL=
XENDOMAINS_RESTORE=false
XENDOMAINS_AUTO=/etc/ha.d/xen/auto.ics2
XENDOMAINS_AUTO_ONLY=true
XENDOMAINS_STOP_MAXWAIT=300
Убираем через ntsysv или chkconfig xendomains из автозагрузки,
проверяем чтобы присутствовали xen, heartbeat, drbd и network :) Вуаля!
Всё готово!
При внезапной остановке одной из нод её виртуальные машины в течении
двух минут поднимутся у соседа, а при возврате ноды к жизни они
мигрируют в запущенном состоянии обратно на своё место. При
проделывании манипуляций активно использовалась эта статья,
google.com и http://wiki.centos.org.
Нормальная статья, я через много граблей уже сам прошёл, единственно у меня после установки нового ведра "2.6.18-164.el5xen" устанавливается drbd версии "DRBDADM_VERSION=8.3.2" и модули к ней.
Так вот с новой drbd у меня в HVM (disk = [ 'drbd:resource,hda,w' ]) не видит жёсткий диск, пришлось напрямую устройство использовать, потерял автоматом живую миграцию, но это не критично конечно ))), главное что отказоустойчивость есть.
PS для репликации drbd использую агрегирование интерфейсов, скорость устраивает.
CentOS 5.4
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
#Добавил строку. Без этого у меня мигрировали абсолютно все домены.
found="0"
#
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
Пришлось:
1.пропатчить pygrub как выше.
2.Во всех вирт.машинах прописать что то вроде
disk = [ "phy:drbd0,xvda1,w" ]
3.Мой конфиг "crm configure show":
node ha1
node ha2
primitive xen_vm1 ocf:heartbeat:Xen \
params xmfile="/etc/xen/vm/vm1" \
op monitor interval="10s" \
op start interval="0s" timeout="30s" \
op stop interval="0s" timeout="300s" \
meta allow-migrate="true"
property $id="cib-bootstrap-options" \
dc-version="1.1.2-ecb1e2ea172ba2551f0bd763e557fccde68c849b" \
cluster-infrastructure="openais" \
expected-quorum-votes="2" \
stonith-enabled="false" \
no-quorum-policy="ignore" \
default-resource-stickiness="1000" \
last-lrm-refresh="1293409634"
pacemaker нормально c drbd работать НЕ умеет! (Если загружается одна нода, то он ждет вторую. Приходится руками делать drbdsetup /dev/drbd0 primary -o и руками запускать машину. А потом зкогда аменишь вышедшие из строя железки на другой мертвой ноде и она заработает. Разгребаешь руками конфликты у drbd на работающей ноде и только что отремонтированой и включенной.)
4.Каждая вирт.машина у меня лежит на отдельном /dev/drbd0. Это важно на случай синхронизации, так как pacemaker не знает ничего о drbd в моей конфигурации. Для свапа уже внутри /etc/fstab вирт.машины подключается обычный файл через loop.
5.Если время появится, то опишу подробно.