Показаны различия между двумя версиями страницы.
xen_pacemaker_cluster [2013/06/11 17:17] metallic [Живая миграция] |
xen_pacemaker_cluster [2022/03/25 17:00] |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Кластер виртуальных машин XEN ====== | ||
- | ===== Введение ===== | ||
- | Задача: | ||
- | В качестве системы виртуализации используется XEN, в качестве Dom0 - GNU/Debian 7.0. Общее хранилище - [[drbd_theory|DRBD]], | ||
- | |||
- | ===== Подготовка системы ===== | ||
- | Устанавливаем ядро 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 Win2012 { | ||
- | | ||
- | # Эти обработчики событий нужны для корректной работы с pacemaker | ||
- | handlers { | ||
- | fence-peer "/ | ||
- | after-resync-target "/ | ||
- | } | ||
- | | ||
- | disk { | ||
- | # Это тоже для pacemaker | ||
- | fencing resource-only; | ||
- | } | ||
- | | ||
- | syncer { | ||
- | # Алгоритм проверки целостности данных | ||
- | verify-alg md5; | ||
- | } | ||
- | | ||
- | # Разрешаем автоматический split brain recovery. На первом этапе, если есть узел с нулевыми изменениями, | ||
- | # выбираем его жертвой. На втором этапе выбираем жертвой вторичный узел. Ну а если так случилось, | ||
- | # оба узла стали мастерами и внесли изменения на ресурс(третий уровень), | ||
- | # в ручном режиме, | ||
- | net { | ||
- | after-sb-0pri discard-zero-changes; | ||
- | after-sb-1pri discard-secondary; | ||
- | after-sb-2pri disconnect; | ||
- | } | ||
- | | ||
- | # DRBD-устройство | ||
- | device | ||
- | | ||
- | # Путь к блочному устройству, | ||
- | disk / | ||
- | | ||
- | # Метаданные будем хранить на самом устройстве | ||
- | meta-disk internal; | ||
- | | ||
- | # Далее указываем адреса и порты обоих узлов | ||
- | on node1 { | ||
- | address | ||
- | } | ||
- | | ||
- | on node2 { | ||
- | address | ||
- | } | ||
- | } | ||
- | |||
- | Ну и конфиг второго ресурса, | ||
- | |||
- | # Имя ресурса | ||
- | resource Win2012-2 { | ||
- | | ||
- | # Эти обработчики событий нужны для корректной работы с pacemaker | ||
- | handlers { | ||
- | fence-peer "/ | ||
- | after-resync-target "/ | ||
- | } | ||
- | | ||
- | disk { | ||
- | # Это тоже для pacemaker | ||
- | fencing resource-only; | ||
- | } | ||
- | | ||
- | syncer { | ||
- | # Алгоритм проверки целостности данных | ||
- | verify-alg md5; | ||
- | } | ||
- | | ||
- | # Разрешаем автоматический split brain recovery. На первом этапе, если есть узел с нулевыми изменениями, | ||
- | # выбираем его жертвой. На втором этапе выбираем жертвой вторичный узел. Ну а если так случилось, | ||
- | # оба узла стали мастерами и внесли изменения на ресурс(третий уровень), | ||
- | # в ручном режиме, | ||
- | net { | ||
- | after-sb-0pri discard-zero-changes; | ||
- | after-sb-1pri discard-secondary; | ||
- | after-sb-2pri disconnect; | ||
- | } | ||
- | | ||
- | # DRBD-устройство | ||
- | device | ||
- | | ||
- | # Путь к блочному устройству, | ||
- | disk / | ||
- | | ||
- | # Метаданные будем хранить на самом устройстве | ||
- | meta-disk internal; | ||
- | | ||
- | # Далее указываем адреса и порты обоих узлов | ||
- | on node1 { | ||
- | address | ||
- | } | ||
- | | ||
- | on node2 { | ||
- | address | ||
- | } | ||
- | } | ||
- | |||
- | Эти конфиги полностью одинаковый для обоих узлов. | ||
- | |||
- | < | ||
- | |||
- | Инициализируем ресурсы: | ||
- | |||
- | # drbdadm create-md Win2012 | ||
- | Writing meta data... | ||
- | initializing activity log | ||
- | NOT initializing bitmap | ||
- | New drbd meta data block successfully created. | ||
- | | ||
- | # drbdadm create-md Win2012-2 | ||
- | Writing meta data... | ||
- | initializing activity log | ||
- | NOT initializing bitmap | ||
- | New drbd meta data block successfully created. | ||
- | |||
- | | ||
- | Запускаем ресурсы: | ||
- | |||
- | # drbdadm up Win2012 | ||
- | | ||
- | # drbdadm up Win2012-2 | ||
- | | ||
- | Смотрим их состояние(на любом узле): | ||
- | |||
- | # cat /proc/drbd | ||
- | 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:5242684 | ||
- | | ||
- | Сейчас они на обоих узлах в состоянии Secondary и данные имеют статус Inconsistent, | ||
- | |||
- | # drbdadm -- --overwrite-data-of-peer primary Win2012 | ||
- | | ||
- | # drbdadm -- --overwrite-data-of-peer primary Win2012-2 | ||
- | |||
- | Эта команда переведет узел, на котором была выполнена, | ||
- | |||
- | # cat /proc/drbd | ||
- | 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:4831036 | ||
- | [> | ||
- | finish: 0:01:10 speed: 68,608 (68,608) K/sec | ||
- | | ||
- | По окончании синхронизации ресурс должен получить следующий статус: | ||
- | |||
- | cs: | ||
- | | ||
- | <note tip> | ||
- | Можно обойтись без синхронизации, | ||
- | # drbdadm -- --clear-bitmap new-current-uuid Win2012 | ||
- | После выполнения этой команды ресурс на обоих узлах сразу перейдет в состояние UpToDate без синхронизации. | ||
- | </ | ||
- | |||
- | ===== Установка виртуальных машин XEN ===== | ||
- | Теперь на любом из узлов(на том, на котором ресурсы находятся в состоянии primary) устанавливаем виртуальные машины с Windows 2012 Server(или с любой другой нужной ОС). Подробно это описывать не буду, в интернете есть полно документации по XEN. Приведу только пример конфигурационного файла для hvm-виртуалки: | ||
- | |||
- | 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 = ' | ||
- | | ||
- | ===== Настройка кластера ===== | ||
- | ==== Corosync ==== | ||
- | Редактируем / | ||
- | |||
- | interface { | ||
- | ringnumber: 0 | ||
- | | ||
- | # Тут указывается адрес сети, а не IP-адрес! (сеть, через которую будет взаимодействовать кластер) | ||
- | bindnetaddr: | ||
- | | ||
- | # Широковещательный адрес | ||
- | mcastaddr: 226.94.1.1 | ||
- | mcastport: 5405 | ||
- | } | ||
- | |||
- | < | ||
- | |||
- | Ну и теперь в / | ||
- | |||
- | START=yes | ||
- | | ||
- | Проверяем чтобы corosync был в автозагрузке и запускаем его | ||
- | |||
- | # / | ||
- | | ||
- | Запускам монитор и проверяем, | ||
- | |||
- | # crm_mon -1 | ||
- | | ||
- | ============ | ||
- | Last updated: Tue Jun 11 18:54:10 2013 | ||
- | Last change: Tue Jun 11 16:34:29 2013 via crm_resource on node1 | ||
- | Stack: openais | ||
- | Current DC: node1 - partition with quorum | ||
- | Version: 1.1.7-ee0730e13d124c3d58f00016c3376a1de5323cff | ||
- | 2 Nodes configured, 2 expected votes | ||
- | 0 Resources configured. | ||
- | ============ | ||
- | | ||
- | Online: [ node2 node1 ] | ||
- | |||
- | |||
- | ==== Pacemaker ==== | ||
- | Заключительный этап. К текущему моменту у нас должны быть две рабочие виртуалки, | ||
- | |||
- | # drbdadm down Win2012 | ||
- | | ||
- | # drbdadm down Win2012-2 | ||
- | | ||
- | Также не забываем запретить автозагрузку виртуалок и ресурсов XEN. Ну и, понятное дело, на обоих узлах кластера должно быть все необходимое для запуска обоих виртуалок, | ||
- | |||
- | Приступаем к настройке кластера, | ||
- | |||
- | # crm configure show | ||
- | node node1 | ||
- | node node2 | ||
- | property $id=" | ||
- | dc-version=" | ||
- | cluster-infrastructure=" | ||
- | expected-quorum-votes=" | ||
- | | ||
- | Выключаем stonith и задаем политику поведения при отсутсвии кворума([[pacemaker_theory|Pacemaker, | ||
- | |||
- | # crm configure property stonith-enabled=false | ||
- | # crm configure property no-quorum-policy=ignore | ||
- | |||
- | Меняем липкость ресурсов по-умолчанию с 0 на -1000, это значит, | ||
- | |||
- | # crm configure property default-resource-stickiness=" | ||
- | | ||
- | Создаем ресурсы кластера для управления ресурсами DRBD: | ||
- | |||
- | # crm configure | ||
- | | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | | ||
- | Некоторые параметры: | ||
- | * **master-max** - максимальное кол-во копий данного мультистейтового ресурса, | ||
- | * **master-node-max** - максимальное кол-во master-сущностей(копий мультистейтового ресурса), | ||
- | * **clone-max** - максимальное кол-во копий данного мультистейтового ресурса во всем кластере, | ||
- | * **clone-node-max** - максимальное кол-во копий данного мультистейтового ресурса, | ||
- | |||
- | В итоге получается, | ||
- | |||
- | Теперь создаем ресурсы виртуалок, | ||
- | |||
- | # crm configure | ||
- | | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | | ||
- | В зависимостях(colocation) указывается, | ||
- | |||
- | К текущему моменту у нас уже должны запуститься виртуалки, | ||
- | |||
- | # crm configure | ||
- | | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | crm(live)configure# | ||
- | | ||
- | Т.е. указываем, | ||
- | |||
- | Таким образом, | ||
- | |||
- | ===== Дополнительная информация ===== | ||
- | ==== Живая миграция ==== | ||
- | Теоретически(и по идее практически) можно настроить DRBD в режиме dual primary и пользоваться живой миграцией виртуальных машин(кластер это поддерживает). На практике у меня возникли некоторые мелкие проблемы с этим(сбои миграции, | ||
- | |||
- | Конфиг DRBD-ресурса для живой миграции: | ||
- | |||
- | resource Win2012 { | ||
- | | ||
- | handlers { | ||
- | fence-peer "/ | ||
- | after-resync-target "/ | ||
- | } | ||
- | | ||
- | disk { | ||
- | fencing resource-only; | ||
- | } | ||
- | | ||
- | syncer { | ||
- | verify-alg md5; | ||
- | } | ||
- | | ||
- | net { | ||
- | allow-two-primaries; | ||
- | | ||
- | after-sb-0pri discard-zero-changes; | ||
- | after-sb-1pri discard-secondary; | ||
- | after-sb-2pri disconnect; | ||
- | } | ||
- | | ||
- | device | ||
- | disk / | ||
- | meta-disk internal; | ||
- | | ||
- | on node1 { | ||
- | address | ||
- | } | ||
- | | ||
- | on node2 { | ||
- | address | ||
- | } | ||
- | | ||
- | startup { | ||
- | become-primary-on both; | ||
- | } | ||
- | } | ||
- | |||
- | Конфигурация кластера: | ||
- | |||
- | ==== Ручное восстановление split brain ==== | ||
- | ==== Полезные ссылки ==== |