Целью данной инструкции является организация отказоустойчивости телефонии с использованием резервного сервера и виртуального плавающего 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 {
admin@example.com
}
notification_email_from example-server@example.com
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/ root@192.168.0.2:/etc/asterisk/
Результатом выполнения приведенных выше настроек мы получим отказоустойчивый кластер телефонии.
В случае неполадок с основным сервером или сбоя Asterisk, виртуальный IP будет мигрировать на резервный сервер с автоматическим запуском Asterisk. При восстановлении работоспособности основного сервера на резервном Asterisk будет остановлен, а адрес вернется к MASTER серверу.
