Для построения кластеров high availability (высокой доступности) я в своей работе использую Pacemaker. Он себя хорошо зарекомендовал на многих проектах, очень гибкий, динамически развивается. Здесь я приведу краткую инструкцию себе на память по его установке и начальной настройке. Я не претендую на полноту изложения, за этим лучше идти в официальную документацию, благо она неплохо написана. Используемый дистрибутив CentOS 6. Пример будет описан на двух однотипных серверах.
Подготовка
Описывать установку CentOS я не буду, этого материала хватает. Я рекомендую устанавливать минимальный netinstall, всё что нужно сами доставим.
Вкратце опишу что нам нужно перед тем как приступить непосредственно к установке pacemaker:
Установленная CentOS.
Настроенная сеть: сервера должны быть в одной сети (по крайней мере для этого примера).
hostname прописаны в /etc/hosts (как свой так и соседа). В данном примере будут использоваться имена node1 и node2.
Установлен и настроен SSH. Сгенерированы RSA ключи и разнесены по нодам. Доступ между node1 и node2 по ssh осуществляется без пароля. Есть в принципе способ генерировать ключи непосредственно внутри pacemaker, но этот способ я не рассматриваю, если интересно то вам нужно после установки кластера запустить corosync-keygen и разнести файл /etc/corosync/authkey по нодам.
Установлен и настроен NTP.
Устанавливать будем из репозитрия pacemaker - clusterlabs, там стабильная версия и более свежая по сравнение с репозиторием CentOS. Добавляем репозиторий.
Для работы с pacemaker я использую crm shell. К моему сожалению он теперь поставляется отдельно, добавим репозиторий для его установки. Можно его не ставить, тогда можно работать с pcmk, но мне удобен больше crm shell.
Текущая стабильная версия pacemaker использует архитектуру CMAN (вместо openais). Вообще, история развития кластера pacemaker/corosync очень багатая на глобальные изменения, но это отделная тема. Если интересна история развития кластеров то могу порекомендовать вот эту презентацию от Владислава Богданова, ему кстати большая благодарность.
Приступим к установке:
1
# yum install pacemaker cman crmsh ccs
После завершения установки, у меня были следующие версии основных пакетов:
Я использую для связи между нодами клсатера unicast вместо multicast, на сеть нагрузки меньше, защита лучше. Редактируем конфиг для нашей ситауции. Для тонкой настройки рекомендую почитать man corosync.conf. Привожу конфиг /etc/corosync/corosync.conf:
# Please read the corosync.conf.5 manual page
compatibility: whitetank
totem {
version: 2
secauth: off
threads: 0
transport: udpu
interface {
member {
memberaddr: 10.10.0.210
}
member {
memberaddr: 10.10.0.211
}
ringnumber: 0
bindnetaddr: 10.10.0.0
mcastaddr: 226.98.1.1
mcastport: 5500
ttl: 1
}
}
logging {
fileline: off
to_stderr: no
to_logfile: yes
to_syslog: yes
logfile: /var/log/cluster/corosync.log
debug: on
timestamp: on
logger_subsys {
subsys: AMF
debug: off
}
}
amf {
mode: disabled
}
Так же не забываем включить сервис Pacemaker:
123456
# cat << END >> /etc/corosync/service.d/pcmk
service {
name: pacemaker
ver: 1
}
END
По поводу значения ver: 1, он указывает что сервис pacemaker мы будем запускать сами. Для начала оставим так, в дальнейшем его можно поменять на ver: 0 тогда pacemaker будет запускаться сам после запуска кластера.
Для CMAN необходим ещё один конфигурационный файл /etc/cluster/cluster.conf. Он имеет формат xml. Писать ручками его не практично, будем использовать установленную ранее ccs. Для начала пропишем имя кластеру и добавим ноды:
Всё отлично. Повторяем все предыдущие шаги на node2. Теперь мы имеем подготовленные node1 и node2.
Теперь можно запускать кластер, но перед этим ещё одно замечание.
Первоначально, CMAN была написана для rgmanager и предполагает, что кластер не должен запускаться, пока нода не имеет кворума. Поэтому прежде чем пытаться запустить кластер, мы отключим эту особеннсть. Выполняем на node1 и node2:
Теперь пробуем запустить кластер. Выполняем на node1 и node2:
123456789101112131415
# service cman start
Starting cluster:
Checking if cluster has been disabled at boot... [ OK ]
Checking Network Manager... [ OK ]
Global setup... [ OK ]
Loading kernel modules... [ OK ]
Mounting configfs... [ OK ]
Starting cman... [ OK ]
Waiting for quorum... [ OK ]
Starting fenced... [ OK ]
Starting dlm_controld... [ OK ]
Tuning DLM kernel config... [ OK ]
Starting gfs_controld... [ OK ]
Unfencing self... [ OK ]
Joining fence domain... [ OK ]
Проверяем ноды:
1234
# cman_tool nodes
Node Sts Inc Joined Name
1 M 44 2013-06-20 15:20:20 node1
2 M 40 2013-06-20 15:20:20 node2
Вроде всё чисто, проверяем в /var/log/cluster/corosync.log. Ищем там любые warning и error. Если и там всё отлично, пробуем стартовать pacemaker. Опять же запускаем на node1 и node2:
12345678910111213141516
# service pacemaker start
Starting cluster:
Checking if cluster has been disabled at boot... [ OK ]
Checking Network Manager... [ OK ]
Global setup... [ OK ]
Loading kernel modules... [ OK ]
Mounting configfs... [ OK ]
Starting cman... [ OK ]
Waiting for quorum... [ OK ]
Starting fenced... [ OK ]
Starting dlm_controld... [ OK ]
Tuning DLM kernel config... [ OK ]
Starting gfs_controld... [ OK ]
Unfencing self... [ OK ]
Joining fence domain... [ OK ]
Starting Pacemaker Cluster Manager: [ OK ]
Снова проверяем /var/log/cluster/corosync.log. Там будет несколько warning по поводу отсутствующей конфигурации /var/lib/pacemaker/cib/cib.xml, но это нормально, мы её сейчас будем создавать.
Проверяем состяние кластера:
12345678
# crm_mon -1
Stack: cman
Current DC: node1 - partition with quorum
Version: 1.1.9-1512.el6-2a917dd
2 Nodes configured, unknown expected votes
0 Resources configured.
Online: [ node1 node2 ]
Установка закончена. Теперь можно приступать к конфигурированию кластера.
Конфигурирование pacemaker
Для управлением конфигурацией кластера будем использовать, как уже раньше отмечалось, crm shell. За разъяснением как работать с pcmk обращайтесь в официальную документацию.
crm(live)configure# cib new new_conf - Создаём новую конфигурацию в CIB, в которой и будем делать все изменения. Не рекомендую работать в основной cib (live). Все изменения в новой конфигурации (new_conf) не применяются на кластер до тех пор пока мы её не перенесём в cib live с помощью cib commit new_conf.
property stonith-enabled=false и property no-quorum-policy=ignore - Выключаем fencing и действия по умолчанию при потере кворума.
property symmetric-cluster=false - Переводим кластер в несимметричный режим. В отличии от симметричного, он не запускает нигде никакие ресурсы, если это явно не разрешено в location (об этом ниже). В принципе, в данном случае это нам не нужно, даже добавляет неудобства. Однако это добавляет удобства в конфигурировании если нод больше двух и много ресурсов, которые привязаны только к определённым из них. Я не настаиваю на этом параметре, необходимость в нём зависит от архитектуры кластера.
Ресурсы кластера
Ресурсами в кластере могут являться программы, скрипты, ip адреса, файловые системы и т.д. Вариаций много. Скрипты для управления ресурсами находятся в /usr/lib/ocf/resource.d/. К примеру вот список доступных ресурс агентов для провайдера Heartbeat:
Если нет нужного, можно написать свой. Написаны ресурс агенты на bash.
Приступим к добавлению ресурсов. Создадим к примеру следующую конфигурацию:
Имеется две ноды, на них установлен и настроен nginx, для синхронизации рабочей директории nginx будет использоваться lsyncd/unison. Балансировка будет присходить по двум плавающим ip адресам.
Для начала устанавливаем всё необходимое:
1
yum install nginx lsyncd unison
Про настройку lsyncd я уже писал. Просто меняем в source и в команде запуска unison /mnt/lsynced на что-нибудь вроде /usr/share/nginx/html. Это конечно зависит от nginx.
Проверяем lsyncd. Запускаем на node2 и создаём файлик на ней же /usr/share/nginx/html/test. В выводе будет что-то вроде:
Настройку nginx приводить не буду, подключайте фантазию.
Теперь приступим к созданию ресурсов в кластере. Для lsyncd я буду использовать clone ресурс, а для nginx два разных ресурса для каждой ноды просто для примера. Выбор того или иного способа описания ресурсов зависит лишь от ситуации и ваших личных предпочтений.
1234
# crm
crm(live)# configure
crm(live)configure# cib use new_conf
crm(new_conf)configure# edit
После выходим из редактора и применяем конфигурацию на кластер:
12345
crm(new_conf)configure# commit
crm(new_conf)configure# cib use
crm(live)configure# cib commit new_conf
INFO: commited 'new_conf' shadow CIB to the cluster
crm(live)configure# show
Теперь проверяем как всё запустилось:
123456789101112131415161718192021
# crm_mon -fnr1
Stack: cman
Current DC: node2 - partition with quorum
Version: 1.1.9-1512.el6-2a917dd
2 Nodes configured, unknown expected votes
6 Resources configured.
Node node1: online
nginx1 (ocf::heartbeat:nginx): Started
ipaddr_215 (ocf::heartbeat:IPaddr2): Started
lsyncd:1 (ocf::heartbeat:lsyncd): Started
Node node2: online
nginx2 (ocf::heartbeat:nginx): Started
lsyncd:0 (ocf::heartbeat:lsyncd): Started
ipaddr_216 (ocf::heartbeat:IPaddr2): Started
Inactive resources:
Migration summary:
* Node node2:
* Node node1:
Проверим случай выпадения одной ноды, после её вернём обратно:
Все эти действия сразу выполняются. Бывает ситуация, когда ресурс вылетает, тогда pacemaker определяет по мониторингу что он не запущен и сново запускает, увеличевая при этом счётчик таких ошибок. К примеру убъём процесс nginx:
123456789101112131415161718192021222324
# ps aux |grep nginx |grep -v grep
root 10796 0.0 0.4 96024 2040 ? Ss 18:48 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 10798 0.0 0.5 96376 2708 ? S 18:48 0:00 nginx: worker process
# kill -KILL 10796 10798
# crm_mon -fnr1
...
Node node1: online
nginx1 (ocf::heartbeat:nginx): Started
ipaddr_215 (ocf::heartbeat:IPaddr2): Started
lsyncd:1 (ocf::heartbeat:lsyncd): Started
Node node2: online
nginx2 (ocf::heartbeat:nginx): Started
ipaddr_216 (ocf::heartbeat:IPaddr2): Started
lsyncd:0 (ocf::heartbeat:lsyncd): Started
Inactive resources:
Migration summary:
* Node node2:
* Node node1:
nginx1: migration-threshold=1000000 fail-count=2 last-failure='Thu Jun 20 19:17:19 2013'
Failed actions:
nginx1_monitor_5000 (node=node1, call=276, rc=7, status=complete): not running
Появилась запись что были ошибки. Если же ресурс не может запуститься, или слишком часто вылетает, то значение счётчика fail-count выставляется в 1000000 и после этого этот ресурс на этой ноде не будет восстонавливаться. А для сброса счётчика можно сделать:
1
# crm resource cleanup nginx1
P.S.
Это лишь самые базовые возможности Pacemaker. Есть ещё очерёдность запуска (order), совместное размещение (colocation), группы и т.д. Если есть какие замечания, пожелания, неточности в статье, оставляйте в комментариях или дишите на почту.