Новости
Обзоры и тесты
Техно
Советы
Разное
Главная » Техно

Резервирование Asterisk при помощи Heartbeat и Rsync

Добавлено , 27.08.2012 – 11:22

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

Опыт коллег подсказывает что DRBD для Asterisk является не очень хорошим решением, особенно при интенсивном обмене данными с жестким диском. Rsync, как и DRBD, является бюджетным решением, я бы не рекомендовал их использовать если есть возможность поставить NAS или blade-сервер. Но так как сам Asterisk является зачастую бюджетным решением, вероятно будет использовано подобное решение. Еще одним существенным минусом является невозможность географически распределить систему. Например, чтобы серверы находились в разных дата центрах и соответственно в разных сетях. Теоретически, даже с heartbeat это можно сделать, но потребуется сложная конфигурация. Лучшим решением, в данном случае, будет использование системы предназначенной для работы в такой конфигурации. Итак, идея резервирования заключается в следующем: Есть основной сервер Asterisk, который обрабатывает вызовы, есть резервный сервер, на который через некоторый период времени синхронизируется конфигурация, записи разговоров и CDR записи о вызовах. Синхронизация происходит при помощи скриптов rsync в cron. На сервере запущен heartbeat с общим IP который, в случае отказа сети или сервера (причем отказа наподобие зависания или полного отказа сети), переключает общий shared IP на резервный сервер, стартует Asterisk и связанные с ним сервисы, затем посылает администратору письмо об аварии и отключает автоматическую синхронизацию по cron. Соответственно, после аварии, требуется ручное переключение и синхронизация файлов с резервного на основной сервер (записей разговоров и CDR как минимум). Это тоже можно отнести к минусам решения. Для слежения за доступностью процессов, например Asterisk, я рекомендую использовать Monit. Обращаю внимание, что heartbeat не следит за доступностью процессов.

Итак, процесс развертывания такого решения можно разделить на несколько этапов:

1) Установка необходимого софта на основной и резервный сервер
2) Настройка резервирования на коммутаторах
3) Настройка резервирования сетевых интерфейсов bonding
4) Настройка heartbeat
5) Настройка rsync для asterisk и остальных необходимых сервисов

Установка необходимого софта на основной и резервный сервер

В примере необходимо зарезервировать Asterisk, конфигурация которого хранится на диске /etc/asterisk, записи разговоров абонентов и CDR вызовов, информация о которых хранится в БД MySQL, файлы с веб сервера Apache, файлы webmin.

Asterisk clustering Rsync + heartbeat

Если представить графически, получается такая схема:

Asterisk clustering Rsync + heartbeat

В качестве софта я использовал дистрибутив Thirdlane. Более подробно читайте в

Реализация мульти доменов (multi tenant) на базе Asterisk — Thirdlane

Настройка резервирования на коммутаторах

Если вы резервируете коммутаторы через которые подключаются серверы, то на серверах необходимо создать бондинг (bonding), те объединить два сетевых интерфейса в один логический и указать какой из них является основным, а какой должен быть использован при отказе основного. На основном и резервном серверах должно быть по два сетевых интерфейса. Соответственно первый сетевой интерфейс eth1 подключается к основному коммутатору, а второй eth1 подключается к резервному коммутатору. В примере, в одном бонде находятся два интерфейса в разных VLAN, первый VLAN для внешних интернет-подключений, а второй для сети управления management.
В виде схемы это выглядит так:

Asterisk clustering Rsync + heartbeat

Настройка bonding на сервере NODE1 на примере Debian:

debian:~# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

auto bond0
iface bond0 inet manual
slaves eth0 eth1
bond_mode active-backup
bond_miimon 100
bond_downdelay 200
bond_updelay 200

auto bond0.4
iface bond0.4 inet static
address 84.52.103.46
netmask 255.255.255.224
gateway 84.52.103.51
vlan_raw_device bond0

auto bond0.999
iface bond0.999 inet static
address 10.17.36.14
netmask 255.255.255.192
post-up /sbin/ip r a 10.0.0.0/16 via 172.17.36.62
post-up /sbin/ip r a 10.17.0.0/16 via 10.17.36.62
post-up /sbin/ip r a 10.168.133.0/24 via 10.17.36.62
vlan_raw_device bond0

Такие же настройки, только с другими адресами, будут на NODE2.

Настройка Heartbeat

Устанавливаем пакет heartbeat.

Файл /etc/ha.d/authkeys одинаковый на обоих узлах:

auth 1
1 crc

