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

Kamailio/OpenSIPS и другие производные от SER.

Модераторы: Admins, Модераторы

ZloMurz
Сообщения: 303
Зарегистрирован: 31 янв 2008, 15:19

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

Сообщение ZloMurz » 27 авг 2008, 12:55

Специалисты по 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, всего редактировалось 3 раза.

ToxaP
Сообщения: 327
Зарегистрирован: 13 май 2006, 15:26

Сообщение ToxaP » 27 авг 2008, 13:11

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

ys
Модератор
Сообщения: 688
Зарегистрирован: 28 апр 2005, 10:00
Откуда: Петербург
Контактная информация:

Сообщение ys » 27 авг 2008, 19:02

По поводу пункта два, мне кажется, что такие сообщения должны попадать в блок failure_route[1] а не onreply_route[1].

Аватара пользователя
anest
Модератор
Сообщения: 5633
Зарегистрирован: 28 ноя 2004, 10:04

Сообщение anest » 27 авг 2008, 19:10

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

ZloMurz
Сообщения: 303
Зарегистрирован: 31 янв 2008, 15:19

Сообщение ZloMurz » 28 авг 2008, 10:00

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:

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

Код: Выделить всё

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

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

ToxaP
Сообщения: 327
Зарегистрирован: 13 май 2006, 15:26

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

Сообщение ToxaP » 28 авг 2008, 13:30

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

ZloMurz
Сообщения: 303
Зарегистрирован: 31 янв 2008, 15:19

Сообщение ZloMurz » 29 авг 2008, 19:00

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

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

ToxaP
Сообщения: 327
Зарегистрирован: 13 май 2006, 15:26

Сообщение ToxaP » 31 авг 2008, 09:37

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

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

Аватара пользователя
anest
Модератор
Сообщения: 5633
Зарегистрирован: 28 ноя 2004, 10:04

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

Сообщение anest » 01 сен 2008, 04:01

ZloMurz писал(а):...Openser (который теперь kamailio)...
кстати.. а что тогда есть OpenSIPS? или уже несколько клонов? тогда какой самый "правильный"?

ys
Модератор
Сообщения: 688
Зарегистрирован: 28 апр 2005, 10:00
Откуда: Петербург
Контактная информация:

Сообщение ys » 01 сен 2008, 08:47

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

ZloMurz
Сообщения: 303
Зарегистрирован: 31 янв 2008, 15:19

Сообщение ZloMurz » 01 сен 2008, 09:25

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

Added after 4 minutes:

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

Tron
Сообщения: 10
Зарегистрирован: 14 июл 2008, 06:35

Сообщение Tron » 08 сен 2008, 10:54

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

ZloMurz
Сообщения: 303
Зарегистрирован: 31 янв 2008, 15:19

Сообщение ZloMurz » 08 сен 2008, 11:13

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

Аватара пользователя
Руут
Сообщения: 143
Зарегистрирован: 14 авг 2008, 14:10
Откуда: Киев

Сообщение Руут » 25 сен 2008, 07:06

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

ZloMurz
Сообщения: 303
Зарегистрирован: 31 янв 2008, 15:19

Сообщение ZloMurz » 25 сен 2008, 12:04

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

Аватара пользователя
Руут
Сообщения: 143
Зарегистрирован: 14 авг 2008, 14:10
Откуда: Киев

Сообщение Руут » 25 сен 2008, 13:25

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

tma
Сообщения: 361
Зарегистрирован: 11 июл 2005, 17:52
Контактная информация:

Сообщение tma » 30 сен 2008, 20:29

ZloMurz писал(а): Еще есть задумка попробовать вместо астериска callweaver. Кстати сразу вопрос кто-нить юзал его, стоит возиться?
Я сейчас с ним активно вожусь... Здесь http://www.asterisk-support.ru/forum/19/ оставляю впечатления...
Maksim Timofejev

ZloMurz
Сообщения: 303
Зарегистрирован: 31 янв 2008, 15:19

Сообщение ZloMurz » 08 окт 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.

Может есть у кого соображения на сей счет?

ALD
Сообщения: 47
Зарегистрирован: 14 дек 2008, 19:41

Сообщение ALD » 15 дек 2008, 01:27

А как бы в этой схеме уменьшить timeout ответа от умершего астреска ?

ZloMurz
Сообщения: 303
Зарегистрирован: 31 янв 2008, 15:19

Сообщение ZloMurz » 15 дек 2008, 08:20

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

ALD
Сообщения: 47
Зарегистрирован: 14 дек 2008, 19:41

Сообщение ALD » 15 дек 2008, 13:26

Лови, причем если без failure_route[7] то она вообще не переходит на работающий астерикс.
OpenSER 1.2.3 на FreeBSD ставил из портов.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

ZloMurz
Сообщения: 303
Зарегистрирован: 31 янв 2008, 15:19

Сообщение ZloMurz » 15 дек 2008, 15:17

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

Код: Выделить всё

ds_select_dst("1","4");
forward();
return;
Т.е. отдаешь астеру не t_relay-ем, а forward-ом. У меня с t_relay тоже помню долго тупил опенсер с обнаружением нерабочей ноды астериска

ALD
Сообщения: 47
Зарегистрирован: 14 дек 2008, 19:41

Сообщение ALD » 15 дек 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() не сохраняют состояние т.е. перекидывают сообщение и и забывают про транзакцию...

ZloMurz
Сообщения: 303
Зарегистрирован: 31 янв 2008, 15:19

Сообщение ZloMurz » 16 дек 2008, 05:52

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

Added after 38 minutes:

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

ALD
Сообщения: 47
Зарегистрирован: 14 дек 2008, 19:41

Сообщение ALD » 17 дек 2008, 16:54

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

Ответить