Рубрики
Kamailio

Kamailio часть 6. USRLOC — хранение SIP REGISTER в ОЗУ и БД PostgreSQL с примерами

В этой мини-статье мы разберем некоторые параметры модуля usrloc в Kamailio. Модуль usrloc используется для хранения регистраций абонентов (запросов SIP REGISTER)

USRLOC модуль в Kamailio с примерами

Давайте посмотрим, как сейчас хранится регистрация (AoR) в Kamailio, в таблице location. Для этого зарегистрируемся абонентом 1111 и выполним команду kamcmd:

kamcmd ul.dump

В выводе мы увидим следующее:

kamcmd kamailio ul.dump

Ничего нового мы здесь не увидели, очень подробно мы рассматривали регистрацию в первой части (SIP регистрация в Kamailio) цикла статей. Не будем углубляться в подробности зачем нужно перезагружать Kamailio, но примем как факт, что у нас появилась необходимость выполнить перезагрузку (например, чтобы перечитать конфигурационный файл kamailio.cfg). Перезагрузка выполняется командой:

systemctl restart kamailio

И теперь давайте посмотрим на вывод kamcmd о зарегистрированных пользователях:

kamcmd ul.dump

И посмотрим на результат выполнения:

kamailio kamcmd ul.dump

Как видно, регистрации абонента больше нет. Но, давайте также посмотрим на самом softphone (в данном случае Zoiper), в каком статусе сейчас регистрация:

kamailio zoiper

Как видите, на пользовательском агенте (User Agent, UA) регистрация активна.

Сама проблема заключается в том, что абонент, который не зарегистрирован на SIP сервере сможет совершать исходящие вызовы т.к согласно нашему конфигурационному файлу kamailio.cfg мы авторизуем каждый звонок и проверяем корректность логина/пароля/домена. Но абонент не сможет принимать входящие вызовы т.к в памяти Kamailio он не зарегистрирован и поэтому мы увидим следующую трассировку после перезагрузки Kamailio, при попытке вызова абонента у которого сбросилась регистрация:

sip trace

Как видим, при попытке вызова незарегистрированного абонента, Kamailio отвечает ошибкой 403 Forbidden. Что это за ошибка? Эта ошибка, которая указана в конфигурационном файле kamailio.cfg, ниже приведена часть конфига, которая за это отвечает:

route[DIALOG] {
        if (is_method("INVITE")) {
                route(AUTH);
                if (!lookup("location")) {
                        sl_send_reply("403", "Forbidden");
                        exit;
                }
                handle_ruri_alias();
                record_route();
                route(RELAY);
        }
        if (has_totag()) {
                if (loose_route()) {
                        handle_ruri_alias();
                        route(RELAY);
                }
        }
        if (is_method("ACK")) {
                if ( t_check_trans() ) {
                        route(RELAY);
                        exit;
                } else {
                        exit;
                }
        }
}

Нужная часть кода выделена красным цветом. Более подробно сам процесс вызова (SIP INVITE) описывался в третьей части цикла статей (Обработка SIP INVITE в Kamailio, SIP диалог, транзакции). Но освежим в памяти, что мы здесь видим.

Итак, с помощью функции lookup(«location») мы проверяем, зарегистрирован ли вызываемый абонент. Если да, то идем по пользовательскому маршруту (route) DIALOG дальше. Если же пользователь не зарегистрирован (как приводился пример выше, например мы перезагрузили Kamailio и все регистрации были удалены) — вызывается функция sl_send_reply, которая отправляем вызывающему абоненту ответ 403 Forbidden.

Перезагрузка может быть критична (например, если на сервере зарегистрированы сотни абонентов), именно поэтому так важно сохранить сами регистрации абонентов. Для этого мы будем использовать всего лишь два параметра из модуля usrloc.

  1. Добавим параметр в котором подключим базу данных к модулю usrloc:
modparam("usrloc", "db_url", DBURL)