Файл /etc/ha.d/haresources одинаковый на обоих узлах. В нем определяются ресурсы, которыми должен управлять Heartbeat:

tlane-n1 IPaddr::84.52.103.40/255.255.255.224/eth0 MailTo::user@ucexpert.ru::AsteriskCluster_take_over postfix pbxportal httpd xinetd webmin #mysqld

Файл /etc/ha.d/ha.cf на NODE1:

debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0            # This is deprecated
keepalive 1                   # Interval between heartbeat packets.
deadtime 20                   # How quickly heartbeat determines a dead node.
warntime 10                   # Time heartbeat will issue a late heartbeat.
initdead 40                   # Time delay needed by heartbeat to report a dead node.
udpport 694                   # UDP port heartbeat uses to communicate between nodes.
#ping 192.168.160.103         # Ping virtual host to simulate network resource.
ping 195.52.103.35            # проверка доступности default gateway
#bcast eth1                   # Which interface to use for heartbeat packets.
ucast eth1 10.17.36.15
#auto_failback on             # Auto promotion of primary node upon return to cluster.
auto_failback off
node    tlane-n1
node    tlane-n2
respawn hacluster /usr/lib/heartbeat/ipfail

Файл /etc/ha.d/ha.cf на NODE2:

debugfile /var/log/ha-debug
logfile /var/log/ha-log
logfacility local0            # This is deprecated
keepalive 1                   # Interval between heartbeat packets.
deadtime 20                   # How quickly heartbeat determines a dead node.
warntime 10                   # Time heartbeat will issue a late heartbeat.
initdead 40                   # Time delay needed by heartbeat to report a dead node.
udpport 694                   # UDP port heartbeat uses to communicate between nodes.
#ping 192.168.160.103         # Ping virtual host to simulate network resource.
ping 84.52.103.35             # проверка доступности default gateway
#bcast eth1                   # Which interface to use for heartbeat packets.
ucast eth1 10.17.36.14
#auto_failback on             # Auto promotion of primary node upon return to cluster.
auto_failback off
node    tlane-n1
node    tlane-n2
respawn hacluster /usr/lib/heartbeat/ipfail

Вручную добавлен скрипт, который уведомляет по почте о переключении Heartbeat на резервный сервер и отключает синхронизацию с мастер-сервера.

[root@tlane-n2 ha.d]# cat /etc/ha.d/resource.d/custom-actions
mv /sync-dir.sh /sync-dir.sh_cluster_FAIL!!! # Отключаем автоматическую синхронизацию по cron
echo -e "Subject: Thirdlane MASTER NODE DOWN \n" | sendmail -fuser@ucexpert.ru user@ucexpert.ru # отправляем уведомление о падении основного сервера

Обращаю внимание, что после настройки Heartbeat нужно, чтобы Asterisk слушал только на shared IP:

/etc/asterisk/sip.conf:
[general]
bindport=9966 # необходимо, если вы используете нестандартный порт
;bindaddr=0.0.0.0
bindaddr=195.52.103.40

Выключаем автозапуск сервисов, которыми должен управлять Heartbeat (пример для CentOS):

chkconfig postfix off
chkconfig pbxportal off
chkconfig httpd off
chkconfig xinetd off
chkconfig webmin off

Скрипты для управления кластером Heartbeat находятся в /usr/share/heartbeat.

Для запуска Heartbeat в CentOS:

service heartbeat start

Настройка Rsync

Синхронизация конфигурации выполняется при помощи утилиты rsync.

На первом сервере NODE1 нужно настроить rsync-сервер, с которого клиент rsync на втором узле будет забирать файлы из нужных директорий. Для этого требуется изменить два файла.

Файл /etc/xinetd.d/rsync:

service rsync
{
  disable = no
  socket_type = stream
  wait = no
  user = root
  only_from = 10.36.14 10.17.36.15 localhost
  server = /usr/bin/rsync
  server_args = --daemon
  log_on_failure += USERID
}

Файл /etc/rsyncd.conf:

[root@tlane-n1 /]# cat /etc/rsyncd.conf
log file = /var/log/rsyncd.log
transfer logging = true

# название шары:
[asterisk]
# путь к директории на сервере, которую будем копировать:
path = /etc/asterisk/
# пользователь, от имени которого выполняется копирование:
uid = root
# включаем режим только для чтения:
read only = yes
# разрешить просмотр файлов:
list = yes
comment = Asterisk Directory !!!
# список IP-адресов, с которых разрешен доступ к шаре:
hosts allow = 10.17.36.15, 127.0.0.1
# список пользователей rsyncd, которым разрешен доступ к шаре:
#auth users = tlanen2
# путь к файлу с именами пользователей и паролями:
#secrets file = /etc/rsyncd.scrt

