Pacemaker – набор утилит от для управления распределением ресурсов вычислительного кластера.
Pacemaker позволяет гибко распределять ресурсы по узлам кластера, следить за их доступностью, поднимать в случае падения ресурса, отрабатывать failover целого узла.
Если говорить кратко, Pacemaker работает по принципу Heartbeat, только расширяет его функциональность до высоких высот. Во-первых, Pacemaker может управлять более чем двумя узлами кластера, во-вторых, мониторить состояние ресурсов, в-третьих, позволяет ресурсы клонировать. И еще много-много чего другого.
Pacemaker представляет из себя конгломерат из пакетов Pacemaker, Corosyc, OpenAIS, Heartbeat. Pacemaker использует транспорт сообщений Corosync/OpenAIS либо Heartbeat для взаимодействия между узлами кластера. При этом действующий транспорт в кластере может быть только одного типа: либо Corosync/OpenAIS, либо Heartbeat.
Не смотря на то, что предпочтительным транспортом является Corosync, пакет Heartbeat так же должен быть установлен, поскольку он включает в себя достаточно большое количество OCF скриптов для управления ресурсами кластера.
За работу Pacemaker в CentOS отвечают два LSB-скрипта:
/etc/init.d/corosync /etc/init.d/openais
За конфигурацию Pacemaker на отдельной ноде отвечают файлы:
/etc/corosync/corosync.conf - конфигурация corosync /etc/corosync/authkey - авторизационный ключ для работы в кластере /etc/corosync/service.d/pcmk - файл для связки corosync и pacemaker
Конфигурация кластера представляет из себя единый внутренний файл, изменения в который можно вносить на любой ноде с помощью утилиты crm. Изменения распространяются по другим нодам в качестве diff’ов автоматически.
За конфигурацию кластера отвечает единая консольная утилита crm.
Мониторинг состояния кластера: crm status – мгновенный слепок состояния, crm_mon – реалтайм мониторинг из консоли.
Основные понятия
Узлы (ноды,nodes) кластера
Узел (нода,node) кластера представляет из себя машину с установленным Pacemaker и включенным в состав кластера.
Управление нодами кластера осуществляется через команду crm node:
crm node standby node1 - переключить node1 в режим простоя crm node online node1 - переключить node1 в рабочий режим crm node fence node1 - убить (выключить) при помощи STONITH node1 crm node help - справка по операциям с узлами
Узлы, предназначенные для выполнения одинаковых ресурсов должны иметь одинаковую конфигурацию софта, который используется ресурсами. То есть, если ресурс res1 ocf:heartbeat:apache предполагается запускать на узлах node1,node2,node3 и он использует определенный нестандартный модуль mod_rpaf, то все три узла должны иметь установленный apache и mod_rpaf одинаковых версий. Это исключает ситуацию, когда ресурс при перемещении между узлами может запуститься на одном ушле и не может на другом.
Ресурсы
Что есть ресурс с точки зрения pacemaker? Все, что может быть заскриптовано. Обычно скрипты пишутся на bash, но ничто не мешает вам писать их на Perl, Python или даже на C. Все, что требуется от скрипта, это выполнять 3 действия: start, stop и monitor. В общем-то скрипты должны соответствовать LSB (Linux Standard Base) или OCF (Open Cluster Framework) — последнее несколько расширяет LSB, требуя также передачи параметров через переменные окружения с особым названием.
Ресурс может представлять из себя:
- IP адрес
- Демон с определенной конфигурацией
- Блочное устройство
- Файловую систему
- etc
Каждый ресурс представляет из себя LSB/OCF скрипт, который должен обрабатывать минимум три параметра: start,stop,monitor, выдавая корректные коды возврата.
Управление ресурсами осуществляется через команду crm resource:
crm resource stop resource1 - остановить ресурс resource1
crm resource start resource1 - запустить ресурс resource1
crm resource move resource1 node2 - принудительно переместить ресурс resource1 на node2
crm resource cleanup resource1 - удалить счетчики сбоев ресурса resource1 со всех узлов
crm resource cleanup resource1 node2 - удалить счетчики сбоев ресурса resource1 с узла node2
crm resource help - справка по доступным действиям
Создание ресурсов осуществляется через crm configure primitive … .
Создание ресурса веб сервера apache из скрипта OCF apache осуществляется командой:
crm configure primitive sites-httpd ocf:heartbeat:apache params \ configfile="/cluster/conf/httpd-sites/conf/httpd.conf" httpd="/usr/sbin/httpd" port="85" \ statusurl="http://127.0.0.1:85/server-status" testregex="Apache" op monitor interval="30s"
Где
- sites-httpd – имя ресурса
- ocf:heartbeat:apache – расположение скрипта ресурса. ocf – тип скрипта (ocf или lsb), heartbeat – набор скриптов heartbeat, apache – имя скрипта. OCF скрипты располагаются в /usr/lib/ocf.
- configfile, httpd, port, statusurl, testregex – набор параметров OCF скрипта. Их имена, семантика и использование индивидуальны для каждого скрипта.
- op monitor interval=»30s» – применять к скрипту операцию monitor каждые 30 секунд. В случае если скрипт ocf::apache monitor вернул статус отличный от нуля, осуществляется попытка потушить ресурс и поднять его снова. При определенном количестве сбоев осуществляется решение о перемещении ресурса на другой узел.
Апач очевидно необходимо повесить на определенный IP адрес. По этому необходимо создать ресурс IP адреса:
crm configure primitive sites-ip-ext ocf:heartbeat:IPaddr2 \ params ip="192.168.0.31" cidr_netmask="32" \ op monitor interval="30s"
Однако очевидно что IP адрес и апач должны стартовать последовательно и на одном узле. Для определения таких связей используются Группы ресурсов
Группы ресурсов
Это последовательный список ресурсов, которые должны запускаться в определенном порядке, останавливаться в обратном порядке и исполняться на одном узле.
Например, ресурсы веб-сервера Apache (sites-httpd) и IP адрес для него (sites-ip-ext). Это два ресурса. Очевидно, что Apache не поднимется, если в системе нет определенного для него IP адреса. По этому мы создаем группу sites:
crm configure group sites sites-ip-ext sites-httpd
Теперь в кластере имеется группа под названием sites, включающая в себя два ресурса. К группе можно обращаться как к отдельному ресурсу: перемещать, устанавливать связи и свойства.
Вес связи
Для установки предпочтений связей используется вес связей от -INFINITY до +INFINITY. Установка с весом -INFINITY или +INFINITY является жесткой. Вес +/- INFINITY не может оспариваться другими условиями. Вес в целочисленном представлении может.
location
Директивой location можно определить предпочтительный запуск определенного ресурса/группы на определенном узле.
Установка предпочтения запуска ресурса httpd с весом 50 на node1 и весом 100 на node2:
crm configure location httpd-prefer-node1 httpd rule 50: node1 crm configure location httpd-prefer-node2 httpd rule 100: node2
Установка жесткого запуска ресурса httpd сугубо на node1 (ахтунг! при сбое ресурса его миграция на другие ноды будет весьма затруднена!):
crm configure location httpd-prefer-node1 httpd rule INFINITY: node1
Ресурс httpd не должен вообще никогда запускаться на node2:
crm configure location httpd-prefer-node1 httpd rule -INFINITY: node2
colocation
Директивой colocation можно определить предпочтительный запуск определенных ресурсов/групп вместе на одном узле.
Запускать ресурсы WebSite ClusterIP только на одном узле
crm configure colocation website-with-ip INFINITY: WebSite ClusterIP
Никогда не запускать ресурсы nginx и apache на одном узле
crm configure colocation nginx-not-apache -INFINITY: nginx apache
Установка
Нужно убедиться что:
- IP и hostname ноды взаимно отвечают друг другу в DNS на A и PTR запросы.
- Настроена ssh авторизация по публичному ключу текущей ноды со всеми остальными, всех остальных с текущей и текущей с текущей
- SELinux выключен
- Временная зона на всех нодах одинакова и время синхронизировано
Подключаем репозиторий ClusterLabs и устанавливаем софт:
cd /etc/yum.repos.d wget http://www.clusterlabs.org/rpm/epel-5/clusterlabs.repo yum install pacemaker corosync openais
Содержимое файла /etc/corosync/corosync.conf:
# Please read the corosync.conf.5 manual page compatibility: whitetank totem { version: 2 secauth: off threads: 0 interface { ringnumber: 0 bindnetaddr: 192.168.0.0 mcastaddr: 239.192.1.1 mcastport: 4000 # broadcast yes } } logging { fileline: off to_stderr: no to_logfile: yes to_syslog: yes syslog_facility: local2 logfile: /var/log/corosync.log debug: off timestamp: on logger_subsys { subsys: AMF debug: off } } amf { mode: disabled }
Где:
- bindnetaddr – Сеть класса С для внутренних коммуникаций, это не IP адрес ноды, это сеть /24, в котором он находится
- mcastaddr, mcastport – адрес и порт для мультикастовых сообщений
Файл /etc/corosync/authkey суть случайная последовательность байт длинной около 128 байт, должен быть одинаковый для всех нод кластера. Следовательно, для первой ноды кластера мы его создаем
dd if=/dev/urandom of=/etc/corosync/authkey bs=1 count=128 chmod 600 /etc/corosync/authkey
А для остальных нод кластера мы его просто копируем.
Файл для связки corosync & pacemaker /etc/corosync/service.d/pcmk:
service { # Load the Pacemaker Cluster Resource Manager name: pacemaker ver: 0 } END
Стартуем:
/etc/init.d/openais start /etc/init.d/corosync start chkconfig opeais on chkconfig corosync on
Убедиться что кластер стартовал можно командой crm status.
Написано по мотивам (значительно дополнил статью).