+7 495 230 03 03 8 800 222 50 03
DevOps

Настройка кластера Asterisk с использованием VRRP

Целью данной инструкции является организация отказоустойчивости телефонии с использованием резервного сервера и виртуального плавающего 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 серверу.

Дата публикации: 11 января 2021
Не нашли ответа на свой вопрос?

Смотрите также

Обсуждение материала

Содержание

Заказать звонок

Оставьте свои данные для того, чтобы специалист с вами связался.

*нажимая на кнопку, Вы даете согласие на обработку персональных данных
Быстрое внедрение включает:
На сервере установлено следующее ПО (доступно при подключении по протоколу RDP):
Также настроено:
Перед внедрением клиент предоставляет информацию о пользователях (логины и пароли). После завершения работ, клиенту высылается инструкция и ярлык для подключения.
Индивидуальное внедрение по ТЗ клиента обсуждается отдельно.