Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
xen_pacemaker_cluster [2013/06/11 12:51] metallic |
xen_pacemaker_cluster [2022/03/25 17:00] (текущий) |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Кластер виртуальных машин XEN ====== | + | ====== Кластер виртуальных машин |
===== Введение ===== | ===== Введение ===== | ||
+ | Задача: | ||
+ | В качестве системы виртуализации используется XEN, в качестве Dom0 - GNU/Debian 7.0. Общее хранилище - [[drbd_theory|DRBD]], | ||
- | Задача: организовать двухузловый кластер виртуальных машин с распределением нагрузки. Т.е. допустим есть у нас две виртуальные | + | ===== Подготовка |
+ | Устанавливаем ядро | ||
- | В качестве системы виртуализации используется | + | # 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 | ||
+ | |||
+ | После перезагрузки у нас должен появится сетевой | ||
===== Настройка DRBD ===== | ===== Настройка 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:// |