Показаны различия между двумя версиями страницы.
Следующая версия | Предыдущая версия | ||
drbd_xen_live_migration [2013/05/30 13:00] metallic создано |
drbd_xen_live_migration [2022/03/25 17:00] (текущий) |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
====== XEN на DRBD с живой миграцией между узлами ====== | ====== XEN на DRBD с живой миграцией между узлами ====== | ||
- | XEN имеет встроенную возможность перемещать гостей DomU между несколькими узлами Dom0 без остановки их работы, | + | |
+ | ===== Введение ===== | ||
+ | XEN имеет встроенную возможность перемещать гостей DomU между несколькими узлами Dom0 без остановки их работы, | ||
+ | |||
+ | ===== Подготовка системы ===== | ||
+ | Устанавливаем ядро XEN с утилитами, | ||
+ | |||
+ | # apt-get install xen-linux-system-amd64 xen-tools bridge-utils drbd8-utils | ||
+ | |||
+ | После установки у нас в загрузчике появится вариант загрузки XEN Dom0, на нужно сделать, | ||
+ | |||
+ | # mv / | ||
+ | # update-grub | ||
+ | |||
+ | Перезагружаемя, | ||
+ | |||
+ | # xm list | ||
+ | | ||
+ | | ||
+ | |||
+ | Если команда выполнилась без ошибки - значит все нормально. | ||
+ | |||
+ | Дальше настроим сетевой мост. Предполагается, что гостевые системы будут работать в локальной сети, поэтому в сетевой мост включаем интерфейс, который | ||
+ | |||
+ | allow-hotplug eth0 | ||
+ | iface eth0 inet manual | ||
+ | pre-up | ||
+ | pre-down ifconfig $IFACE down | ||
+ | |||
+ | auto br0 | ||
+ | iface br0 inet static | ||
+ | bridge_ports eth0 | ||
+ | address 192.168.1.1 | ||
+ | netmask 255.255.255.0 | ||
+ | |||
+ | После перезагрузки у нас должен появится сетевой мост br0, в него будем подключать наших гостей, | ||
+ | |||
+ | ===== Настройка DRBD ===== | ||
+ | В Debian модуль ядра уже есть, | ||
+ | |||
+ | options drbd disable_sendpage=1 | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | После перезагрузки модуль должен быть загружен: | ||
+ | |||
+ | # lsmod | grep drbd | ||
+ | drbd 313707 | ||
+ | |||
+ | Теперь нужно выделить любое блочное устройство(диск, | ||
+ | |||
+ | Редактируем / | ||
+ | |||
+ | include "/ | ||
+ | include "/ | ||
+ | |||
+ | Редактируем общие параметры для всех ресурсов(эти параметры потом можно переопределить для каждого ресурса индивидуально), | ||
+ | |||
+ | global { | ||
+ | # Запрещаем посылать через интернет разработчикам информацию о версии DRBD (для статистики) | ||
+ | usage-count no; | ||
+ | |||
+ | # minor-count dialog-refresh disable-ip-verification | ||
+ | } | ||
+ | |||
+ | common { | ||
+ | # Синхронный протокол синхронизации | ||
+ | protocol C; | ||
+ | |||
+ | handlers { | ||
+ | # The following 3 handlers were disabled due to #576511. | ||
+ | # Please check the DRBD manual and enable them, if they make sense in your setup. | ||
+ | # pri-on-incon-degr "/ | ||
+ | # pri-lost-after-sb "/ | ||
+ | # local-io-error "/ | ||
+ | |||
+ | # fence-peer "/ | ||
+ | # split-brain "/ | ||
+ | # out-of-sync "/ | ||
+ | # before-resync-target "/ | ||
+ | # after-resync-target / | ||
+ | } | ||
+ | |||
+ | startup { | ||
+ | # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb | ||
+ | } | ||
+ | |||
+ | options { | ||
+ | # cpu-mask on-no-data-accessible | ||
+ | } | ||
+ | |||
+ | net { | ||
+ | # sndbuf-size rcvbuf-size timeout connect-int ping-int ping-timeout max-buffers | ||
+ | # max-epoch-size ko-count allow-two-primaries cram-hmac-alg shared-secret | ||
+ | # after-sb-0pri after-sb-1pri after-sb-2pri data-integrity-alg no-tcp-cork | ||
+ | } | ||
+ | |||
+ | syncer { | ||
+ | # rate after al-extents use-rle cpu-mask verify-alg csums-alg | ||
+ | |||
+ | # Максимальная скорость синхронизации(МБ/ | ||
+ | rate 100M; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | Теперь создаем конфигурационный файл ресурса / | ||
+ | |||
+ | # Имя ресурса | ||
+ | resource Wheezy { | ||
+ | |||
+ | syncer { | ||
+ | # Алгоритм проверки целостности данных | ||
+ | verify-alg md5; | ||
+ | } | ||
+ | |||
+ | net { | ||
+ | # Разрешаем обоим узлам быть мастерами одновременно | ||
+ | allow-two-primaries; | ||
+ | } | ||
+ | |||
+ | # DRBD-устройство | ||
+ | device | ||
+ | |||
+ | # Путь к блочному устройству, | ||
+ | disk / | ||
+ | |||
+ | # Метаданные будем хранить на самом устройстве | ||
+ | meta-disk internal; | ||
+ | |||
+ | # Далее указываем адреса и порты обоих узлов | ||
+ | on node1 { | ||
+ | address | ||
+ | } | ||
+ | |||
+ | on node2 { | ||
+ | address | ||
+ | } | ||
+ | } | ||
+ | |||
+ | Этот конфиг полностью одинаковый для обоих узлов. | ||
+ | |||
+ | < | ||
+ | |||
+ | Инициализируем ресурс: | ||
+ | |||
+ | # drbdadm create-md Wheezy | ||
+ | Writing meta data... | ||
+ | initializing activity log | ||
+ | NOT initializing bitmap | ||
+ | New drbd meta data block successfully created. | ||
+ | |||
+ | Запускаем ресурс: | ||
+ | |||
+ | # drbdadm up Wheezy | ||
+ | |||
+ | Смотрим его состояние(на любом узле): | ||
+ | |||
+ | # cat / | ||
+ | version: 8.3.11 (api: | ||
+ | srcversion: 41C52C8CD882E47FB5AF767 | ||
+ | |||
+ | 1: cs: | ||
+ | ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos: | ||
+ | |||
+ | Сейчас он на обоих ресурсах в состоянии Secondary и данные имеют статус Inconsistent, | ||
+ | |||
+ | # drbdadm -- --overwrite-data-of-peer primary Wheezy | ||
+ | |||
+ | Эта команда переведет узел, на котором была выполнена, | ||
+ | |||
+ | # cat / | ||
+ | version: 8.3.11 (api: | ||
+ | srcversion: 41C52C8CD882E47FB5AF767 | ||
+ | |||
+ | 1: cs: | ||
+ | ns:412672 nr:0 dw:0 dr:417432 al:0 bm:24 lo:3 pe:1 ua:5 ap:0 ep:1 wo:b oos: | ||
+ | [> | ||
+ | finish: 0:01:10 speed: 68,608 (68,608) K/sec | ||
+ | |||
+ | По окончании синхронизации ресурс должен получить следующий статус: | ||
+ | |||
+ | cs: | ||
+ | |||
+ | <note tip> | ||
+ | Можно обойтись без синхронизации, | ||
+ | # drbdadm -- --clear-bitmap new-current-uuid Wheezy | ||
+ | После выполнения этой команды ресурс на обоих узлах сразу перейдет в состояние UpToDate без синхронизации. | ||
+ | </ | ||
+ | ===== Настройка XEN ===== | ||
+ | К текущему моменту у нас один узел работает в режиме мастера, | ||
+ | |||
+ | # drbdadm primary Wheezy | ||
+ | |||
+ | Теперь устанавливаем гостевую систему с помощью утилит XEN методом debootstrap(для простоты устанавливаем без swap-раздела, | ||
+ | |||
+ | # xen-create-image --hostname=Wheezy --memory=512mb --vcpus=1 --dhcp --pygrub --dist=wheezy --mirror=http:// | ||
+ | |||
+ | * **hostname** - имя хоста, которое будет задано установленной системе | ||
+ | * **memory** - кол-во оперативной памяти, | ||
+ | * **vcpus** - кол-во процессоров(ядер), | ||
+ | * **dhcp** - указываем, | ||
+ | * **pygrub** - указываем, | ||
+ | * **dist** - кодовое имя устанавливаемого дистрибутива, список поддерживаемых можно посмотреть тут / | ||
+ | * **mirror** - зеркало, откуда брать установочные файлы (понятное дело, должен быть доступ к интернету на время установки) | ||
+ | * **fs** - файловая система для гостевой ОС | ||
+ | * **image-dev** - этим параметром указываем, | ||
+ | * **noswap** - уже сказано, | ||
+ | * **output** - указываем каталог, | ||
+ | |||
+ | После выполнения команды, | ||
+ | |||
+ | WARNING | ||
+ | ------- | ||
+ | |||
+ | You appear to have a missing vif-script, or network-script, | ||
+ | Xen configuration file / | ||
+ | |||
+ | Please fix this and restart Xend, or your guests will not be able | ||
+ | to use any networking! | ||
+ | |||
+ | |||
+ | General Information | ||
+ | -------------------- | ||
+ | Hostname | ||
+ | Distribution | ||
+ | Mirror | ||
+ | Root Device | ||
+ | Partitions | ||
+ | Memory size : 512mb | ||
+ | Kernel path : / | ||
+ | Initrd path : / | ||
+ | |||
+ | Networking Information | ||
+ | ---------------------- | ||
+ | IP Address | ||
+ | |||
+ | |||
+ | Creating ext4 filesystem on / | ||
+ | Done | ||
+ | Installation method: debootstrap | ||
+ | Done | ||
+ | |||
+ | Running hooks | ||
+ | Done | ||
+ | |||
+ | No role scripts were specified. | ||
+ | |||
+ | Creating Xen configuration file | ||
+ | Done | ||
+ | |||
+ | No role scripts were specified. | ||
+ | All done | ||
+ | |||
+ | |||
+ | Logfile produced at: | ||
+ | / | ||
+ | |||
+ | Installation Summary | ||
+ | --------------------- | ||
+ | Hostname | ||
+ | Distribution | ||
+ | IP-Address(es) | ||
+ | RSA Fingerprint : e6: | ||
+ | Root Password | ||
+ | |||
+ | Смотрим что нам за конфиг нагенерили: | ||
+ | |||
+ | bootloader = '/ | ||
+ | |||
+ | vcpus = ' | ||
+ | memory | ||
+ | |||
+ | root = '/ | ||
+ | disk = [ ' | ||
+ | |||
+ | name = ' | ||
+ | |||
+ | dhcp = ' | ||
+ | vif = [ ' | ||
+ | |||
+ | on_poweroff = ' | ||
+ | on_reboot | ||
+ | on_crash | ||
+ | |||
+ | Пробуем запустить | ||
+ | |||
+ | # xm create -c / | ||
+ | |||
+ | Если все получилось, | ||
+ | |||
+ | Итак, виртуалка работает, | ||
+ | |||
+ | disk = [ ' | ||
+ | |||
+ | Что такое drbd-тип устройства в XEN? В каталоге / | ||
+ | |||
+ | Теперь пробуем снова запустить виртуалку, | ||
+ | |||
+ | # xm list | ||
+ | Name ID Mem VCPUs State | ||
+ | Domain-0 | ||
+ | Wheezy | ||
+ | |||
+ | А drbd-устройство на этом узле должно быть в режиме primary(хотя если это | ||
+ | |||
+ | # cat / | ||
+ | version: 8.3.11 (api: | ||
+ | srcversion: 41C52C8CD882E47FB5AF767 | ||
+ | |||
+ | 1: cs: | ||
+ | ns:328 nr:0 dw:328 dr:664 al:6 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0 | ||
+ | |||
+ | Ну и самое интересное, | ||
+ | |||
+ | # Разрешаем живую миграцию | ||
+ | (xend-relocation-server yes) | ||
+ | |||
+ | # Разрешаем живую миграцию для любой виртуалки(можно указать список, | ||
+ | (xend-relocation-hosts-allow '' | ||
+ | |||
+ | Перезапускаем XEN | ||
+ | |||
+ | # / | ||
+ | |||
+ | Посе перезапуска оба узла должны слушать порт 8002. | ||
+ | |||
+ | Сама миграция выполняется очень просто, | ||
+ | |||
+ | # xm migrate --live Wheezy 192.168.1.2 | ||
+ | |||
+ | * **Wheezy** - имя виртуалки XEN | ||
+ | * **192.168.1.2** - адрес(или имя) ноды, на которую мигрируем | ||
+ | |||
+ | Если все работает корректно, | ||
+ | |||
+ | ===== Аппаратная виртуализация ===== | ||
+ | Если используется полностью аппаратная виртуализация, | ||
+ | |||
+ | Пример виртуальной машины для запуска Windows 2012 Server (или любой другой системы с аппаратной виртуализацией): | ||
+ | |||
+ | kernel = "/ | ||
+ | builder=' | ||
+ | memory = 2048 | ||
+ | name = " | ||
+ | vcpus=1 | ||
+ | acpi=1 | ||
+ | apic=1 | ||
+ | device_model = '/ | ||
+ | |||
+ | vif = [ ' | ||
+ | disk = [ ' | ||
+ | |||
+ | # boot on floppy (a), hard disk (c) or CD-ROM (d) | ||
+ | boot=" | ||
+ | |||
+ | usbdevice=' | ||
+ | |||
+ | vnc=1 | ||
+ | vncunused=0 | ||
+ | vnclisten = ' | ||
+ | vncdisplay=0 | ||
+ | vncconsole=0 | ||
+ | vncpasswd='' | ||
+ | |||
+ | sdl=0 | ||
+ | vncviewer=0 | ||
+ | |||
+ | stdvga=0 | ||
+ | serial=' | ||
+ | ne2000 = " | ||
+ | |||
+ | on_poweroff = ' | ||
+ | on_reboot = ' | ||
+ | on_crash = ' | ||