AF
Asterisk Forum
обсуждения телефонии, VoIP и IP-PBX
12разделов
5 423тем
34 385сообщений
← К списку тем

Openser (kamailio) в качестве load balanser-a

OpenSER 31 сообщений 25.09.2008 13:25 - 04.10.2009 15:46
#1

Openser (kamailio) в качестве load balanser-a


Специалисты по Openser (который теперь kamailio) давайте делиться опытом. Рускоязычной инфы очень мало по нему, а в англоязычной не всегда все понятно.
Второй месяц работаю над созданием нормального load balansera к * в количестве n штук. Схема работы

Теперь обясняю как это работает.
Есть некоторая сеть где сидит некоторое количество абонентов, и есть другая сеть которая за натом. Решили делать лоадбалансинг для того чтобы улучшить надежность нашей IP-PBX Asterisk. В качестве балансировщика поставили openser, и в качестве PBX 2 Asterisk.
Все клиенты регятся только на Openser-е, на астериске только звонки, запись разговоров, очереди и т.д. и т.п.
Долго и упорно изучал опесер, читал книгу http://www.asteriskforum.ru/viewtopic.php?t=2237, читал сайт www.openser.org, который нынче вот здесь http://www.kamailio.net/, а также http://www.voip.rus.net/, http://www.voip-info.org/.
Добился в итоге неплохих результатов. В принципе все работает. Балансировщик свою задачу выполняет, в statefull режиме пакеты туда сюда маршрутизиует. Asterisk-и загружены равномерно.
Для клиентов которые тусуются за nat-ом созданы правила позволяющие его преодолевать и заворачивает трафик на mediaproxy.

В общем не буду подробно останавливаться на разъяснении конфигурационного файла, который лежит в атаче.

В общем в принципе достаточно рабочая конфигурация но есть пару НО.

1. Хотелось бы сделать чтобы уже установленные звонки не зависели от состояния asterisk. Т.е. чтобы rtp траффик шел напрямую от mvts до openser. Падает астериск а текущим разговорам пофигу. canreinvite=yes не помогает.

2. Возникают иногда ситации. Юзверь куда-то звонит, но набирает неправильно номер. Ему отдается сообщение service unvailable c кодом 503. Затем это сообщение транслируется оконечному устройству которое инициировало звонок, а т.к. это ошибка то это устройство звонок останавливает а на openser-е возникает незаконченная транзакция, т.к. INVITE был, a Cancel или Bye не было. Транзакция залипает на стадии отправки пакета с методом Ask. В итоге имеем, следующий звонок этого клиента интерпретируется Openser -ом ни как новая транзакция а как продолжение предыдущей и звонок маршрутится не туда куда нужно и соответсвенно звонок никуда не уходит. Если пару минут подождать то транзакция удаляется и можно звонить снова. Но это не очень хорошо.

Вижу выход только в отлавливании сообщения с кодом 503 и отправки в секцию где транзакция будет прибиваться. т.е. в onreply_route[1] ищем статус 503 и отправляем в route(5), где убиваем транзакцию при помощи t_release(). Вроде должно работать однако ситуация повторяется.

Вот это пока 2 мои трудности, может кто может мне помочь их решить.

Взамен отвечу на любые вопросы по моей конфигурации openser -а. Думаю многим бы это пригодилось.

Давайте пополнять русcкоязычное комьюнити openser. Штука очень полезная для VoIP.


Последний раз редактировалось: ZloMurz (Ср Авг 27, 2008 13:14)
#2

Схему залей пожалуйста в attach.
_________________
"Фантазия важнее знания.", Альберт Эйнштейн
#3

По поводу пункта два, мне кажется, что такие сообщения должны попадать в блок failure_route[1] а не onreply_route[1].
_________________
ys
http://voip.rus.net/
#4

ZloMurz, зачёт! Good
тему подвешу наверх - свежа и актуальна, (хоть и не Астериск напрямую, будет приятным исключением).
в виде исключения разрешаю в данной теме постить полные конфиги (только используйте теги).
#5

to ys.

Цитата:

t_on_failure(failure_route)
Функция определяет блок, который будет обрабатывать ответы на SIP запросы в том случае, если транзакция завершилась с отрицательным результатом


Цитата:

t_on_reply(reply_route)
Функция определяет блок, который будет обрабатывать ответы на SIP запросы, управление которому передается каждый раз при приеме (промежуточных и финальных ) ответов в пределах транзакции.


я конечно пытался обрабатывать ситуацию именно в failure_route, но
Код:

if (status=~"(503)")
{
xlog("L_INFO", "503\n");
}


