Kamailio: Как распределить звонки между несколькими серверами Asterisk на основе их IP-адресов
Мой сценарий таков: магистраль SIP подключена к серверу Kamailio, который подключен к нескольким серверам Asterisk локально и должен балансировать вызовы между этими серверами Asterisk. Как? Внутри сервера Kamailio есть таблица базы данных mysql, которая отображает TO
часть sip-заголовка входящих звонков на один из IP-адресов звездочек.
Kamailio должен прочитать sip-заголовок и выполнить поиск в базе данных, а после получения IP-адреса перенаправить вызов на соответствующий сервер звездочек.
Например, значение To
внутри входящего sip-заголовка есть 123456
поэтому kamailio делает запрос к базе данных и находит номер 123456
это внутри 192.168.1.10
поэтому вызов должен быть перенаправлен на сервер 192.168.1.10
,
Я прочитал несколько статей и помощь Камайлио с его сайта, но не смог найти ничего, связанного с этим сценарием. Кто-нибудь знает, как написать маршрут внутри kamailio.cfg?
2 ответа
Есть несколько способов сделать это. Одним из них является использование модуля диспетчера.
Этот модуль предлагает функцию балансировки нагрузки SIP и может использоваться в качестве диспетчера трафика SIP. Существует множество алгоритмов балансировки нагрузки и распределения трафика, которые вы можете выбрать, например: циклический перебор, балансировка нагрузки на основе веса, распределение нагрузки при вызове и хэширование по атрибутам сообщения SIP.
Модуль может использоваться как балансировщик нагрузки без сохранения состояния; это не зависит от какого-либо модуля отслеживания состояния вызова. Требуется модуль TM, если вы включаете автоматическое обнаружение активных / неактивных шлюзов.
Он очень легкий, поэтому подходит для обработки интенсивного SIP-трафика. Поскольку модуль занимает небольшую площадь и имеет возможность загружать правила балансировки из простого текстового файла, он подходит для встроенных систем.
Чтобы это работало:
Вам нужно добавить dispatcher.list
файл со списком IP-адресов ваших звездочек, например, так:
1 sip:192.168.0.10 #asterisk 01
1 sip:192.168.0.11 #asterisk 02
Затем перед передачей запроса вы сделаете ds_select_dst(1, 0);
Убедитесь, что вы указали файл списка для вашего модуля диспетчера:
loadmodule "dispatcher.so"
modparam("dispatcher", "list_file", "/var/run/kamailio/dispatcher.list")
Если вы хотите использовать базу данных вместо файла, вы можете сделать это, указав db:
modparam("dispatcher", "db_url", "mysql://user:passwb@localhost/database")
Также есть другие параметры для указания таблицы базы данных и т. Д.
Вы можете прочитать больше в документации диспетчера kamailio
Просто случайный или циклический вызов, обычно выполняемый диспетчером или вызовом с балансировкой нагрузки.
Если вам нужен запрос БД, вы выбираете использовать модуль AVPOPS (который позволяет делать пользовательский запрос к БД) и HTABLE для ответа кеша.
avp_db_query("select password, ha1 from subscriber where username='$tu'",
"$avp(678);$avp(679)");
http://www.opensips.org/html/docs/modules/1.7.x/avpops.html
Наверняка вы также выполняете защиту PIKE и DDoS, потому что db может выполнять гораздо меньше SQL-запросов, чем kamailio и / или инструменты для атаки, такие как SIPP/SIPSack. Это сбить вашу БД и трудно восстановить.