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. Это сбить вашу БД и трудно восстановить.

Другие вопросы по тегам