Работа ядра Mikbill через redis
В версии 3.14.04 вводится работа ядра через redis.
Данное решение позволит разгрузить потоки ядра от обработки accounting запросов (информация о сессиях) и полностью отдать их на обработку auth запросов (авторизация).
Техническая информация
Согласно rfc2866, ответ Accounting-Response не содержит никакой особой информации, кроме подтверждения успешного приёма запроса. В настоящее время ядро тратит ресурсы потоков, подключённых к RADIUS, на обработку Accounting-Request в режиме реального времени, из-за чего RADIUS может выдавать сообщения об ошибке "unresponsive child", так как этот дочерний процесс ожидает ответа от ядра, которое в это время занято обработкой Accounting (иногда обработка может занимать очень много времени). Всё это накапливается, как снежный ком, до тех пор, пока все потоки RADIUS не будут заняты обработкой запросов Accounting, в результате чего Auth-запросы остаются в очереди RADIUS, что приводит к проблемам с авторизацией и увеличению обращений клиентов в техническую поддержку.
Поэтому в версии 3.14.04 мы вводим в эксплуатацию сервер Redis, куда потоки ядра будут записывать запросы Accounting при получении, не тратя время на их обработку. Обработкой этих запросов будут заниматься специально выделенные для этого дочерние процессы, где время обработки не будет играть роли.
Также из-за того, что radius не совсем корректно определял дубликат запроса, был реализован собственный механизм кеширования ответов для случаев, если придет дубликат запроса. По умолчанию ответ сохраняется на 10 секунд (параметр reply_ttl).
Настройка
Необходимо установить redis сервер и модуль для php под названием php-redis, после чего запустить redis сервер не забыв добавить его в автозапуск.
После этого необходимо добавить в xml настройки admin.xml блок конфигурации:
<redis> <enabled>true</enabled> <ip>127.0.0.1</ip> <port>6379</port> <threads>4</threads> <queue>radius_accounting</queue> <reply_ttl>10</reply_ttl> </redis>
Данный блок нужно добавить под тегом </kernel> что бы получилось:
<config> <parameters> <mysql> ... </mysql> ... <kernel> ... </kernel> <redis> <enabled>true</enabled> <ip>127.0.0.1</ip> <port>6379</port> <threads>4</threads> <queue>radius_accounting</queue> <reply_ttl>10</reply_ttl> </redis> ... </parameters> </config>
После чего нужно поставить пре-релиз 3.14.04 либо релиз версию не меньше этой и перезапустить ядро биллинга:
service mikbill restart
В логе ядра будут сообщения:
14.11.2024 13:37:02 Redis thread #1/4 (pid:23354) ready to work! 14.11.2024 13:37:02 Connected to redis successfully. 14.11.2024 13:37:02 Redis thread #2/4 (pid:23355) ready to work! 14.11.2024 13:37:02 Connected to redis successfully. 14.11.2024 13:37:02 Redis thread #4/4 (pid:23357) ready to work! 14.11.2024 13:37:02 Connected to redis successfully. 14.11.2024 13:37:02 Redis thread #3/4 (pid:23356) ready to work! 14.11.2024 13:37:02 Connected to redis successfully.
И после старта нового потока так же сообщение что он подключен к redis:
14.11.2024 13:37:28 Child 6 started 14.11.2024 13:37:28 Connected to redis successfully.
Отладка/наблюдение
В основном наблюдать нужно логи ядра что там нет сообщений об ошибках, увидеть статистику можно выполнив:
cd /var/www/mikbill/admin/app/lib php mikbill.php stat
Результат будет:
Accounting requests in queue: 0 Authorization reply cached: 24 ==================================== Accounting [1 min]: total=8241, rps=137.35 Accounting [5 min]: total=41211, rps=137.37 Accounting [10 min]: total=82111, rps=136.85 ==================================== Authorization [1 min]: total=156, rps=2.6 Authorization [5 min]: total=940, rps=3.13 Authorization [10 min]: total=1910, rps=3.18 ==================================== Authorization cache hit [1 min]: 210, rps=3.5 Authorization cache hit [5 min]: 968, rps=16.13 Authorization cache hit [10 min]: 1895, rps=31.58
если Accounting requests не успевает уменьшается до 0 а продолжает увеличиваться, то нужно увеличить кол-во threads в admin.xml и перезапустить ядро биллинга.
Если данная статистика нужна в форме JSON, то нужно выполнить
cd /var/www/mikbill/admin/app/lib php mikbill.php stat json
Результат будет:
{ "accounting": { "in_queue": 0, "statistic": { "1m": { "total": 7675, "rps": 127.92 }, "5m": { "total": 40542, "rps": 135.14 }, "10m": { "total": 82358, "rps": 137.26 } } }, "authorization": { "reply_cached": 24, "statistic": { "1m": { "total": 222, "rps": 3.7 }, "5m": { "total": 1122, "rps": 3.74 }, "10m": { "total": 2039, "rps": 3.4 } }, "cache_hits": { "1m": { "total": 193, "rps": 3.22 }, "5m": { "total": 964, "rps": 3.21 }, "10m": { "total": 1966, "rps": 3.28 } } } }