Для этого проекта нам понадобиться железо:
- Сервер, 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.
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 пакета, он позволит проверить и обновить прошивку и протестировать устройство.
Тестирование системы
Сперва проверим что 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 поднялся на новый уровень надежности и применения. Теперь астерискеры могут спать спокойно.
ссылка на оригинал статьи http://habrahabr.ru/post/160521/
Добавить комментарий