Развертывание Realtime-архитектуры Asterisk (динамическая СУБД)
- Необходимость постоянного выполнения команды
pjsip reloadпри добавлении новых абонентов в текстовые файлы. - Ошибки
res_odbc: Unable to connect to database [asterisk-connector]. - Задержки при обработке вызовов из-за медленных синхронных запросов к СУБД.
- Рассинхронизация статусов регистраций и AOR при высокой нагрузке.
1. Архитектура Asterisk Realtime (Dynamic Configuration)
Механизм Realtime позволяет Asterisk запрашивать данные об учетных записях (Endpoints, AORs, Auths), маршрутах и очередях из реляционной СУБД (MySQL, PostgreSQL) непосредственно в момент инициации звонка, без перезагрузки конфигурационных файлов.
2. Настройка UnixODBC и коннектора MariaDB
Установите пакеты ODBC:
apt-get install -y unixodbc unixodbc-dev odbc-mariadb || dnf install -y unixODBC unixODBC-devel mariadb-connector-odbcОтредактируйте системный файл драйверов /etc/odbcinst.ini:
[MariaDB]
Description = MariaDB ODBC Connector
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmaodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
FileUsage = 1Настройте системный DSN в /etc/odbc.ini:
[asterisk-realtime]
Description = Asterisk Realtime MariaDB Connection
Driver = MariaDB
Server = 127.0.0.1
Port = 3306
Database = asterisk_db
User = asterisk_user
Password = StrongSqlDbPass2025!
Socket = /var/run/mysqld/mysqld.sock
Option = 3Проверьте связность утилитой isql:
isql -v asterisk-realtime3. Конфигурация модулей Asterisk: res_odbc.conf и res_config_odbc.conf
В файле /etc/asterisk/res_odbc.conf:
[asterisk-connector]
enabled => yes
dsn => asterisk-realtime
max_connections => 20
pre-connect => yes
username => asterisk_user
password => StrongSqlDbPass2025!Свяжите объекты PJSIP с таблицами БД в /etc/asterisk/extconfig.conf:
[settings]
ps_endpoints => odbc,asterisk-connector,ps_endpoints
ps_auths => odbc,asterisk-connector,ps_auths
ps_aors => odbc,asterisk-connector,ps_aors
ps_domain_aliases => odbc,asterisk-connector,ps_domain_aliases
ps_endpoint_id_ips => odbc,asterisk-connector,ps_endpoint_id_ips
extensions => odbc,asterisk-connector,extensions_table4. Структура SQL таблиц для динамического абонента
CREATE TABLE ps_endpoints (
id VARCHAR(40) PRIMARY KEY,
transport VARCHAR(40),
aors VARCHAR(200),
auth VARCHAR(40),
context VARCHAR(40),
disallow VARCHAR(200) DEFAULT 'all',
allow VARCHAR(200) DEFAULT 'alaw,ulaw',
direct_media ENUM('yes', 'no') DEFAULT 'no'
);
CREATE TABLE ps_auths (
id VARCHAR(40) PRIMARY KEY,
auth_type ENUM('userpass', 'md5') DEFAULT 'userpass',
password VARCHAR(80),
username VARCHAR(40)
);
CREATE TABLE ps_aors (
id VARCHAR(40) PRIMARY KEY,
max_contacts INT DEFAULT 1,
remove_existing ENUM('yes', 'no') DEFAULT 'yes'
);5. Проверка статуса Realtime в консоли Asterisk
# Проверка статуса подключения ODBC
asterisk -rx "odbc show asterisk-connector"
# Поиск динамического эндпоинта в БД
asterisk -rx "realtime load ps_endpoints id 101" Частые вопросы (FAQ)
В чем разница между Static Realtime и Dynamic Realtime?
Static Realtime загружает конфигурационные файлы из БД только в момент старта или по команде reload. Dynamic Realtime делает запрос в базу на каждый входящий/исходящий запрос SIP-сессии в реальном времени.
Что произойдет с телефонной связью, если упадет сервер СУБД MySQL?
Текущие активные разговоры продолжат работать, но совершение новых вызовов и регистрация телефонов станут невозможными. Рекомендуется использовать репликацию баз данных (Galera Cluster / Master-Slave).
Как очищать устаревшие динамические контакты в таблице ps_contacts?
Asterisk самостоятельно удаляет просроченные контакты по истечении срока аренды (expiration). Также рекомендуется настроить кэширование sorcery в sorcery.conf.
Как ускорить работу Realtime при тысячах SIP-абонентов?
Включите пул постоянных соединений (max_connections в res_odbc.conf), создайте индексы по столбцам 'id' во всех таблицах ps_* и активируйте кэширование sorcery с коротким TTL.