в failure_route статус 503 не ловит, а onreply_route ловит.

Сейчас вот запустил openserctl monitor и вижу в Transaction Statistics что inuse_transactions = 0 после того как совершаю вызов на неправильный или несуществующий номер, т.е. походу залипших транзакций в памяти не остается. Вот тогда интересно что мешает следующему звонку повторить весь путь а не идти сразу на обработку ACK запросов.

Added after 3 hours 10 minutes:

Ура. Very Happy Кажется победил!!!
Достаточно было внести в конфигурацию
Код:
disable_dns_blacklist=yes

и все стало нормально отрабатываться.
Так что если кто столкнется с траблой когда на оконечку прилетает 473 Filtering destination смело ставьте эту опцию.

Вопрос по canreinvite все еще актуален.
#6

Re: Openser (kamailio) в качестве load balanser-a


ZloMurz писал(а):
1. Хотелось бы сделать чтобы уже установленные звонки не зависели от состояния asterisk. Т.е. чтобы rtp траффик шел напрямую от mvts до openser. Падает астериск а текущим разговорам пофигу. canreinvite=yes не помогает.


А зачем вы тут используете asterisk? У вас ведь пользователи на kamailio.

_________________
"Фантазия важнее знания.", Альберт Эйнштейн
#7

Потому что kamailio это софтсвитч, и он не обладает функциями PBX. Мы достаточно широко юзаем asterisk в качестве PBX но надежность его работы при большом количестве одновременных звонков совсем не устраивает. Именно для этого и пытаемся внедрить балансировщик нагрузки. Но хочется сделать действительно безотказное рещение чтобы еще и при падении астериска не разрывался медиапоток.

В итоге хотим сделать чтобы сам опенсер крутился на кластере из 2-ух машин и обслуживал кучу астерисков, часть из которых будет обеспечивать связью офис, а другая предоставлять клиентам телефонии различные SIP фишки.
Еще есть задумка попробовать вместо астериска callweaver. Кстати сразу вопрос кто-нить юзал его, стоит возиться?
#8

Я не много о другом. О том, что входящий звонок можно сразу с меры на опенсер отправить и привести далее на телефон.

Хотя я думаю вы защищаетесь не с той стороны. Как часто * то падает? Может не стоит ее до такого то доводить?
т.е. если вы на уровне распределения нагрузки разбросаете звонки по астерискам, то почему ему то падать?

_________________
"Фантазия важнее знания.", Альберт Эйнштейн
#9

Re: Openser (kamailio) в качестве load balanser-a


ZloMurz писал(а):
...Openser (который теперь kamailio)...

кстати.. а что тогда есть OpenSIPS? или уже несколько клонов? тогда какой самый "правильный"?
#10

Пока непонятно.
Тот, кто из них будет сильнее развиваться, тот и правильный.
Время покажет.

_________________
ys
http://voip.rus.net/
#11

ToxaP писал(а):

Хотя я думаю вы защищаетесь не с той стороны. Как часто * то падает? Может не стоит ее до такого то доводить?
т.е. если вы на уровне распределения нагрузки разбросаете звонки по астерискам, то почему ему то падать?

Кстати наверное согласен Smile

Added after 4 minutes:

2 anest:
я когда начал курить OpenSer то он и был OpenSer-ом, а как-то прихожу на работу набираю сайт ихний а меня редиректит на OpenSIPs, а про то что опенсер таки стал kamailio узнал несколько позже. Я так понял что разработчики kamailio это в некотором роде "консерваторы" и для них главное стабильность, а конфликт приведший к разделению проекта, произошел со стороны OpenSIPs -вцев. Но могу ошибаться.
#12

А какой из них OpenSIPS или Kamailio больше всего приближен к OpenSER ? С кого из них начать изучение?
#13

Пока разницы никакой, они не успели еще сильно разлететься.
#14

И все же.Может кто нибудь подскажет, к чему привело такое разделение проекта?С чем в данный момент легче работать?Или нет наверное не так.Что более стабильнее на данный момент?Спасибо
#15

Пока это разделение не принципиально. Оба одинаково сложны в изучении имхо. Лично я выбрал kamailio, ибо он таки опенсер, просто с другим названием. Так что рекомендую разбираться с ним.
#16

Приветсвую!

А куда делся замечательный проэкт генерирующий конфиги к Kamailio/SER ?

Kamailio (OpenSER) Config Generator

http://www.sipwise.com/wizard

Может где-то на просторах Интернета есть копия данного сайта ?
#17 25.09.2008 13:25

Спасибо за ответ.Будем тогда пробовать kamailio.В принципе нужно только поставить и "пропускать" через него несколько звонков.А там видно будет)
#18 30.09.2008 20:29

