Пример настройки кластера 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;
}
}
Создаём 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
Остались вопросы?
Я - Компаниец Никита, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.
категории
- DECT
- Linux
- Вспомогательный софт при работе с Asterisk
- Интеграция с CRM и другими системами
- Интеграция с другими АТС
- Использование Elastix
- Использование FreePBX
- Книга
- Мониторинг и траблшутинг
- Настройка Asterisk
- Настройка IP-телефонов
- Настройка VoIP-оборудования
- Новости и Статьи
- Подключение операторов связи
- Разработка под Asterisk
- Установка Asterisk
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 сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.
База знаний
IP-АТС
Оборудование
О нас