[libasterisk]
path = /var/lib/asterisk
uid = root
read only = yes
list = yes
comment = ASTDB: эту директорию важно синхронизировать не меньше, чем /etc/asterisk
hosts allow = 10.17.36.15, 127.0.0.1
#auth users = tlanen2
#secrets file = /etc/rsyncd.scrt

[monitor]
path = /var/spool/asterisk/monitor
uid = root
read only = yes
list = yes
comment = Audiofiles directory
hosts allow = 10.17.36.15, 127.0.0.1
#auth users = tlanen2
#secrets file = /etc/rsyncd.scrt

[mysqldumps]
path = /home/mysqldumps
uid = root
read only = yes
list = yes
comment = MySQL DB directory
hosts allow = 10.17.36.15, 127.0.0.1
#auth users = tlanen2
#secrets file = /etc/rsyncd.scrt

[webmin]
# путь к папке на сервере, которую будем копировать:
path = /etc/webmin/
# пользователь, от имени которого выполняется копирование:
uid = root
# включаем режим только для чтения:
read only = yes
# разрешить просмотр файлов:
list = yes
comment = Asterisk Directory !!!
# список IP-адресов, с которых разрешен доступ к шаре:
hosts allow = 10.17.36.15, 127.0.0.1
# список пользователей rsyncd, которым разрешен доступ к шаре:
#auth users = tlanen2
# путь к файлу с именами пользователей и паролями:
#secrets file = /etc/rsyncd.scrt

Чтобы применить настройки в CentOS:

service xinetd restart

Также нужны скрипты, которые по расписанию через cron делают дамп нужной базы данных.

Содержимое cron:

30 3 * * * sh /mysqldump.sh # Делаем копию базы данных и iptables каждый день в 03:30

Листинг скрипта mysqldump.sh:

[root@tlane-n1 /]# cat mysqldump.sh
mysqldump -u root -ppassw0rd astcdrdb > /home/mysqldumps/node1-db.sql
cp /etc/sysconfig/iptables /home/mysqldumps/ # iptables копируются вместе с дампом БД

На втором сервере NODE2

Мастер-сервер NODE1, с которого забираются файлы конфигурации, имеет адрес 10.17.36.14. На резервном сервере NODE2 с адресом 10.17.36.15 запускается скрипт, который синхронизируется с мастером каждую ночь в 04:00 по cron:

0 4 * * * sh /sync-dir.sh # Синхронизируем с мастера

Листинг скрипта sync-dir.sh:

#!/bin/sh
# -n - эмуляция процесса синхронизации
#ARM='-n' # эмуляция процесса синхронизации
ARM='' # обычный режим
rsync $ARM -v --recursive --owner --delete --group --update --perms --times --copy-links 10.17.36.14::asterisk /etc/asterisk #> /dev/null 2>&1
rsync $ARM -v --recursive --owner --delete --group --update --perms --times --copy-links 10.17.36.14::libasterisk /var/lib/asterisk #> /dev/null 2>&1
rsync $ARM -v --recursive --owner --delete --group --update --perms --times --copy-links 10.17.36.14::webmin /etc/webmin #> /dev/null 2>&1
rsync $ARM -v --recursive --owner --delete --group --update --perms --times --copy-links 10.17.36.14::monitor /var/spool/asterisk/monitor #> /dev/null 2>&1
rsync $ARM -v --recursive --owner --delete --group --update --perms --times --copy-links 10.17.36.14::mysqldumps /home/mysqldumps #> /dev/null 2>&1

sleep 2

#mysql -u root -ppassw0rd astcdrdb < /home/mysqldumps/node1-db.sql

sleep 2

#cp /home/mysqldumps/iptables /etc/sysconfig/iptables

sleep 2
#service iptables restart

На этом настройка закончена. Скрипт sync-dir.sh запускается по cron каждую ночь и забирает конфигурацию с основного сервера. На основном сервере NODE1 каждый день готовится дамп БД MySQL и конфигурации iptables, которые затем забираются rsync.

В случае отказа основного сервера, heartbeat переключает общий IP на резервный сервер, запускает необходимые сервисы с синхронизированной ранее конфигурацией по rsync с основного сервера.

Теги: , , , , ,