The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Создание кластера высокой доступности для XEN с Live миграцией в CentOS 5.3 с использованием VLAN и DRBD (xen cluster virtual centos)


<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>
Ключевые слова: 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 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 следуюего содержания: [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.

<< Предыдущая ИНДЕКС Исправить src / Печать Следующая >>

Обсуждение [ RSS ]
  • 1.1, grait (?), 10:49, 05/10/2009 [ответить]  
  • +/
    Нормальная статья, я через много граблей уже сам прошёл, единственно у меня после установки нового ведра "2.6.18-164.el5xen" устанавливается drbd версии "DRBDADM_VERSION=8.3.2" и модули к ней.
    Так вот с новой drbd у меня в HVM (disk = [ 'drbd:resource,hda,w' ]) не видит жёсткий диск, пришлось напрямую устройство использовать, потерял автоматом живую миграцию, но это не критично конечно ))), главное что отказоустойчивость есть.
    PS для репликации drbd использую агрегирование интерфейсов, скорость устраивает.
     
  • 1.2, Andrey Zentavr (?), 03:28, 18/10/2009 [ответить]  
  • +/
    Дык http://bugzilla.xensource.com/bugzilla/show_bug.cgi?id=1438 должен исправить "(disk = [ 'drbd:resource,hda,w' ]) не видит жёсткий диск"
     
  • 1.3, ЫМЫ (?), 16:08, 08/12/2009 [ответить]  
  • +/
    Косяк в drbd83-8.3.2-6.el5_3

    В патче для pygrub
    drbdresource = string.strip(os.popen('drbdadm sh-resources ' + file).readline(), " \n")

    команде drbdadm sh-resources /dev/drbd0 глубоко фиолетово на 3й параметр и она всегда выводит ВСЕ drbd-ресурсы.


     
     
  • 2.4, ЫМЫ (?), 16:51, 08/12/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Костыль.

    В патче для pygrub
    drbdresource = string.strip(os.popen('drbd_find_resource.sh ' + file).readline(), " \n")


    #### drbd_find_resource.sh ####

    #!/bin/sh

    DRBDADM="/sbin/drbdadm"
    test -x $DRBDADM || exit 5

    DEV=$1

    if [ -z "$DEV" ]
        then
        echo "Usage: 'basename $0' /dev/drbdN"
        exit 1
    fi

    for RESOURCE in '$DRBDADM sh-resources'; do
        for DEVICE in '$DRBDADM sh-dev $RESOURCE'; do
        if [ "$DEVICE" = "$DEV" ]
            then echo $RESOURCE
        fi
        done
    done

     
  • 2.5, ЫМЫ (?), 16:54, 08/12/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >  на 3й параметр

    вернее на параметры в принципе :)

     

  • 1.6, user (??), 01:26, 28/03/2010 [ответить]  
  • +/
    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.7, user (??), 04:16, 29/12/2010 [ответить]  
  • +/
    SLES 11 SP1 + DRBD + XEN + COROSYNC + HEARTBEAT + PACEMAKER

    Пришлось:
    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.Если время появится, то опишу подробно.

     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру