Задействовали вот такую схему:
http://bgbilling.ru/v5.1/doc/ch12s09s04 ... abase_workУказываем в конфиге тарифа:
session_detail.delayed.update=1
log_session.delayed.update=1
Тогда апдейты по сессиям dialup на этих тарифах не вызывают каждый раз тарификации и обновления таблиц биллинга.
Удобно для безлимитчиков, разгружает сервер радиуса. Данные заносятся только по stop-пакету. Правда есть косметическое неудобство: для активных сессий время окончания сессии во всех логах пишется по первому пришедшему апдейту, что вводит многих в заблуждение.
Но вчера столкнулись с гораздо большей проблемой:
при перезагрузке радиус-сервера текущие активные сессии сами восстанавливаются, при этом время последнего апдейта берется из поля session_stop таблицы log_session, где оно у нас не обновляется до стопа. В результате при следующем проходе чекера зависших соединений такие сессии сбрасываются.
Например:
Код:
01-31/16:08:22 INFO [radiusListener-p-4-t-276] connections - [ xxx; ppvasya; 68839 ] DialUpNASConnection update connection..
01-31/16:08:22 INFO [radiusListener-p-4-t-276] connections - [ xxx; ppvasya; 68839 ] Taking zone default from response on calculate sid=15
01-31/16:08:22 INFO [radiusListener-p-4-t-276] connections - [ xxx; ppvasya; 68839 ] Taking zone default from response on calculate sid=15
^ - апдейт приходит, но не обсчитывается, т.к. безлимитчик
01-31/16:30:35 INFO [Thread-261] connections - [ xxx; ppvasya; 68839 ] Set status SUSPENDED on UpdateSuspendedSetter, time after last update: 1333
^ - сервак подвис, забив все коннекшены (из-за другой проблемы), апдейт в 16:23 был, но не обработался, коннект помечается подвисшим, т.к. время с последнего апдейта =1333 сек (22 мин)
-- в 16:35 перегружаем радиус --
01-31/16:36:55 INFO [pool-3-thread-1] connections - [ xxx; ppvasya; 15762 ] Taking zone default from response on calculate sid=15
01-31/16:36:55 INFO [pool-3-thread-1] connections - [ xxx; ppvasya; 15762 ] Taking zone default from response on calculate sid=9
01-31/16:36:55 INFO [pool-3-thread-1] connections - [ xxx; ppvasya; 15762 ] Taking zone default from response on calculate sid=7
01-31/16:36:55 INFO [pool-3-thread-1] connections - [ xxx; ppvasya; 15762 ] Taking zone default from response on calculate sid=10
01-31/16:36:55 INFO [pool-3-thread-1] connections - [ xxx; ppvasya; 15762 ] Taking zone default from response on calculate sid=8
01-31/16:36:55 INFO [pool-3-thread-1] connections - [ xxx; ppvasya; 15762 ] Taking zone default from response on calculate sid=140
01-31/16:36:55 INFO [pool-3-thread-1] connections - [ xxx; ppvasya; 15762 ] Taking zone default from response on calculate sid=141
01-31/16:36:55 INFO [pool-3-thread-1] connections - [ xxx; ppvasya; 15762 ] DialUpNASConnection startConnection mode=1
01-31/16:36:55 INFO [pool-3-thread-1] connections - [ xxx; ppvasya; 15762 ] Zone on start default
01-31/16:36:55 INFO [pool-3-thread-1] connections - [ xxx; ppvasya; 15762 ] IP address register on collector
01-31/16:36:55 INFO [pool-3-thread-1] connections - nas-1 Session restored for login: ppbaimos; contract: xxx; ipaddr: x.x.x.x; count: 1516
^ - сессия восстановлена после ребута радиуса, счетчик last update time для неё берется из базы (stop_time там = времени первого апдейта = start_time + 15 мин)
01-31/16:37:17 INFO [Thread-84] connections - [ xxx; ppvasya; 15762 ] Set status SUSPENDED on UpdateSuspendedSetter, time after last update: 10541
^ - сессия помечается подвисшей, т.к. якобы с апдейтов не было уже 10541 сек (почти 3 часа), хотя на самом деле они были
01-31/16:38:15 INFO [Thread-64] connections - [ xxx; ppvasya; 15762 ] Removing as zombi..
01-31/16:38:15 INFO [Thread-64] connections - [ xxx; ppvasya; 15762 ] Dropping connection
01-31/16:38:15 INFO [Thread-64] connections - [ xxx; ppvasya; 15762 ] DialUpNASConnection stoppingConnection
01-31/16:38:15 INFO [Thread-64] connections - [ xxx; ppvasya; 15762 ] DialUpNASConnection has stop Packet => false
01-31/16:38:15 INFO [Thread-64] connections - [ xxx; ppvasya; 15762 ] IP address unregistred from collector
^ - соединение сбрасывается в биллинге, но остаётся на NAS-е.
Т.е. это даже не баг, а логическая нестыковка delayed.update и ребута радиуса.
Что можно сделать с этим? Может как-то писать время стопа сессий? Скажем, периодическим проcтавлять в базу session_stop для активных сессий?