ZloMurz писал(а):

Еще есть задумка попробовать вместо астериска callweaver. Кстати сразу вопрос кто-нить юзал его, стоит возиться?


Я сейчас с ним активно вожусь... Здесь http://www.asterisk-support.ru/forum/19/ оставляю впечатления...

_________________
Maksim Timofejev
#19 08.10.2008 05:21

Скрещиваю asterisk c kamailio(openser). Столкнулся с такой сиуацией. Для преодоления NAT-а юзается mediaproxy. Звонок такой: vasya@domen.ru -> kamailio -> asterisk -> kamailio -> petya@domen.ru. Mediaproxy послушно открывает всем желающим порты и готов проксировать траф. Но пиры vasya@domen.ru и asterisk гоняют траф без медиапрокси. Стоит мне на софтфоне нажать на секунду hold и вернуться обратно, медиа трафик начинает ходить через медиапрокси.
В принципе и так всех слышно, просто странно как-то себя ведет связка. Я полагаю траф начинает ходит через медиапрокси после re-INVITE. Вот думаю чей это косяк kamailio или asterisk.

Может есть у кого соображения на сей счет?
#20 15.12.2008 01:27

А как бы в этой схеме уменьшить timeout ответа от умершего астреска ?
#21 15.12.2008 08:20

покажи конфиг где ты делаешь выбор астериска, у меня умерший астер просто выпадает и система даже не пытается на него звонить
#22 15.12.2008 13:26

Лови, причем если без failure_route[7] то она вообще не переходит на работающий астерикс.
OpenSER 1.2.3 на FreeBSD ставил из портов.
#23 15.12.2008 15:17

Попробуй так, у меня нормально работает:

Код:

ds_select_dst("1","4");
forward();
return;

Т.е. отдаешь астеру не t_relay-ем, а forward-ом. У меня с t_relay тоже помню долго тупил опенсер с обнаружением нерабочей ноды астериска
#24 15.12.2008 20:16

с forward() перестал отбой со стороны клиента не приниматься. т.е. кладу трубку на сере срабатывает правило на это msg:len >= 2048

Added after 47 minutes:

В итоге оставил t_relay() и выставил
modparam("tm", "fr_timer", 3)
modparam("tm", "fr_inv_timer", 120)

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

Относительно forward() то выяснил, что функции forward() и send() не сохраняют состояние т.е. перекидывают сообщение и и забывают про транзакцию...
#25 16.12.2008 05:52

Очень хорошо, попробуюSmile

Added after 38 minutes:

Большущий респект, допилил свой опенсер, теперь как часы работает.
#26 17.12.2008 16:54

Кстати, вопрос, а зачем транзитить через меру ? Можно же сразу с астериска по h.323 на циску отдавать...
#27 17.12.2008 18:49

>Можно же сразу с астериска по h.323 на циску

Ыыы.
Ну можно, но не нужно.
Радиус поражения граблями сильно увеличивается, если к asterisk прикрутить h323.
Лудше отдавать на сисько по SIP.

_________________
ys
http://voip.rus.net/
#28 18.12.2008 13:18

циска и SIP поддерживает тоже, часть звонков и идет сразу на астериск в сипе. Астериск это у нас лишь небольшой кусок сервиса (офисный Call центр), основные клиенты регаются на мере по сип и h323 протоколу, что кому надо. Основная роль МВТС это биллинг и сертифицированный узел связи, биллинг там очень хорошо реализован через радиус.
#29 28.05.2009 15:58

>>Скрещиваю asterisk c kamailio(openser). Столкнулся с такой сиуацией. Для преодоления NAT-а юзается mediaproxy. Звонок такой: vasya@domen.ru -> kamailio -> asterisk -> kamailio -> petya@domen.ru. Mediaproxy послушно открывает всем желающим порты и готов проксировать траф. Но пиры vasya@domen.ru и asterisk гоняют траф без медиапрокси.

Извиняюсь за вопрос в старой ветке, но тема актуальна.
Как решили вопрос с медиа между юзверями в 1 домене ?
#30 25.09.2009 13:30

Вопросик такой, может сталкивались.
А рвать сессию по прошествии произвольного времени как-нибудь можно? Я так понимаю, Kamailio работает только по пришествую определенных сообщений. Он не отслеживает текущие сессии, чтоли?
#31 04.10.2009 15:46

evgeniy1

А нафига трафик в одном домене гнать через астер ? Когда они в пределах сера могу нормально говорить...

При стыковке сера с астером, при звонке сер только гоняет сигнализацию, а ртп прет напрямую на астер.