xen_pacemaker_cluster
Различия
Показаны различия между двумя версиями страницы.
| — | xen_pacemaker_cluster [2022/03/25 14:00] (текущий) – создано - внешнее изменение 127.0.0.1 | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | ====== Кластер виртуальных машин с XEN, DRBD и Pacemaker ====== | ||
| + | ===== Введение ===== | ||
| + | Задача: | ||
| + | В качестве системы виртуализации используется XEN, в качестве Dom0 - GNU/Debian 7.0. Общее хранилище - [[drbd_theory|DRBD]], | ||
| + | |||
| + | ===== Подготовка системы ===== | ||
| + | Устанавливаем ядро XEN с утилитами, | ||
| + | |||
| + | # apt-get install xen-linux-system-amd64 xen-tools bridge-utils drbd8-utils pacemaker | ||
| + | | ||
| + | После установки у нас в загрузчике появится вариант загрузки 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# | ||
| + | | ||
| + | Т.е. указываем, | ||
| + | |||
| + | Таким образом, | ||
| + | |||
| + | ===== Дополнительная информация ===== | ||
| + | ==== VNC для виртуалок ==== | ||
| + | В мануале выше, в качестве адреса для удаленных VNC-подключений используется 127.0.0.1, что не очень удобно, | ||
| + | |||
| + | # crm configure | ||
| + | | ||
| + | crm(live)configure# | ||
| + | crm(live)configure# | ||
| + | crm(live)configure# | ||
| + | crm(live)configure# | ||
| + | crm(live)configure# | ||
| + | |||
| + | Теперь виртуалка будет перемещаться по кластеру вместе с IP-адресом для VNC-консоли. | ||
| + | |||
| + | ==== Живая миграция ==== | ||
| + | Теоретически(и по идее практически) можно настроить 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; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | Конфигурация кластера: | ||
| + | |||
| + | crm configure primitive DRBDWin2012 ocf: | ||
| + | crm configure ms ms_DRBDWin2012 DRBDWin2012 meta master-max=" | ||
| + | | ||
| + | crm configure primitive XENWin2012 ocf: | ||
| + | crm configure colocation Win2012-on-DRBD inf: XENWin2012 ms_DRBDWin2012: | ||
| + | crm configure order Win2012AfterDRBD inf: ms_DRBDWin2012: | ||
| + | | ||
| + | crm configure primitive DRBDWin2012-2 ocf: | ||
| + | crm configure ms ms_DRBDWin2012-2 DRBDWin2012-2 meta master-max=" | ||
| + | | ||
| + | crm configure primitive XENWin2012-2 ocf: | ||
| + | crm configure colocation Win2012-on-DRBD-2 inf: XENWin2012-2 ms_DRBDWin2012-2: | ||
| + | crm configure order Win2012AfterDRBD-2 inf: ms_DRBDWin2012-2: | ||
| + | |||
| + | ==== Ручное восстановление split brain ==== | ||
| + | Ситуация с возникновением в нормальных условиях достаточно редкая, | ||
| + | - Останавливаем все ресурсы pacemaker(командой crm resource stop [res]), которые связаны с проблемным DRBD-ресурсом(как правило XEN виртуалки и сам DRBD-ресурс) | ||
| + | - На обоих узлах DRBD-ресурсы должны деактивироваться, | ||
| + | - Переводим на обоих узлах ресурс в автономный режим(drbdadm disconnect [res]) | ||
| + | - Переводим на обоих узлах ресурс в secondary режим (drbdadm secondary [res]) | ||
| + | - Выбираем один из узлов в качестве жертвы, | ||
| + | - Второй узел(источник репликации) переводим в режим подключения(drbdadm connect [res]) | ||
| + | - Дожидаемся завершения синхронизации | ||
| + | - Деактивируем ресурс на обоих узлах(drbdadm down [res]) | ||
| + | - Теперь можно запустить все ресурсы pacemaker в нужном порядке(crm resource start [res]) | ||
| + | |||
| + | ==== Полезные ссылки ==== | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
