Реализация резервирования сервера Asterisk

в 8:37, , рубрики: asterisk, cluster, digium, ip-телефония, резервирование, Телекомы, метки: , , ,

Одним из главных критериев при выборе новой АТС это надежность, отказоустойчивость и возможность резервирования системы. Маленьким и средним компаниям обычно хватает простого бэкапа с возможностью восстановиться в течение 24 часов, в то время как для больших компании это очень критично и не может быть и речи о простое телефонной связи. На это обычно компания тратят много ресурсов и денег. С появлением R800 и R850 от компании DIGIUM, asterisk становится действительно надежной системой с полноценным резервированием. Под катом подробности установки и настройки двух серверов Asterisk и R850.

Для этого проекта нам понадобиться железо:

  1. Сервер, Ubuntu 10.04 — 2 шт (для текущей версии rseries, Digium рекомендует использовать именно ubuntu 10.04 или Centos 5.6)
  2. Digium R850 — 1 шт.
  3. Платы Digium TE420 — 2 шт.
  4. USB флэшка (минимум 1 гб) -2 шт.

Схема нашей системы будет примерно такой
Реализация резервирования сервера Asterisk

Как видно на схеме железка R850 будет принимать в себя потоки от провайдера связи и отдавать их на 2 сервера Астериск. В зависимости от состояния сервера R850 будет переключать потоки между серверами, для этого он подключен еще и USB портами.

Реализация резервирования сервера Asterisk

Подключение R850:

  1. Подключаем Primary Е1 в плату Master Server
  2. Подключаем Secondary Е1 в плату Slave Server
  3. Primary USB, в порт Master Server
  4. Secondary USB, в порт Slave Server
  5. 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

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

После успешной установки

umount /mnt/asterisk/
drbdadm secondary asterisk

Приступаем к настройке 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 пакета, он позволит проверить и обновить прошивку и протестировать устройство.

Тестирование системы

Реализация резервирования сервера Asterisk
Реализация резервирования сервера Asterisk

Сперва проверим что 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 поднялся на новый уровень надежности и применения. Теперь астерискеры могут спать спокойно.

Автор: Alexcr

Источник

Поделиться

* - обязательные к заполнению поля