Одним из главных критериев при выборе новой АТС это надежность, отказоустойчивость и возможность резервирования системы. Маленьким и средним компаниям обычно хватает простого бэкапа с возможностью восстановиться в течение 24 часов, в то время как для больших компании это очень критично и не может быть и речи о простое телефонной связи. На это обычно компания тратят много ресурсов и денег. С появлением R800 и R850 от компании DIGIUM, asterisk становится действительно надежной системой с полноценным резервированием PSTN линий Е1/T1/BRI и FXO. Под катом подробности установки и настройки двух серверов Asterisk и R850.
Для этого проекта нам понадобиться железо:
Схема нашей системы будет примерно такой
Как видно на схеме железка R850 будет принимать в себя потоки от провайдера связи и отдавать их на 2 сервера Астериск. В зависимости от состояния сервера R850 будет переключать потоки между серверами, для этого он подключен еще и USB портами.
Подключение R850:
R850 питается от USB порта, и как только вы его подключите к серверу, он должен включится. Проверяем систему на наличие новых USB устройств
root@ubuntu:~# lsusb
Bus 007 Device 003: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x Composite Device
Все что написано ниже нужно делать на обоих серверах!
Установка софта для r-series:
Перед установкой нужно отключить R850 из USB порта.
Далее снова подключаем R850 к серверу и проверяем
Должны получить такой ответ
Для полного тестирования R850 можно запустить ./rtest.sh tests /dev/rseries0 железка будет пару секунд переключать потоки и щелкать при этом.
DRBD — это блочное устройство, обеспечивающее синхронизацию (RAID1) между локальным блочным устройством и удалённым. В нашем случае я буду использовать 2 флэшки.
Готовим флэшки для DRBD
1) Удаляем (осторожно у меня флэшка /dev/sdb у вас может быть другой диск)
2) Создаем партицию на 1Гб. (можно и больше)
далее n, p, 1, 1, +1024M
3) Установка Pacemaker, Corosync, и DRBD
4) Устанавливаем конфиги
если получите сообщение
то копируем его руками.
1) Редактируем /etc/drbd.d/asterisk.res, меняем на свой данные, e-mail, IP disk и hostname я так и оставил astnode1 и astnode2 и получилось так:
2) Меняем хост в зависимости от сервера (etc/hostname)
hostname astnode1 — на первой машине и
hostname astnode2 — на второй
3) Создаем новое блочное устройство
если все настроено верно то получите
Теперь можно запустить DRDB
Следующие шаги нужно делать только на главном сервере astnode1
Создаем партицию на DRBD
Проверяем на первом сервере astnode1
Если файл test есть значит все идет по плану, отключаем drbd
Теперь проверяем на втором сервере astnode2
Тут также мы должны увидеть файл test, далее:
На этом этапе наша система готова для установки Asterisk, Dahdi и LibPRI.
На главном сервере astnode1 создаем нужные файлы и линки:
Установка на первом сервере astnode1
1) Установка необходимых пакетов для сборки DAHDI и Asterisk
2)Качаем Asterisk, DAHDI и LibPRI
3) Распаковываем
4)Собираем
После успешной установки
Переходим к установке на второй сервер astnode2
тут скрипт ответит что есть уже такие папки, так и должно быть.
Установка на втором сервере почти идентична первому, делаем все кроме make samples для asterisk.
Правим memberaddr в соответствие с нашими ИП адресами серверов и bindnetaddr
вот мой конфиг:
Далее меняем в /etc/default/corosync START=no на START=yes
Стартуем
Настроить его надо только на первом сервере astnode1
В rseries-1.0.0 есть пример настройки ее мы и отредактируем
я поменял в нем только ип адрес шлюза GatewayStatus и ocf:heartbeat:IPaddr2 ип адрес моего SIP телефона.
Конфиг:
применяем конфиг для pacemaker
На втором сервере ничего не надо делать.
Для настройки используем порт Console на R850 и кабель из slave-astnode2 например
Тут должна появится меню для настройки: для E1 я настроил так:
Также для управления R850 можно использовать rctl из rseries пакета, он позволит проверить и обновить прошивку и протестировать устройство.
Сперва проверим что R850 переключен на первый астериск astnode1
alarms=OK все отлично шлюз работает, если нет то советую просто перезагрузить astnode1 и потом astnode2.
Запускаем killall asterisk
получаем лог
crmd запустил заново Asterisk и он работает далее, но поскольку бывают моменты когда астериск больше не поднимается. Попробуем имитировать такой тест:
Смотрим логи:
Asterisk поднимается на втором сервере, R850 щелкает и переключает потоки.
Перед тестом я вернул astnode1 в рабочее состояние, но потоки остались на втором сервере. Проверим как сработает система если на втором сервере отключить питание.
логи:
Думаю все понятно, сервер astnode2 упал и на astnode поднялись потоки и asterisk. Также протестировал отключение USB кабеля и отключение сервера от локальной сети R850 всегда срабатывал.
Благодаря компании DIGIUM и новому продукту R850, Asterisk поднялся на новый уровень надежности и применения. Теперь астерискеры могут спать спокойно.
Для этого проекта нам понадобиться железо:
- Сервер, Ubuntu 10.04 — 2 шт (для текущей версии rseries, Digium рекомендует использовать именно ubuntu 10.04 или Centos 5.6)
- Digium R850 — 1 шт.
- Платы Digium TE420 — 2 шт.
- USB флэшка (минимум 1 гб) -2 шт.
Схема нашей системы будет примерно такой
Как видно на схеме железка R850 будет принимать в себя потоки от провайдера связи и отдавать их на 2 сервера Астериск. В зависимости от состояния сервера R850 будет переключать потоки между серверами, для этого он подключен еще и USB портами.
Подключение R850:
- Подключаем Primary Е1 в плату Master Server
- Подключаем Secondary Е1 в плату Slave Server
- Primary USB, в порт Master Server
- Secondary USB, в порт Slave Server
- USB Console (не обязательно)
R850 питается от USB порта, и как только вы его подключите к серверу, он должен включится. Проверяем систему на наличие новых USB устройств
root@ubuntu:~# lsusb
Bus 007 Device 003: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x Composite Device
Все что написано ниже нужно делать на обоих серверах!
Приготовление серверов для работы с R850
Установка софта для r-series:
Перед установкой нужно отключить R850 из USB порта.
cd /usr/src
wget http://downloads.digium.com/pub/telephony/rseries/rseries-current.tar.gz
tar zxvf rseries-current.tar.gz
cd rseries-X.X.X
make && make install
Далее снова подключаем R850 к серверу и проверяем
./rtest.sh info /dev/rseries0
Должны получить такой ответ
R-Series hardware is detected!
Firmware version: 5
Serial number: DM96137330014
Product number: R850
Ports: 8
ID Switch: 0
Watchdog Timeout (get): 5
Control mode: 1
Port 1: 0, primary, T1/E1
Port 2: 0, primary, T1/E1
Port 3: 0, primary, T1/E1
Port 4: 0, primary, T1/E1
Port 5: 0, primary, T1/E1
Port 6: 0, primary, T1/E1
Port 7: 0, primary, T1/E1
Port 8: 0, primary, T1/E1
Для полного тестирования R850 можно запустить ./rtest.sh tests /dev/rseries0 железка будет пару секунд переключать потоки и щелкать при этом.
Настройка кластеризации системы на базе Pacemaker, Corosync, и DRBD
DRBD — это блочное устройство, обеспечивающее синхронизацию (RAID1) между локальным блочным устройством и удалённым. В нашем случае я буду использовать 2 флэшки.
Готовим флэшки для DRBD
1) Удаляем (осторожно у меня флэшка /dev/sdb у вас может быть другой диск)
dd if=/dev/zero of=/dev/sdb bs=1M
2) Создаем партицию на 1Гб. (можно и больше)
fdisk /dev/sdb
далее n, p, 1, 1, +1024M
3) Установка Pacemaker, Corosync, и DRBD
apt-get install drbd8-utils
apt-get install corosync pacemaker
4) Устанавливаем конфиги
cd /usr/src/rseries-X.X.X/
make samples
если получите сообщение
Not installing /etc/corosync/corosync.conf (already exists)
то копируем его руками.
cp configs/corosync/corosync.conf /etc/corosync/corosync.conf
Приступаем к настройке
1) Редактируем /etc/drbd.d/asterisk.res, меняем на свой данные, e-mail, IP disk и hostname я так и оставил astnode1 и astnode2 и получилось так:
resource asterisk {
handlers {
split-brain "/usr/lib/drbd/notify-split-brain.sh adm@pbxware.ru";
}
net {
after-sb-0pri discard-younger-primary;
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
}
on astnode1 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.1.253:7789;
meta-disk internal;
}
on astnode2 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.1.252:7789;
meta-disk internal;
}
}
2) Меняем хост в зависимости от сервера (etc/hostname)
hostname astnode1 — на первой машине и
hostname astnode2 — на второй
3) Создаем новое блочное устройство
drbdadm create-md asterisk
если все настроено верно то получите
….
New drbd meta data block successfully created.
Теперь можно запустить DRDB
/etc/init.d/drbd start
* Starting DRBD resources [ d(asterisk) n(asterisk) ] [ OK ]
Следующие шаги нужно делать только на главном сервере astnode1
Создаем партицию на DRBD
drbdadm disconnect asterisk
drbdadm -- --clear-bitmap new-current-uuid asterisk
drbdadm -- --overwrite-data-of-peer primary asterisk
mkfs.ext3 -m0 /dev/drbd0
drbdadm secondary asterisk
drbdadm detach asterisk
drbdadm up asterisk
Проверяем на первом сервере astnode1
drbdadm primary asterisk
mkdir /mnt/asterisk
mount -t ext3 /dev/drbd0 /mnt/asterisk
cd /mnt/asterisk
touch test
ls
Если файл test есть значит все идет по плану, отключаем drbd
cd
umount /mnt/asterisk
drbdadm secondary asterisk
Теперь проверяем на втором сервере astnode2
drbdadm primary asterisk
mkdir /mnt/asterisk
mount -t ext3 /dev/drbd0 /mnt/asterisk
cd /mnt/asterisk
ls
Тут также мы должны увидеть файл test, далее:
cd
umount /mnt/asterisk
drbdadm secondary asterisk
На этом этапе наша система готова для установки Asterisk, Dahdi и LibPRI.
На главном сервере astnode1 создаем нужные файлы и линки:
cd /usr/src/rseries-1.0.0/
drbdadm primary asterisk
mount -t ext3 /dev/drbd0 /mnt/asterisk
./createlinks.sh
Устанавливаем Asterisk, DAHDI и LibPRI
Установка на первом сервере astnode1
1) Установка необходимых пакетов для сборки DAHDI и Asterisk
aptitude install mc htop iftop linux-headers-`uname -r` build-essential subversion libncurses5-dev libssl-dev libxml2-dev vim-nox libsqlite3-dev sqlite3 libnewt-dev
2)Качаем Asterisk, DAHDI и LibPRI
wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-2.6.1+2.6.1.tar.gz
wget http://downloads.asterisk.org/pub/telephony/certified-asterisk/certified-asterisk-1.8.11-current.tar.gz
wget http://downloads.asterisk.org/pub/telephony/libpri/releases/libpri-1.4.10.tar.gz
3) Распаковываем
tar -zxvf libpri-1.4.10.tar.gz
tar -zxvf certified-asterisk-1.8.11-current.tar.gz
tar -zxvf dahdi-linux-complete-2.6.1+2.6.1.tar.gz
4)Собираем
cd libpri-1.4.10
make && make install
cd ../dahdi-linux-complete-2.6.1+2.6.1/
make && make install && make config
cd ../certified-asterisk-1.8.11-cert8/
./configure && make && make install && make samples
После успешной установки
umount /mnt/asterisk/
drbdadm secondary asterisk
Переходим к установке на второй сервер astnode2
cd /usr/src/rseries-1.0.0/
drbdadm primary asterisk
mount -t ext3 /dev/drbd0 /mnt/asterisk
./createlinks.sh
тут скрипт ответит что есть уже такие папки, так и должно быть.
Установка на втором сервере почти идентична первому, делаем все кроме make samples для asterisk.
Установка на втором сервере astnode2
Приступаем к настройке Corosync на обоих серверах
vim /etc/corosync/corosync.conf
Правим memberaddr в соответствие с нашими ИП адресами серверов и bindnetaddr
вот мой конфиг:
totem {
version: 2
token: 3000
token_retransmits_before_loss_const: 10
join: 60
consensus: 5000
vsftype: none
max_messages: 20
clear_node_high_bit: yes
secauth: off
threads: 0
rrp_mode: none
interface {
ringnumber: 0
bindnetaddr: 192.168.1.0
broadcast: yes
mcastport: 5405
member {
memberaddr: 192.168.1.253
}
member {
memberaddr: 192.168.1.252
}
}
}
aisexec {
user: root
group: root
}
logging {
fileline: off
to_stderr: yes
to_logfile: no
to_syslog: yes
syslog_facility: daemon
debug: off
timestamp: on
logger_subsys {
subsys: AMF
debug: off
tags: enter|leave|trace1|trace2|trace3|trace4|trace6
}
}
amf {
mode: disabled
}
Далее меняем в /etc/default/corosync START=no на START=yes
Стартуем
/etc/init.d/corosync start
* Starting corosync daemon corosync [ OK ]
Настройка Pacemaker
Настроить его надо только на первом сервере astnode1
В rseries-1.0.0 есть пример настройки ее мы и отредактируем
vim /usr/src/rseries-1.0.0/configs/pacemaker/pacemaker.cfg
я поменял в нем только ип адрес шлюза GatewayStatus и ocf:heartbeat:IPaddr2 ип адрес моего SIP телефона.
Конфиг:
node astnode1
node astnode2
primitive Asterisk ocf:Digium:asterisk \
op monitor interval="5"
primitive Asterisk_drbd ocf:linbit:drbd \
params drbd_resource="asterisk" \
op monitor start-delay="10" interval="5"
primitive Asterisk_fs ocf:heartbeat:Filesystem \
params device="/dev/drbd/by-res/asterisk" directory="/mnt/asterisk/" fstype="ext3"
primitive ClusterIP ocf:heartbeat:IPaddr2 \
params ip="192.168.1.109" cidr_netmask="32" \
op monitor interval="5"
primitive GatewayStatus ocf:pacemaker:ping \
params host_list="192.168.1.1" multiplier="100" \
op monitor interval="5" timeout="10"
primitive rseries0 ocf:Digium:rseries \
params tty="/dev/rseries0" \
op monitor interval="10" role="Master" \
op monitor interval="60" role="Slave"
ms Asterisk_ms Asterisk_drbd \
meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"
ms rseries0_ms rseries0 \
meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" target-role="Master"
clone GatewayStatusClone GatewayStatus
location Asterisk-with-ping Asterisk \
rule $id="Asterisk-with-ping-rule" -inf: not_defined pingd or pingd lte 0
colocation Everything-with-Asterisk inf: ( rseries0_ms:Master Asterisk_ms:Master ) ( ClusterIP Asterisk_fs ) Asterisk
order Asterisk-after-Everything inf: ( rseries0_ms:promote Asterisk_ms:promote ) ( ClusterIP Asterisk_fs ) Asterisk:start
property $id="cib-bootstrap-options" \
cluster-infrastructure="openais" \
expected-quorum-votes="2" \
stonith-enabled="false" \
no-quorum-policy="ignore"
rsc_defaults $id="rsc-options" \
resource-stickiness="99"
применяем конфиг для pacemaker
cd /usr/src/rseries-1.0.0/
crm configure load update configs/pacemaker/pacemaker.cfg
На втором сервере ничего не надо делать.
Настройка R850
Для настройки используем порт Console на R850 и кабель из slave-astnode2 например
minicom -s
+-----------------------------------------------------------------------+
| A - Serial Device : /dev/ttyUSB0 |
| B - Lockfile Location : /var/lock |
| C - Callin Program : |
| D - Callout Program : |
| E - Bps/Par/Bits : 115200 8N1 |
| F - Hardware Flow Control : No |
| G - Software Flow Control : No |
| |
| Change which setting? |
+-----------------------------------------------------------------------+
Тут должна появится меню для настройки: для E1 я настроил так:
Digium R850 Firmware Version: 5
Serial Number: DM96137330014
Port |Mode Passthrough State
All | --- --- ---
1 | T1/E1 disabled Input to Primary
2 | T1/E1 disabled Input to Primary
3 | T1/E1 disabled Input to Primary
4 | T1/E1 disabled Input to Primary
5 | T1/E1 disabled Input to Primary
6 | T1/E1 disabled Input to Primary
7 | T1/E1 disabled Input to Primary
8 | T1/E1 disabled Input to Primary
Arrow keys or a (left), d (right), w (up) or s (down) to navigate thru menu
r to refresh, <enter> to select, c to commit changes
o to toggle operational state, xxx to exit menu.
Также для управления R850 можно использовать rctl из rseries пакета, он позволит проверить и обновить прошивку и протестировать устройство.
Тестирование системы
Сперва проверим что R850 переключен на первый астериск astnode1
root@astnode1:~# dahdi_scan
[1]
active=yes
alarms=OK
description=T2XXP (PCI) Card 0 Span 1
name=TE2/0/1
manufacturer=Digium
devicetype=Wildcard TE220 (5th Gen)
location=Board ID Switch 0
basechan=1
totchans=31
irq=0
type=digital-E1
syncsrc=1
lbo=0 db (CSU)/0-133 feet (DSX-1)
coding_opts=AMI,HDB3
framing_opts=CCS,CRC4
coding=HDB3
framing=CCS/CRC4
[2]
active=yes
alarms=OK
description=T2XXP (PCI) Card 0 Span 2
name=TE2/0/2
manufacturer=Digium
devicetype=Wildcard TE220 (5th Gen)
location=Board ID Switch 0
basechan=32
totchans=31
irq=0
type=digital-E1
syncsrc=1
lbo=0 db (CSU)/0-133 feet (DSX-1)
coding_opts=AMI,HDB3
framing_opts=CCS,CRC4
coding=HDB3
framing=CCS/CRC4
alarms=OK все отлично шлюз работает, если нет то советую просто перезагрузить astnode1 и потом astnode2.
Падение Asterisk на astnode1
Запускаем killall asterisk
получаем лог
crmd: [810]: info: process_lrm_event: LRM operation Asterisk_monitor_5000 (call=21, rc=7, cib-update=56, confirmed=false) not running
….
Nov 9 13:07:19 astnode1 crmd: [810]: info: te_rsc_command: Initiating action 25: start Asterisk_start_0 on astnode1 (local)
Nov 9 13:07:19 astnode1 crmd: [810]: info: do_lrm_rsc_op: Performing key=25:7:0:90c9675a-3c31-4e86-9f90-68c13142b377 op=Asterisk_start_0 )
Nov 9 13:07:19 astnode1 lrmd: [807]: info: rsc:Asterisk:23: start
crmd запустил заново Asterisk и он работает далее, но поскольку бывают моменты когда астериск больше не поднимается. Попробуем имитировать такой тест:
mv /usr/sbin/asterisk /usr/sbin/asterisk-back
killall asterisk
Смотрим логи:
Nov 9 13:10:36 astnode1 pengine: [809]: info: get_failcount: Asterisk has failed 1000000 times on astnode1
Nov 9 13:10:36 astnode1 pengine: [809]: WARN: common_apply_stickiness: Forcing Asterisk away from astnode1 after 1000000 failures (max=1000000)
Nov 9 13:10:36 astnode1 pengine: [809]: notice: LogActions: Start Asterisk#011(astnode2)
Asterisk поднимается на втором сервере, R850 щелкает и переключает потоки.
Проблемы с питанием сервера.
Перед тестом я вернул astnode1 в рабочее состояние, но потоки остались на втором сервере. Проверим как сработает система если на втором сервере отключить питание.
логи:
Nov 9 13:20:10 astnode1 crmd: [810]: info: ais_status_callback: status: astnode2 is now lost (was member)
Nov 9 13:20:21 astnode1 kernel: [ 937.276823] wct4xxp 0000:06:08.0: Clearing yellow alarm span 1
Nov 9 13:20:21 astnode1 kernel: [ 937.448860] wct4xxp 0000:06:08.0: Clearing yellow alarm span 2
Думаю все понятно, сервер astnode2 упал и на astnode поднялись потоки и asterisk. Также протестировал отключение USB кабеля и отключение сервера от локальной сети R850 всегда срабатывал.
Благодаря компании DIGIUM и новому продукту R850, Asterisk поднялся на новый уровень надежности и применения. Теперь астерискеры могут спать спокойно.