Thank you for reading this post, don't forget to subscribe!
Pacemaker программное обеспечения для настройки отказоустойчивых систем. Например, с его помощью можно настроить кластер серверов высокой доступности
Corosync программный продукт, позволяющий реализовать кластер серверов. Его основное назначение — знать и передавать состояние всех участников кластера.
Heartbeat специальный сигнал, который говорит о работоспособности программного обеспечения или аппартной платформы. Отсутствие данного сигнала может свидетельствовать о наличие проблем. Термин heartbeat переводиться как «сердцебиение».
Corosync — программный продукт, который позволяет создавать единый кластер из нескольких аппаратных или виртуальных серверов. Corosync отслеживает и передает состояние всех участников (нод) в кластере.
Этот продукт позволяет:
- мониторить статус приложений;
- оповещать приложения о смене активной ноды в кластере;
- отправлять идентичные сообщения процессам на всех нодах;
- предоставлять доступ к общей базе данных с конфигурацией и статистикой;
- отправлять уведомления об изменениях, произведенных в базе.
Pacemaker — менеджер ресурсов кластера. Он позволяет использовать службы и объекты в рамках одного кластера из двух или более нод. Вот вкратце его достоинства:
- позволяет находить и устранять сбои на уровне нод и служб;
- не зависит от подсистемы хранения: можем забыть общий накопитель, как страшный сон;
- не зависит от типов ресурсов: все, что можно прописать в скрипты, можно кластеризовать;
- поддерживает STONITH (Shoot-The-Other-Node-In-The-Head), то есть умершая нода изолируется и запросы к ней не поступают, пока нода не отправит сообщение о том, что она снова в рабочем состоянии;
- поддерживает кворумные и ресурсозависимые кластеры любого размера;
- поддерживает практически любую избыточную конфигурацию;
- может автоматически реплицировать конфиг на все узлы кластера — не придется править все вручную;
- можно задать порядок запуска ресурсов, а также их совместимость на одном узле;
- поддерживает расширенные типы ресурсов: клоны (когда ресурс запущен на множестве узлов) и дополнительные состояния (master/slave и подобное) — актуально для СУБД (MySQL, MariaDB, PostgreSQL, Oracle);
- имеет единую кластерную оболочку CRM с поддержкой скриптов.
Идея заключается в том, что с помощью Corosync мы построим кластер, а следить за его состоянием будем с помощью Pacemaker.
Установка
Создадим или откроем файл с описанием репозиториев
# vi /etc/yum.repos.d/centos.repo
и добавим в него следующее:
[centos-7-base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
enabled=1
После нужно обновить список пакетов
# yum update -y
Теперь можно устанавливать Pacemaker и связанные с его работой компоненты
yum install -y python3-devel ruby-devel gcc libffi-devel libffi-dev fontconfig coreutils rubygems gcc-c++ wget
yum install -y pacemaker pcs resource-agents corosync
Проверяем пользователя hacluster (Pacemaker) и меняем пароль:
1 |
<span class="pln"><strong>cat </strong></span><strong><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">passwd </span><span class="pun">|</span><span class="pln"> grep hacluster</span></strong> |
hacluster:x:189:189:cluster user:/home/hacluster:/sbin/nologin
Зададим пароль для учетной записи hacluster (она была создана автоматически при установке Pacemaker)
# passwd hacluster
Разрешим автоматический запуск сервиса
# systemctl enable pcsd
И запустим его
# systemctl start pcsd
Pacemaker установлен и готов к настройке.
Проверить состояние pacemaker командой:
# systemctl status pcsd
Посмотреть состояние кластера:
pcs status
Настраиваем время.
Необходимо, чтобы на всех нодах было одинаковое время.
Устанавливаем утилиту для синхронизации даты и времени:
yum install ntpdate
Настраиваем синхронизацию по расписанию:
crontab -e
0 0 * * * /usr/sbin/ntpdate ru.pool.ntp.org
Выставляем нужный часовой пояс:
cp /usr/share/zoneinfo/Asia/Bishkek /etc/localtime
Синхронизируем время:
ntpdate ru.pool.ntp.org
Добавляем в hosts наши ноды
cat /etc/hosts
192.168.1.170 node1
192.168.1.172 node2
авторизовываемся на серверах следующей командой
pcs cluster auth node1 node2 -u hacluster
Password:
node1: Authorized
node2: Authorized
где node1 и node2 — имена серверов, hacluster — служебная учетная запись (создана автоматически при установке пакетов).
Создаем кластер:
pcs cluster setup --force --name NLB node1 node2
* где NLB — название для кластера; node1 и node2 — серверы, которые должны входить в кластер.
После успешного выполнения команды мы увидим, примерно, следующее:
pcs cluster setup --force --name NLB node1 node2
Destroying cluster on nodes: node1, node2…
node1: Stopping Cluster (pacemaker)…
node2: Stopping Cluster (pacemaker)…
node2: Successfully destroyed cluster
node1: Successfully destroyed cluster
Sending 'pacemaker_remote authkey' to 'node1', 'node2'
node1: successful distribution of the file 'pacemaker_remote authkey'
node2: successful distribution of the file 'pacemaker_remote authkey'
Sending cluster config files to the nodes…
node1: Succeeded
node2: Succeeded
Synchronizing pcsd certificates on nodes node1, node2…
node1: Success
node2: Success
Restarting pcsd on the nodes in order to reload the certificates…
node1: Success
node2: Success
* также, будет создан конфигурационный файл /etc/corosync/corosync.conf.
Разрешаем автозапуск и запускаем созданный кластер:
pcs cluster enable --all
pcs cluster start --all
pcs cluster enable --all
node1: Cluster Enabled
node2: Cluster Enabled
pcs cluster start --all
node1: Starting Cluster (corosync)…
node2: Starting Cluster (corosync)…
node1: Starting Cluster (pacemaker)…
node2: Starting Cluster (pacemaker)…
опция --all говорит, что необходимо выполнить команду для всех нод, к которым мы подключились (вместо этой опции можно перечислить ноды вручную).
При использовании двух нод включаем stonith. Он нужен для «добивания» серверов, которые не смогли полностью завершить рабочие процессы. Игнорируем кворум.
pcs property set stonith-enabled=true
pcs property set no-quorum-policy=ignore
Просмотреть состояние можно командой:
pcs status
вывод будет следующим:
pcs status
Cluster name: NLB
WARNINGS:
No stonith devices and stonith-enabled is not false
Stack: corosync
Current DC: node2 (version 1.1.19-8.el7_6.4-c3c624ea3d) - partition with quorum
Last updated: Sun Apr 28 18:22:47 2019
Last change: Sun Apr 28 18:22:19 2019 by root via cibadmin on node1
2 nodes configured
0 resources configured
Online: [ node1 node2 ]
No resources
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
Настройка виртуального IP
Рассмотрим самый распространенный вариант использования Pacemaker. Он заключается в использовании виртуального IP-адреса, который будет назначаться активному узлу кластера.
Для этого создаем ресурс командой:
pcs resource create virtual_ip ocf:heartbeat:IPaddr2 ip=192.168.1.180 cidr_netmask=24 op monitor interval=30s
* где virtual_ip — название ресурса (может быть любым);192.168.1.180 — виртуальный IP, который будет назначен кластеру; 24 — префикс сети (соответствует маске 255.255.255.0); 30s — критическое время простоя, которое будет означать недоступность узла.
pcs status resources
virtual_ip (ocf::heartbeat:IPaddr2): Stopped
pcs status
Cluster name: NLB
WARNINGS:
No stonith devices and stonith-enabled is not false
Stack: corosync
Current DC: node2 (version 1.1.19-8.el7_6.4-c3c624ea3d) - partition with quorum
Last updated: Sun Apr 28 19:41:33 2019
Last change: Sun Apr 28 19:39:55 2019 by root via cibadmin on node1
2 nodes configured
1 resource configured
Online: [ node1 node2 ]
Full list of resources:
virtual_ip (ocf::heartbeat:IPaddr2): Stopped
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
Чтобы удалить ресурс используем команду:
pcs resource delete
Запустить ресурс и вернуть в обычное состояние:
pcs resource enable resource_id
Удалить ресурс:
pcs resource delete virtual_ip
Статус по ресурсам:
pcs resource show --full
Чтобы удалить ноду из кластера, воспользуйся командой
pcs cluster node remove <node_name>.
Если не стартует ресурс то запустим с дебагом:
pcs resource debug-start virtual_ip
проверяем что виртуальный ip появился:
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:9f:d1:3d brd ff:ff:ff:ff:ff:ff
inet 192.168.1.170/24 brd 192.168.1.255 scope global enp0s3
valid_lft forever preferred_lft forever
inet 192.168.1.180/24 brd 192.168.1.255 scope global secondary enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe9f:d13d/64 scope link
valid_lft forever preferred_lft forever
Если статус stop
pcs resource show
virtual_ip (ocf::heartbeat:IPaddr2): Stopped
выполняем команду:
pcs property set stonith-enabled=false
проверяем:
pcs resource show
virtual_ip (ocf::heartbeat:IPaddr2): Started node1
чтобы смигрировать IP адрес выполняем:
pcs resource move virtual_ip node2
pcs status
Cluster name: NLB
Stack: corosync
Current DC: node2 (version 1.1.19-8.el7_6.4-c3c624ea3d) - partition with quorum
Last updated: Sun Apr 28 23:22:57 2019
Last change: Sun Apr 28 23:22:55 2019 by root via crm_resource on node1
2 nodes configured
1 resource configured
Online: [ node1 node2 ]
Full list of resources:
virtual_ip (ocf::heartbeat:IPaddr2): Started node2
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
Отказоустойчивость сервисов
Кластеризация по виртуальному IP-адресу позволит обеспечить высокую доступность на уровне работы сервера. Но если необходимо более тонкая настройка, позволяющая менять активную ноду при отказе службы, выполняем действия, описанные ниже.
Список всех поддерживаемых сервисов можно посмотреть командой:
crm_resource --list-agents ocf
Разберем кластеризацию на базе postfix.
Подключаемся к кластеру и создаем следующий ресурс:
pcs cluster auth node1 node2 -u hacluster
pcs resource create postfix ocf:heartbeat:postfix op monitor interval=30s timeout=60s
Удаление ноды
При необходимости исключить одну из нод кластера, выполняем следующую команду:
pcs cluster node remove node_name
* где node_name — имя узла, который хотим удалить.
Добавим nginx как ресурс и запрашиваем статус кластера
pcs resource create nginx ocf:heartbeat:nginx op monitor interval=30s timeout=60s
pcs status
Full list of resources:
virtual_ip (ocf::heartbeat:IPaddr2): Started ha-node1
nginx (ocf::heartbeat:nginx): Started ha-node1
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
Выключаем первую ноду на несколько минут. Запрашиваем статус второй ноды, чтобы убедиться, что первая недоступна.
Full list of resources:
virtual_ip (ocf::heartbeat:IPaddr2): Started node2
nginx (ocf::heartbeat:nginx): Started node2
Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
Как только первая нода будет доступна, вручную переключаем на нее виртуальный IP и nginx командой
1 2 |
<strong><code><span class="pln">pcs resource move virtual_ip </span><span class="pln">node1</span><span class="pln"> pcs resource move nginx </span><span class="pln">node1</span></code></strong> |
Осталось запросить статус кластера и убедиться, что адрес присвоен первой ноде.
1 |
<span class="pln"><strong>pcs resource show</strong></span> |
virtual_ip (ocf::heartbeat:IPaddr2): Started node1
Список всех поддерживаемых сервисов можно посмотреть c помощью команды
crm_resource --list-agents ocf
На обеих нодах должен быть установлен и настроен nginx. Подключаемся к кластеру и создаем следующий ресурс:
1 2 |
<strong><span class="pln">pcs cluster auth </span><span class="pln">node1 </span><span class="pln">node2 </span><span class="pun">-</span></strong><span class="pln"><strong>u hacluster</strong> <strong>pcs resource create nginx ocf</strong></span><strong><span class="pun">:</span><span class="pln">heartbeat</span><span class="pun">:</span><span class="pln">nginx op monitor interval</span><span class="pun">=</span><span class="lit">30s</span><span class="pln"> timeout</span><span class="pun">=</span></strong><span class="lit"><strong>30s</strong></span> |
Здесь мы создаем ресурс из службы, которая будет каждые 30 секунд проверяться, и в случае минутного тайм-аута ресурс будет включен на другой ноде.