Целью данной инструкции является организация отказоустойчивости телефонии с использованием резервного сервера и виртуального плавающего IP адреса.
Настройку будем проводить на двух серверах CentOS 7 с уже установленным Asterisk.
Выделено три IP адреса:
- 192.168.0.1 и 192.168.0.2 – реальные адреса серверов;
- 192.168.0.3 – виртуальный плавающий адрес для кластера телефонии.
Первым делом установим на обе машины keepalived:
yum -y install keepalived
или же с исходников:
cd ~ wget https://www.keepalived.org/software/keepalived-2.1.5.tar.gz tar xzvf keepalived* cd keepalived* ./configure make sudo make instal
Не забываем добавить сервис в автозагрузку системы:
systemctl enable keepalived
Сервис ищет конфигурации в каталоге /etc/keepalived:
mkdir -p /etc/keepalived
Переходим непосредственно к самим конфигурационным файлам:
vim /etc/keepalived/keepalived.conf
1) Настройка на основном сервере
vrrp_script asterisk_self { script "/usr/bin/killall -0 asterisk" interval 2 fall 3 rise 2 weight -20 } vrrp_instance MSK-VoIP-Main { state MASTER interface eth01 virtual_router_id 10 priority 101 unicast_src_ip 192.168.0.1 unicast_peer { 192.168.0.2 } advert_int 1 authentication { auth_type PASS auth_pass qwerty123 } virtual_ipaddress { 192.168.0.3/24 } track_script { asterisk_self } notify "/opt/keepalive_state.sh" }
Параметр weight может принимать как отрицательное, так и положительное значения. У MASTER сервера всегда значение priority, в рамках одного router id, будет более чем у BACKUP. Для корректной миграции IP при выполнении скрипта проверки должна выполняться формула:
priority MASTER (+/-) weight < priority BACKUP
Исключением является использование параметра nopreempt - означает, что если мастер пропал из сети, и был выбран новый мастер с меньшим приоритетом, то по возвращении старшего мастера, он останется в состоянии BACKUP. Т. е. если вы перезагрузили мастер, то он больше мастером не станет, пока новый мастер не отвалится. Если вы предпочитаете, чтобы мастером был какой-то конкретный сервер, то замените настройку nopreempt на preempt_delay.
2) Настройка на бекап-сервере
Настройка на второй мы не используем скрипт мониторинга. Изначально на резервном сервере статус устанавливается BACKUP и значение priority меньше чем на MASTER. Для unicast запросов меняем местами IP адреса. В остальном все аналогично мастеру.
vrrp_instance MSK-VoIP-Rezerv { state BACKUP interface ens4 virtual_router_id 10 priority 99 unicast_src_ip 192.168.0.2 unicast_peer { 192.168.0.1 } advert_int 1 authentication { auth_type PASS auth_pass qwerty123 } virtual_ipaddress { 192.168.0.3/24 } notify "/opt/keepalive_state.sh" }
При необходимости в /etc/keepalived/keepalived.conf возможно добавить отправку уведомлений на почту
notification_email { [email protected] } notification_email_from [email protected] smtp_server 10.5.5.25 smtp_connect_timeout 30 router_id LVS_DEVEL }
Скрипт keepalive_state.sh в зависимости от состояния keepalived выполняет запуск или остановку Asterisk.
Собственно, сам код:
#!/bin/bash TYPE=$1 NAME=$2 STATE=$3 case $STATE in "MASTER") /etc/init.d/asterisk start exit 0 ;; "BACKUP") /etc/init.d/asterisk stop exit 0 ;; "FAULT") /etc/init.d/asterisk stop exit 0 ;; *) echo "unknown state" exit 1 ;; esac
Даем скрипту право на запуск:
chmod +x /opt/keepalive_state.sh
Добавляем правила в iptables (примеры правил):
- при использовании multicast:
iptables -A INPUT -i eth0 -d 224.0.0.0/8 -j ACCEPT iptables -A INPUT -p vrrp -i eth0 -j ACCEPT
- при использовании unicast:
iptables -A INPUT -i eth0 -d 192.168.0.1/24 -j ACCEPT iptables -A INPUT -p vrrp -i eth0 -j ACCEPT
Настройка со стороны Asterisk заключается только в привязке к нашему виртуальному IP.
vim /etc/asterisk/sip.conf
В секции general указываем:
udpbindaddr=192.168.0.3 tcpbindaddr=192.168.0.3
Также необходимо настроить репликацию настроек Asterisk с основного сервера на резервный. Выполнить это можно с помощью связки утилит cron и rsync, предварительно настроив доступ по ssh между серверами по ключу. Добавляем задачу в cron:
35 00 * * * rsync -av /etc/asterisk/ [email protected]:/etc/asterisk/
Результатом выполнения приведенных выше настроек мы получим отказоустойчивый кластер телефонии.
В случае неполадок с основным сервером или сбоя Asterisk, виртуальный IP будет мигрировать на резервный сервер с автоматическим запуском Asterisk. При восстановлении работоспособности основного сервера на резервном Asterisk будет остановлен, а адрес вернется к MASTER серверу.