High Availability IP FailOver

Рассмотрим создание отказоустойчивого кластера из двух серверов Asterisk/FreePBX
с автоматической подменой IP адреса и синхронизацией БД FreePBX.

Heartbeat, Asterisk, FreePBX, Centos6 x86_64

Задайте Hostname для каждого из узлов (asterisk1, asterisk2)

[root@asterisk1 ha.d]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=asterisk1
[root@asterisk2 ha.d]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=asterisk2

Подключим Epel репозиторий

(asterisk1, asterisk2)

 wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm &&
 wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm &&
 rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm

Установим Heartbeat

(asterisk1, asterisk2)

yum install -y heartbeat

Настроим Heartbeat

Файл конфигурация ha.cf для каждого из узлов

logfile /var/log/ha-log
node asterisk1
node asterisk2
keepalive 1
deadtime 10
bcast eth0
auto_failback on
respawn hacluster /usr/lib64/heartbeat/ipfail

Сгенерируем пароль sha1, где PASS ваше кодовое слово.

   echo -n PASS | sha1sum | awk '{print $1}'
bd564db5d5cc358eb0e3523d3e03041739f230d5

Создадим файл ключа авторизации

nano /etc/ha.d/authkeys

auth 1
1 sha1 bd564db5d5cc358eb0e3523d3e03041739f230d5
 chmod 600 /etc/ha.d/authkeys

Скопируем файл на резервный узел (asterisk2)

 scp /etc/ha.d/authkeys asterisk2:/etc/ha.d/

/etc/ha.d/haresources

(asterisk1)

asterisk2 IPaddr::192.168.1.202/24/eth0

/etc/ha.d/haresources

(asterisk2)

asterisk1 IPaddr::192.168.1.201/24/eth0

Включим hearteat на обоих узлах

 /etc/init.d/heartbeat start
 

Проверим IP адрес на резервном узле (asterisk2)

[root@asterisk2 ha.d]# ip addr | grep "inet"
    inet 192.168.1.202/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.201/24 brd 192.168.1.255 scope global secondary eth0

Secondary eth0 (192.168.1.201) примет пакеты, если основной узел (asterisk1) будет недоступен в течении 10 секунд.

Если включен файрвол разрешим пинги снаружи на обоих узлах.

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT &&
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT &&
service iptables save

И наконец включим автозагрузку heaкtbeat на каждом из узлов.

 chkconfig heartbeat on

Синхронизация Баз Данных FreePBX

Настроим резервный сервер (asterisk2) таким образом, чтобы он подключался к основному серверу (asterisk1) по SSH
и синхронизировал настройки asterisk, autoprovision и др.

Настройка SSH подключения

В данном примере Asterisk и Web server работают из под пользователя asterisk.

Зададим временный пароль пользователю asterisk
На основном сервере (asterisk1)

#chsh -s /bin/bash asterisk
#passwd asterisk
somepassword
#chmod 755 /var/lib/asterisk

Сгенерируем ssh ключ на резервном сервере (Asterisk2)

 #chsh -s /bin/bash asterisk
#su  - asterisk
$ssh-keygen

Команда ssh-keygen создаст ключ в /home/asterisk/.ssh/id_rsa

Не вводите passphrase, оставьте пустым:

]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/asterisk/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/asterisk/.ssh/id_rsa.
Your public key has been saved in /home/asterisk/.ssh/id_rsa.pub.
The key fingerprint is:
84:a8:1b:6f:2c:56:91:d5:d2:12:8f:8f:28:78:07:4e asterisk@asterisk2
The key's randomart image is:
+--[ RSA 2048]----+
|      o+         |
|     +o+o        |
|  A + o+o        |
| + o o +         |
|. * + . D        |
| . O             |
|  + +            |
| . o             |
|                 |
+-----------------+

Кода ключ создан, скопируем его на основной сервер:

 $ssh-copy-id -i asterisk@asterisk1_IP

Будет запрошен пароль, заданный для пользователя asterisk на основном севере.

[asterisk@asterisk2 root]$ ssh-copy-id -i asterisk@192.168.1.201
The authenticity of host '192.168.1.201 (192.168.1.201)' can't be established.
RSA key fingerprint is 61:44:a0:40:78:33:2a:b5:ec:eb:5f:55:36:39:8b:4d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.201' (RSA) to the list of known hosts.
asterisk@192.168.1.201's password:
Now try logging into the machine, with "ssh 'asterisk@192.168.1.201'", and check                                  in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

Проверим подключение по ssh с ключом:

[asterisk@asterisk2 root]$ ssh asterisk@192.168.1.201
[asterisk@asterisk1 ~]$

Если произошло подключение к основному серверу без пароля, все в порядке.

В завершении настройки SSH подключения, удалим пароль пользователя asterisk на основном сервере (asterisk1).

 passwd -d asterisk

И перейдем к настройке автоматической синхронизации FreePBX

Выберете на резервном сервере Admin > Backup & Restore > Servers - New SSH Server

Hostname - ip адрес основного сервера Asterisk1

Port - порт ssh

User Name - пользователь, в нашем случае asterisk

Key - местонахождение ключа (/home/asterisk/.ssh/id_rsa)

Затем выберете Admin > Backup & Restore > Backups - New Backup

Задайте имя и перетащите шаблоны для настроек:

в нашем примере это Full Backup и Exclude Backup Settings

Местонахождение директории tftp сервера, где лежат файлы для autoprovision, изменена с /tftpboot на /var/lib/tftpboot.

Задайте в соответствии с вашими условиями.

И в завершении укажем созданный нами Backup Server (asterisk1)
и хранилище - Local Storage (local)

Restore Here - записать скачанный бэкап в базу данных asterisk

Disable Registered Trunks - отключить зарегистрированные транки, во избежание проблем с входящими вызовами на основном сервере.

Exclude NAT Settings - Исключить специфические настройки IP основного сервера.

Apply Config - Применить скачанный бэкап (записать в конфиги asterisk)

Сохраним Save и проверим немедленно and Run

Только авторизованные участники могут оставлять комментарии.

Войти через: Google Facebook