Оптимизация работы с базой данных
Вы можете пропусить этот раздел при первичной настройке системы.
При обсчёте сессий в реальном режиме времени происходит значительная нагрузка на базу данных. Постоянно обновляются таблицы log_session, session_detail, session_account, contract_balance, contract_account.
В таблицу session_detail_<mid>_yyyyMM производится запись объёма потреблённых по ходу сессии услуг с разбивкой по часам. Возможно снизить число обновлений таблицы, отменив запись по некоторым тарифицируемым по нулевой стоимости и не нужных услуг (например, время при тарификации трафик). Также возможно сгруппировать записи, например, по суткам, если тарифные планы не предполагают различную стоимость услуг по времени суток. Правила "свёртки" таблицы session_detail определяются в конфигурации модуля следующим образом:
detail.compress.<sid>.<hour_range>=<rule>
Где:
<sid> - числовой код услуги, запись о которой вносится в session_detail;
<hour_range> - диапазон часов, к которым относится правило;
<rule> - ключевое слово SKIP (пропуск обновления), либо час, в который преобразуется реальный час вносимой записи.
Например, для отброса записи в session_detail информации об услуге Время с кодом 2 и свёртке по суткам записей по наработке по услугам трафиков 23 и 24 определяются следующие правила:
detail.compress.
2
.
0
-
23
=
SKIP
detail.compress.
23
.
0
-
23
=
0
detail.compress.
24
.
0
-
23
=
0
В случае, если стоимость трафика изменяется от времени суток, возможно преобразование реального часа потребления услуги в час начала диапазона.
При безлимитных тарифах жёсткое фиксирование посчитанного по нулевой цене трафика в session_detail не обязательно, информация может быть сохранена в конце часа, либо сессии. Так же не требуется постоянное обновление таблицы log_session (стоимость сессии и время её окончания). Для включения отложенного обновления таблиц session_detail и log_session возможно определение в узле Конфигурация тарифного плана следующих правил:
session_detail.delayed.update=
1
log_session.delayed.update=
1
При необходимости можно добавить только одну из строк.
Установка опции в значение 0, равно как и в любое другое, не отключает ее! Для отключения необходимо удалить, либо закомментировать строку символом # в начале строки.
На снимке экрана ниже изображён узел в тарифном плане.
Отложенное обновление таблицы log_session может происходить только при нулевом приращении стоимости сессии. Отложенное обновление таблицы session_detail при ненулевых тарифных планах также возможно, однако следует учитывать следующие нюансы:
При обсчёте трафика по RADIUS-атрибутам при перезагрузке BGRadiusDialup произойдёт потеря трафика, при восстановлении сессии средства за этот трафик будут начислены повторно;
При тарификации трафика по NetFlow-данным в случае перезагрузки BGRadiusDialup произойдёт просто потеря накопленного счётчике в памяти трафика;
При использовании тарифов с узлом Диапазон наработки инициализация тарифа при старте сессии происходит по таблице session_detail, при нескольких параллельных сессиях одного договора возможна несколько некорректная тарификация. Тариф будет инициализироваться недостаточной наработкой. Проблема может быть решена переобсчётом в конце месяца всех сессий.