Где DBURL ранее заданная строка подключения к базе данных (о подключении базы данных можно прочитать в первой части цикла, обработка SIP REGISTER в Kamailio). Напомню, что в качестве базы данных используется PostgreSQL, сама же строка DBURL выглядит следующим образом:

#!define DBURL "postgres://kamailio:secret_password@localhost:5433/kamailio"

Где DBURL — название строк, которое будет использоваться для подключения к базе данных, postgres — используемый драйвер (в данном случае для PostgreSQL), kamailio — имя пользователя для покдлючения к БД, secret_password — пароль для пользователя, localhost — адрес подключения к базе данных (в данном случае localhost означает, что база данных находится на том же сервере), 5433 — порт для подключения к базе данных, kamailio — название базы данных для подключения

2. И укажем степень использования базы данных для хранения регистрация с помощью параметра:

modparam("usrloc", "db_mode", 2)

Цифра 2 и есть режим работы с базой данных. Всего есть 5 режимов работы модуля usrloc с базой данных:

  1. Цифра 0 — не использовать базу данных для хранения регистрация. Т.е это тот режим, который у нас сейчас. При перезагрузке мы теряем все регистрации абонентов. Очень ненадежно.
  2. Цифра 1 —- при регистрации сразу записывать абонента и в оперативную память, и в таблицу базы данных, где указаны все зарегистрированные абоненты. Очень медленный режим, но очень надежный. Если абонент зарегистрировался, то он сразу же попадет в базу данных зарегистрированных абонентов и при перезагрузке ничего не будем потеряно.
  3. Цифра 2 — комбинация двух предыдущих режимов. При регистрации абонент сначала будем записан в оперативную память, а спустя некоторое время (по умолчанию 60 секунд, задается параметром timer_interval) будет записан в базу данных. Именно этот режим мы будем использовать т.к он позволяет пропустить через себя большое количество регистраций от абонентов и при этом, спустя 60 секунд (по умолчанию), зарегистрированные абоненты будут добавлены в таблицу базы данных, что позволит решить проблемы внеплановой перезагрузки.
  4. Цифра 3 — использовать только базу данных, не использовать оперативную память для хранения. Очень медленный режим работы, при любой регистрации будет происходить запись только в БД, не используя оперативную память.
  5. Цифра 4 — использовать базу данных для загрузки всех зарегистрированных абонентов в оперативную память при старте, но во время работы использовать только оперативную память. Не надежно.

После того, как мы добавим два параметра (подключение к БД и режим работы), запись зарегистрированных пользователей в базу данных будет происходить в таблицу «location», базы данных kamailio.

Для применения изменений необходимо перезагрузить kamailio для перечитывания конфигурационного файла.

systemctl restart kamailio

И давайте теперь заново зарегистрируемся на Kamailio, подождем 60 секунд и выполним еще раз перезагрузку сервера.

kamcmd ul.dump

Теперь посмотрим на содержимое таблицы location в базе данных kamailio спустя 60 секунд после регистрации:

kamailio location table in database
sql запрос, который выполнялся — SELECT * FROM location;

Как видно, спустя 60 секунд (таймер по умолчанию) зарегистрированный абонент 1111 был добавлен в таблицу базы данных — location.

Теперь давайте выполним перезагрузку SIP сервера и посмотрим на список зарегистрированных абонентов:

результат выполнения команды kamcmd ul.dump

Как видно, после перезагрузки, все также доступны ранее выполненные регистрации абонентов.

Заключение

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

В следующей статье мы добавим Media сервер — FreeSWITCH и начнем реализовывать бизнес логику, а начнем с обработки локальных звонков между абонентами через FreeSWITCH.

Если есть желание сделать пожертвование, то это можно сделать кликнув по ссылке или же нажав на кнопку. Спасибо за поддержку !)

Для зарубежных платежных систем/карт

Один ответ к “Kamailio часть 6. USRLOC — хранение SIP REGISTER в ОЗУ и БД PostgreSQL с примерами”

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *