В высоконагруженных клиент-серверных базах 1С:Предприятие администраторы часто сталкиваются с ситуацией, когда при попытке зайти в журнал регистрации, выполнить отбор или просмотреть историю событий весь кластер перестает отвечать. Пользователи массово встают в очередь ожиданий, сеансы зависают, а система восстанавливает работоспособность только после аварийного завершения процесса менеджера кластера. Рассмотрим подробно, почему возникает эта проблема и как правильным образом настроить журнал регистрации для стабильной работы системы.
Выясним причину, по которой чтение логов способно остановить работу сотен активных сеансов. В платформе 1С:Предприятие 8.3 существует два формата хранения журнала регистрации: классический текстовый формат (файлы с расширением .lgf и .lgp) и новый формат на базе СУБД SQLite (файл 1Cv8.lgd).
При использовании формата SQLite центральным звеном работы с логами выступает менеджер кластера rmngr. Взаимодействие процессов происходит следующим образом:
rmngr начинает считывать данные из монолитного файла 1Cv8.lgd и запрашивает блокировку SQLite.rphost, выполняющие операции пользователей (проведение документов, запись элементов), обязаны синхронно фиксировать события в журнале регистрации.rphost не могут записать новые события и встают в очередь ожидания блокировки.Проблема не зависит от того, вынесен ли каталог кластера reg_1541 на отдельный быстрый SSD-диск. Вынос каталога оптимизирует дисковый ввод-вывод (I/O), но не устраняет архитектурное ограничение механизмов блокировки внутри самой СУБД SQLite при взаимодействии rmngr и rphost.
Наиболее надежным и проверенным решением является возврат журнала регистрации к классическому формату с разделением данных по периодам (дням или неделям).
Разберем по шагам, как перевести журнал регистрации в классический формат:
1Cv8.lgd.Важное примечание: классический формат создает отдельный файл журнала для каждого дня (или другого выбранного периода). При выполнении отборов за конкретную дату менеджер кластера читает только один небольшой файл, не блокируя работу остальных процессов и не вызывая каскадного зависания сеансов.
Если журнал регистрации растет до размеров в десятки и сотни gigabyte, необходимо проанализировать, какие именно данные в него записываются. Зачастую существенную долю объема занимают рутинные операции, не несущие высокой ценности для аудита.
Проанализируем варианты оптимизации состава записываемых событий:
В случаях, когда моментальный перевод на формат .lgf невозможно выполнить немедленно, требуется провести техническое обслуживание файла 1Cv8.lgd. Удаление старых записей средствами платформы не уменьшает физический размер файла на диске из-за особенностей работы SQLite.
Для освобождения дискового пространства и перестроения индексов выполним сжатие базы SQLite:
1C:Enterprise 8.3 Server Agent).rmngr и rphost полностью завершили работу.sqlite3 и выполним команду упаковывания файла журнала:
sqlite3 "C:\ProgramData\1C\1cv8\reg_1541\bb8e...\1Cv8.lgd" "VACUUM;"
VACUUM на диске должно быть достаточно свободного места — не менее размера самого файла журнала.При аварийном завершении процесса rmngr структура файла 1Cv8.lgd может повредиться (ошибка вида database disk image is malformed). В этом случае помогает выгрузка дампа базы с помощью команды .dump консоли sqlite3 и последующее воссоздание файла лога из полученного SQL-скрипта.
Посмотрим на рекомендации разработчиков платформы для крупного бизнеса. Начиная с версии платформы 8.3.22, поддержка формата SQLite (.lgd) была официально прекращена.
Для корпоративных систем высокой нагрузки рекомендуется использовать следующие архитектурные практики: