Анастасия Грушко
12.08.2026
156

Пример настройки кластера Pacemaker + DRBD

В этом примере разберем как настроить отказойстойчивый кластер с помощью более продвинутых утилит Pacemaker + DRBD

В инструкции используются следующие параметры узлов кластера:
Узел 1
Имя хоста: pbx-1
IP-адрес на eth0: 192.168.77.101/24
IP-адрес на eth1: 10.255.255.1/30
Раздел жёсткого диска для DRBD: /dev/sdb1

Узел 2
Имя хоста: pbx-2
IP-адрес на eth0: 192.168.77.102/24
IP-адрес на eth1: 10.255.255.2/30
Раздел жёсткого диска для DRBD: /dev/sdb1

IP-адрес кластера на eth0:0: 192.168.77.100/24

Для настройки кластера использовались следующие версии программного обеспечения:

Corosync Cluster Engine, version ‘3.1.8’

DRBD Version: 9.29.0 (api:2)

Pacemaker 2.1.7-5.2.el8_10

Один из примеров, как поставить DRBD из исходников https://voxlink.ru/kb/linux/ustanovka-i-nastrojka-drbd9-iz-ishodnikov/

Также на сайте Voxlink можно найти примеры как поставить другие необходимые утилиты.

Настройка сети

В сетевые настройки на интерфейсах eth0 необходимо добавить параметр METRIC=100 он нужен для того, чтобы основной шлюз, добавляемый кластером, имел строго больший приоритет, чем основной шлюз, добавляемый при загрузке системы 

На обоих узлах кластера дописываем в /etc/hosts новые имена.
Для обозначения узлов в кластере будут использоваться дополнительные имена pbx-1no и pbx-2no (ссылаются на IP-адреса прямого линка)

192.168.77.101 pbx-1
192.168.77.102 pbx-2
10.255.255.1 pbx-1no
10.255.255.2 pbx-2no

Узлы кластера должны принимать друг от друга пакеты на порты TCP:2224, TCP:7789 и UDP:5405, не забываем про фаервол.

Настройка DRBD

При развёртывании кластера на VMWare обязательна установка VMWare Tools перед настройкой LVM. Если VMWare Tools не установить, LVM-разделы пропадут после перезагрузки.

В инструкции выбран раздел на новом диске /dev/sdb1 для репликации данных.  Если диск новый, необходимо на нем создать новый раздел.

Диск должен быть одинакового размера на обоих узлах кластера.

Блочное устройство будем делать на LVM.

Нижеприведенные команды выполнить на обоих узлах кластера:

pvcreate /dev/sdb1
vgcreate vg_drbd /dev/sdb1
lvcreate —name lv_drbd —extents 100%FREE vg_drbd

В качестве DRBD-раздела на каждом узле будет использоваться LVM раздел /dev/vg_drbd/lv_drbd

На обоих узлах кластера создадим конфигурационный файл ресурса DRBD /etc/drbd.d/asterisk_DRBD.res

resource asterisk_DRBD {

        handlers {

                split-brain "/usr/lib/drbd/notify-split-brain.sh root";

        }

        disk {

                # 100 Mbit link

                resync-rate 4M;

                ## 1000 Mbit link

                #resync-rate 30M;

                ##отключает умное предсказание скорости, использовать установленное значение                 
                c-plan-ahead 0;

                on-io-error detach;

        }

        net {

                protocol C;

                after-sb-0pri discard-least-changes;

                after-sb-1pri consensus;

                after-sb-2pri call-pri-lost-after-sb;

                cram-hmac-alg "sha1";
                #Нижеуказанный пароль должен быть одинаковым на обоих узлах кластера

                shared-secret "JYB3R-Q9_9HBZalbA0";

        }

        on pbx-1 {

                device /dev/drbd0;

                disk /dev/vg_drbd/lv_drbd;

                address 10.255.255.1:7789;

                meta-disk internal;

        }

        on pbx-2 {

                device /dev/drbd0;

                disk /dev/vg_drbd/lv_drbd;

                address 10.255.255.2:7789;

                meta-disk internal;

        }

}

ВНИМАНИЕ! Имя хоста сервера должно совпадать с именем указанным в конфигурационном файле выше (on pbx-1 и on pbx-2). При запуске DRBD смотрит, какой hostname на узле и его же ищет в конфигурационном файле.

Создаём DRBD-ресурс и запускаем службу drbd на обоих узлах

drbdadm create-md asterisk_DRBD

systemctl start drbd

Переводим DRBD-ресурс в режим основного на pbx-1

drbdadm primary —force asterisk_DRBD

Проверяем статус DRBD

cat /sys/kernel/debug/drbd/resources/asterisk_DRBD/connections/pbx-2/0/proc_drbd

Статус синхронизации данных на блочном устройстве

Создаём точку монтирования для /dev/drbd0 на обоих узлах

mkdir /mnt/drbd0

Форматируем и монтируем /dev/drbd0 на узле, который сделали основным

mkfs.ext4 -m 0 /dev/drbd0

mount /dev/drbd0 /mnt/drbd0

Перенос данных на DRBD-раздел

Перед началом работы необходимо остановить все службы на обоих узлах

systemctl stop httpd
systemctl disable httpd

systemctl stop mariadb
systemctl disable mariadb

systemctl stop asterisk
systemctl disable asterisk

systemctl stop dahdi
systemctl disable dahdi

systemctl stop tftp.socket
systemctl disable tftp.socket

systemctl stop freepbx_ucp
systemctl disable freepbx_ucp

systemctl stop freepbx_fastagi
systemctl disable freepbx_fastagi

Теперь можно переносить данные в DRBD-раздел на узле, который сделали основным (в нашем случае pbx-1).

mkdir -p /mnt/drbd0/var/{lib,spool} /mnt/drbd0/etc/httpd

##/var/lib/mysql
rsync -XAar /var/lib/mysql /mnt/drbd0/var/lib/
rm -rf /var/lib/mysql
ln -s /mnt/drbd0/var/lib/mysql /var/lib/mysql

##/var/lib/asterisk
rsync -XAar /var/lib/asterisk /mnt/drbd0/var/lib/
rm -rf /var/lib/asterisk
ln -s /mnt/drbd0/var/lib/asterisk /var/lib/asterisk

##/var/spool/asterisk
rsync -XAar /var/spool/asterisk /mnt/drbd0/var/spool/
rm -rf /var/spool/asterisk
ln -s /mnt/drbd0/var/spool/asterisk /var/spool/asterisk

##/etc/asterisk
rsync -XAar /etc/asterisk /mnt/drbd0/etc/
rm -rf /etc/asterisk
ln -s /mnt/drbd0/etc/asterisk /etc/asterisk

##/etc/dahdi
rsync -XAar /etc/dahdi /mnt/drbd0/etc/
rm -rf /etc/dahdi
ln -s /mnt/drbd0/etc/dahdi /etc/dahdi

##/etc/amportal.conf
rsync -XAar /etc/amportal.conf /mnt/drbd0/etc/
rm -f /etc/amportal.conf
ln -s /mnt/drbd0/etc/amportal.conf /etc/amportal.conf

##/etc/freepbx.conf
rsync -XAar /etc/freepbx.conf /mnt/drbd0/etc/
rm -f /etc/freepbx.conf
ln -s /mnt/drbd0/etc/freepbx.conf /etc/freepbx.conf

##/etc/httpd/conf*
rsync -XAar /etc/httpd/conf* /mnt/drbd0/etc/httpd/
rm -rf /etc/httpd/conf*
ln -s /mnt/drbd0/etc/httpd/conf /etc/httpd/conf
ln -s /mnt/drbd0/etc/httpd/conf.d /etc/httpd/conf.d
ln -s /mnt/drbd0/etc/httpd/conf.modules.d /etc/httpd/conf.modules.d

##/var/lib/php
rsync -XAar /var/opt/remi/php56/lib/php /mnt/drbd0/var/lib/
rm -rf /var/opt/remi/php56/lib/php
ln -s /mnt/drbd0/var/lib/php /var/opt/remi/php56/lib/php

##/var/www
rsync -XAar /var/www /mnt/drbd0/var/
rm -rf /var/www
ln -s /mnt/drbd0/var/www /var/www

##/tftpboot
rsync -XAar /tftpboot /mnt/drbd0/
rm -rf /tftpboot
ln -s /mnt/drbd0/tftpboot /tftpboot

На резервном узле удалите те же директории и создайте символьные ссылки на них 

##/var/lib/mysql
rm -rf /var/lib/mysql
ln -s /mnt/drbd0/var/lib/mysql /var/lib/mysql

##/var/lib/asterisk
rm -rf /var/lib/asterisk
ln -s /mnt/drbd0/var/lib/asterisk /var/lib/asterisk

##/var/spool/asterisk
rm -rf /var/spool/asterisk
ln -s /mnt/drbd0/var/spool/asterisk /var/spool/asterisk

##/etc/asterisk
rm -rf /etc/asterisk
ln -s /mnt/drbd0/etc/asterisk /etc/asterisk

##/etc/dahdi
rm -rf /etc/dahdi
ln -s /mnt/drbd0/etc/dahdi /etc/dahdi

##/etc/amportal.conf
rm -f /etc/amportal.conf
ln -s /mnt/drbd0/etc/amportal.conf /etc/amportal.conf

##/etc/freepbx.conf
rm -f /etc/freepbx.conf
ln -s /mnt/drbd0/etc/freepbx.conf /etc/freepbx.conf

##/etc/httpd/conf*
rm -rf /etc/httpd/conf*
ln -s /mnt/drbd0/etc/httpd/conf /etc/httpd/conf
ln -s /mnt/drbd0/etc/httpd/conf.d /etc/httpd/conf.d
ln -s /mnt/drbd0/etc/httpd/conf.modules.d /etc/httpd/conf.modules.d

##/var/lib/php
rm -rf /var/opt/remi/php56/lib/php
ln -s /mnt/drbd0/var/lib/php /var/opt/remi/php56/lib/php

##/var/www
rm -rf /var/www
ln -s /mnt/drbd0/var/www /var/www

##/tftpboot
rm -rf /tftpboot
ln -s /mnt/drbd0/tftpboot /tftpboot

Дождитесь завершения синхронизации DRBD. Размонтируйте /mnt/drbd0 на основном узле и переведите его в состояние резервного.

 umount /mnt/drbd0

drbdadm secondary asterisk_DRBD

После чего нужно остановить DRBD сервис на обоих узлах. В дальнейшем им будет управлять Pacemaker

systemctl stop drbd

Настройка связки pcsd + Pacemaker + Corosync

Corosync — обмен сообщениями между узлами кластера
Pacemaker — управление ресурсами кластера
pcsd — более удобные инструменты для настройки и управления Pacemaker

Для работы pcsd нужно задать пароль для пользователя hacluster — этот пользователь уже есть в системе, он был создан при установке Pacemaker. На обоих узлах кластера пароль пользователя hacluster должен быть одинаковым.

Включите автозапуск и запустите pcsd на обоих узлах кластера

systemctl enable pcsd
systemctl start pcsd

Выполните следующую команду на первом сервере, чтобы pcsd аутентифицировался на обоих узлах кластера

pcs host auth pbx-1no pbx-2no -u hacluster -p «<пароль пользователя hacluster>»

Создание изначальных конфигов кластера

Следющая команда сгенерирует изначальные конфиги для Corosync и Pacemaker (/etc/corosync/corosync.conf и /var/lib/pacemaker/cib/cib.xml). Выполнить ее на первом сервере.

pcs cluster setup PBX pbx-1no pbx-2no

Донастройка Corosync перед первым запуском

В сгенерированный конфиг /etc/corosync/corosync.conf нужно добавить параметр token на обоих узлах (содержимое /etc/corosync/corosync.conf идентично на обоих узлах)

totem {

    version: 2

    cluster_name: PBX

    transport: knet

    crypto_cipher: aes256

    crypto_hash: sha256

    cluster_uuid: ad3366d9f2db4ddeaaed15fe2fb17dbb

    token: 10000

}

nodelist {

    node {

        ring0_addr: pbx-1no

        name: pbx-1no

        nodeid: 1

    }

    node {

        ring0_addr: pbx-2no

        name: pbx-2no

        nodeid: 2

    }

}

quorum {

    provider: corosync_votequorum

    two_node: 1

}

logging {

    to_logfile: yes

    logfile: /var/log/cluster/corosync.log

    to_syslog: yes

    timestamp: on

}

Добавляем corosync в автозагрузку

Systemctl enable corosync

Первый запуск служб кластера и включение автозапуска

Запускаем службы кластера, выполняем на первом сервере

pcs cluster start —all

Включаем автозапуск всех служб кластера (достаточно выполнить только на одном узле)

pcs cluster enable —all

Отключаем кворум (т.к. у нас только два узла)

pcs property set no-quorum-policy=ignore

Заставляем ресурсы оставаться на узле, на котором они запущены (т.е. предотвращаем автоматический возврат ресурсов на узел, на котором они были запущены раньше)

pcs resource defaults update resource-stickiness=100

Отключаем STONITH

pcs property set stonith-enabled=false

Ниже описанные действия выполнить на узле pbx-1 (можно на любом одном)

Выгружаем текущие настройки Pacemaker в файл /tmp/new_cib_cfg

rm -f /tmp/new_cib_cfg
pcs cluster cib /tmp/new_cib_cfg

Все изменения будут внесены в файл /tmp/new_cib_cfg, а затем разом загружены в Pacemaker

DRBD (основной ресурс — PBX_DRBD_master)

pcs -f /tmp/new_cib_cfg resource create PBX_DRBD ocf:linbit:drbd drbd_resource=asterisk_DRBD \

                op monitor interval=10s timeout=20s role=Master on-fail=restart \

                op monitor interval=20s timeout=20s role=Slave on-fail=restart \

                op start timeout=240s on-fail=restart \

                op stop timeout=100s on-fail=block

pcs -f /tmp/new_cib_cfg resource promotable PBX_DRBD PBX_DRBD_master promoted-max=1 promoted-node-max=1 clone-max=2 clone-node-max=1 notify=true

Файловая система на DRBD-разделе (ресурс PBX_FS)

pcs -f /tmp/new_cib_cfg resource create PBX_FS ocf:heartbeat:Filesystem device=/dev/drbd0 directory=/mnt/drbd0 fstype=ext4 \

                op monitor interval=20s timeout=40s on-fail=restart \

                op start timeout=60s on-fail=restart \

                op stop timeout=60s on-fail=block

IP-адрес кластера

pcs -f /tmp/new_cib_cfg resource create PBX_IP ocf:heartbeat:IPaddr2 ip=192.168.77.100 cidr_netmask=24 nic=eth0 iflabel=0 \

                op monitor interval=10s timeout=20s on-fail=restart \

                op start timeout=20s on-fail=restart \

                op stop timeout=20s on-fail=block

Шлюз по умолчанию

pcs -f /tmp/new_cib_cfg resource create PBX_ROUTE_default ocf:heartbeat:Route destination=0.0.0.0/0 gateway=192.168.77.1 source=192.168.77.100 family=ip4 \

                op monitor interval=10s timeout=20s on-fail=restart \

                op start timeout=20s on-fail=restart \

                op stop timeout=20s on-fail=ignore

MariaDB

pcs -f /tmp/new_cib_cfg resource create PBX_mariadb systemd:mariadb.service \

                op monitor interval=100s timeout=60s on-fail=ignore \

                op start timeout=100s on-fail=ignore \

                op stop timeout=100s on-fail=ignore

Apache

pcs -f /tmp/new_cib_cfg resource create PBX_httpd systemd:httpd.service \

                op monitor interval=100s timeout=60s on-fail=ignore \

                op start timeout=100s on-fail=ignore \

                op stop timeout=100s on-fail=ignore

freepbx_ucp

pcs -f /tmp/new_cib_cfg resource create PBX_freepbx_ucp systemd:freepbx_ucp.service \

                op monitor interval=100s timeout=60s on-fail=ignore \

                op start timeout=100s on-fail=ignore \

                op stop timeout=100s on-fail=ignore

freepbx_fastagi

pcs -f /tmp/new_cib_cfg resource create PBX_freepbx_fastagi systemd:freepbx_fastagi.service \

                op monitor interval=100s timeout=60s on-fail=ignore \

                op start timeout=100s on-fail=ignore \

                op stop timeout=100s on-fail=ignore

DAHDI

pcs -f /tmp/new_cib_cfg resource create PBX_dahdi systemd:dahdi.service \

                op monitor interval=100s timeout=60s on-fail=ignore \

                op start timeout=100s on-fail=ignore \

                op stop timeout=100s on-fail=ignore

Asterisk

pcs -f /tmp/new_cib_cfg resource create PBX_asterisk systemd:asterisk.service \

                op monitor interval=100s timeout=60s on-fail=ignore \

                op start timeout=100s on-fail=ignore \

                op stop timeout=100s on-fail=ignore

TFTP

pcs -f /tmp/new_cib_cfg resource create PBX_tftp systemd:tftp.socket \

                op monitor interval=100s timeout=60s on-fail=ignore \

                op start timeout=100s on-fail=ignore \

                op stop timeout=5s on-fail=ignore

Ограничения на ресурсы


Данные ограничения нужны для того, чтобы все ресурсы находились на одном узле, а также запускались в определённом порядке

pcs -f /tmp/new_cib_cfg constraint colocation add PBX_FS with PBX_DRBD_master INFINITY with-rsc-role=Master
pcs -f /tmp/new_cib_cfg constraint colocation add PBX_IP with PBX_FS INFINITY
pcs -f /tmp/new_cib_cfg constraint order promote PBX_DRBD_master then start PBX_FS
pcs -f /tmp/new_cib_cfg constraint order PBX_FS then PBX_IP
pcs -f /tmp/new_cib_cfg constraint colocation add PBX_ROUTE_default with PBX_IP INFINITY
pcs -f /tmp/new_cib_cfg constraint order PBX_IP then PBX_ROUTE_default
pcs -f /tmp/new_cib_cfg constraint colocation add PBX_dahdi with PBX_FS INFINITY
pcs -f /tmp/new_cib_cfg constraint colocation add PBX_asterisk with PBX_FS INFINITY
pcs -f /tmp/new_cib_cfg constraint order PBX_FS then PBX_dahdi
pcs -f /tmp/new_cib_cfg constraint order PBX_dahdi then PBX_asterisk
pcs -f /tmp/new_cib_cfg constraint colocation add PBX_mariadb with PBX_FS INFINITY
pcs -f /tmp/new_cib_cfg constraint colocation add PBX_httpd with PBX_FS INFINITY
pcs -f /tmp/new_cib_cfg constraint order PBX_FS then PBX_mariadb
pcs -f /tmp/new_cib_cfg constraint order PBX_mariadb then PBX_httpd
pcs -f /tmp/new_cib_cfg constraint colocation add PBX_tftp with PBX_FS INFINITY
pcs -f /tmp/new_cib_cfg constraint order PBX_FS then PBX_tftp
pcs -f /tmp/new_cib_cfg constraint colocation add PBX_freepbx_ucp with PBX_FS INFINITY
pcs -f /tmp/new_cib_cfg constraint colocation add PBX_freepbx_fastagi with PBX_FS INFINITY
pcs -f /tmp/new_cib_cfg constraint order PBX_mariadb then PBX_freepbx_ucp
pcs -f /tmp/new_cib_cfg constraint order PBX_asterisk then PBX_freepbx_ucp
pcs -f /tmp/new_cib_cfg constraint order PBX_freepbx_ucp then PBX_freepbx_fastagi

Загружаем полученный файл

pcs cluster cib-push /tmp/new_cib_cfg

Проверяем работу ресурсов

pcs status

Удаление всех ресурсов в случае возникновения проблем с их добавлением

Если при добавлении ресурсов были допущены ошибки или возникли какие-либо проблемы, можно удалить все ресурсы из кластера командами, приведёнными ниже, затем выполнить добавление сначала

pcs resource delete PBX_tftp
pcs resource delete PBX_freepbx_ucp
pcs resource delete PBX_freepbx_fastagi
pcs resource delete PBX_httpd
pcs resource delete PBX_mariadb
pcs resource delete PBX_asterisk
pcs resource delete PBX_dahdi
pcs resource delete PBX_ROUTE_default
pcs resource delete PBX_IP
pcs resource delete PBX_FS
pcs resource delete PBX_DRBD_master

Ручное переключение на другой узел

pcs node standby pbx-1no

Узел в статусе standby вообще не запускает ресурсы, нужно обязательно вывести его из статуса standby, когда он передаст все ресурсы

Второй способ — pcs resource move

pcs resource move PBX_FS pbx-2no

Телефонная книга CallMetrix
Корпоративный телефонный справочник для удобной связи между сотрудниками организации
Скачать описание CallMetrix
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

Остались вопросы?

Я - Компаниец Никита, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

Заказать звонок
Отправить сообщение
Заявка на расчет проекта

VoIP оборудование


ближайшие курсы

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.