ClickHouse и Журналы регистрации 1С: анализ в реальном времени – опыт Magnit Tech

28.02.26

База данных - Журнал регистрации

Полнотекстовый поиск в миллионах записей журнала регистрации 1С может занимать минуты или даже часы, а стандартные инструменты не позволяют эффективно выполнять агрегации и анализировать данные на больших объемах. Расскажем о том, как с помощью ClickHouse обеспечить практически мгновенный разбор инцидентов, настроить мониторинг и автоматическую реакцию на события журнала регистрации.

Меня зовут Юлия Даскаль, я работаю ведущим разработчиком в Центре экспертизы 1С компании Magnit Tech.

Хочу рассказать о том, как нам удалось победить нашу боль и наладить работу с огромнейшими журналами регистрации.

 

 

Немного о ситуации в «Магните»:

  • У нас более 50 баз 1С, некоторые из которых имеют очень большие журналы регистрации.

  • Суммарно в месяц накапливается около 2 ТБ логов. Это просто огромнейший объем информации, в котором часто бывает сложно найти то, что нужно.

  • При таких объемах поиск одного события в стандартном журнале регистрации 1С может занимать больше часа. А нам такие скорости не подходят – для нас важно получать информацию максимально оперативно.

  • Кроме этого, регулярно возникают задачи, когда нужно сагрегировать данные – например, по событиям или по действиям пользователей – а стандартный журнал регистрации такой возможности не предоставляет.

Поэтому мы стали искать решение: анализировали рынок, изучали опыт других компаний, сравнивали инструменты – и в итоге остановились на ClickHouse.

 

 

ClickHouse – это колоночная СУБД, которая изначально была разработана в Яндексе для Яндекс.Метрики, а позже выделилась в отдельный проект, став доступной для всех.

  • ClickHouse распространяется с открытым исходным кодом под лицензией Apache License 2.0, что подразумевает бесплатное коммерческое использование.

  • Одна из ключевых особенностей ClickHouse – это колоночное хранение данных. В отличие от классических СУБД, где данные хранятся построчно, ClickHouse хранит информацию в колонках. Это существенно ускоряет выполнение запросов, поскольку система считывает только необходимые столбцы и отбрасывает ненужные данные.

  • ClickHouse поддерживает различные кодеки сжатия данных.

  • Индексы в нем построены так, что позволяют при выполнении запросов исключать из обработки ненужные блоки данных.

  • Еще одно преимущество – поддержка распределенных запросов «из коробки». Мы можем развернуть ClickHouse в кластере и выполнять запросы к данным различных серверов параллельно.

  • Кроме того, ClickHouse позволяет работать с данными практически в реальном времени – они доступны сразу после загрузки, не нужно ничего ждать и дополнительно обрабатывать.

  • И у ClickHouse более 30 видов движков хранения с различными особенностями записи, хранения и обработки данных. Поэтому критически важно правильно выбрать движок на этапе проектирования, поскольку это напрямую влияет на производительность при выполнении запросов.

  • Сфера применения у ClickHouse довольно широкая: это и хранение логов (как в нашем случае), и бизнес-аналитика, и мониторинг, и работа с Big Data.

 

 

У многих может возникнуть вопрос: почему ClickHouse, а не ElasticSearch? Мы тоже задавались этим вопросом, и окончательно определились после сравнения производительности этих двух систем, которое приводится в статье на Инфостарте – большое спасибо автору за подробный анализ.

Если коротко:

  • ElasticSearch отлично подходит для полнотекстового поиска.

  • Но в задачах агрегации ClickHouse значительно превосходит по скорости.

  • Кроме того, ClickHouse эффективнее сжимает данные, что обеспечивает более компактное хранение.

  • А еще ElasticSearch более ресурсоемкий, потому что вынужден дополнительно расходовать оперативную память для поддержания индекса полнотекстового поиска в актуальном состоянии.

 

 

ClickHouse идеально подходит для журнала регистрации 1С:

  • Колоночная структура ClickHouse не приспособлена к частым изменениям данных – стандартные операции UPDATE приводят к пересборке затронутых данных, а это ресурсозатратно и неэффективно. Но в случае с логами 1С нам и не нужно ничего менять – мы производим только сбор и хранение событий.

  • У журнала регистрации фиксированная структура полей, которую легко переложить на табличное хранение.

  • За счет того, что в журнале регистрации большинство полей содержат неуникальные и часто повторяющиеся данные, мы можем их эффективно сжимать в ClickHouse.

  • К тому же, журнал регистрации редко используется для полнотекстового поиска – нам, в основном, нужны отборы по конкретным полям. Даже если требуется отбор по полю комментария, достаточно поиска по подстроке.

 

 

Существует несколько способов выгрузки данных из 1С в ClickHouse.

  • Использование REST-интерфейса ClickHouse. Это базовый способ взаимодействия, но у него есть существенный недостаток – в этом случае нагрузка ложится непосредственно на сервер приложений 1С, а мы такие риски себе позволить не можем, так как логи у нас достаточно большие.

  • Подключение через ADODB – этот вариант, к сожалению, тоже не подходит, поскольку не поддерживает кроссплатформенность.

  • Различные готовые решения из репозиториев на GitHub – с ними тоже, к сожалению, часто случаются проблемы:

    • Такие инструменты сложно поддерживать и изменять, потому что они написаны на различных языках, для которых у нас не всегда есть необходимые компетенции.

    • Часто нет документации, или она недостаточно информативная.

    • Нет возможности настраивать и распараллеливать нагрузку на разбор.

    • И, к сожалению, часто бывает низкая производительность.

  • Специализированное ПО, которое забирает логи из одного источника, преобразует в нужный формат и отправляет в целевую систему – к таким инструментам относятся, в частности, Vector и Fluent Bit.

 

 

В итоге мы выбрали Vector, потому что у него есть ряд серьезных преимуществ:

  • Поддержка сложных архитектурных схем – возможность подключать различные очереди и дополнительные инстансы, переносить нагрузку с сервера приложений 1С на отдельный сервер.

  • Широкие возможности по разбору и трансформации логов – для Vector можно написать собственные правила для парсинга и преобразования полей в нужный формат, управлять логикой обработки и структурой итоговых данных.

  • Многопоточность – Vector способен отправлять данные в разные системы одновременно. Например, мы одним и тем же процессом Vector на одном сервере отправляем данные журнала регистрации в ClickHouse, а данные технологического журнала – в OpenSearch.

  • По сравнению с ibcmd (утилитой администрирования автономного сервера) Vector работает быстрее, и итоговый файл логов получается значительно меньше по весу – например, исходный файл логов весом 600 МБ после трансформирования через ibcmd начинает весить 4 ГБ. Это связано с тем, что ibcmd заменяет в итоговом файле логов все идентификаторы на представления – за счет этого файл пухнет и становится очень большим. Подробнее об этих особенностях и сравнении ibcmd с Vector можно прочитать в статье на Инфостарте.

  • Нет ощутимой нагрузки. Например, у нас Vector развернут на сервере приложений 1С и несмотря на огромные объемы разбираемых логов – до 6000 записей в секунду (в среднем около 1500) – заметного влияния на производительность не наблюдается.

  • Быстрая обработка и отправка данных. Среднее время обработки логов – от появления события в журнале регистрации до его попадания в ClickHouse – максимум 3 минуты, а часто и меньше.

Подробнее о нашем опыте работы с Vector рассказал Александр Леонов.

 

 

Сервер для ClickHouse у нас имеет следующие характеристики:

  • 4 ядра CPU.

  • 16 ГБ оперативной памяти.

  • Диск объемом 1 ТБ.

Справа показана структура таблиц журнала регистрации по одной из баз. В ClickHouse у нас хранятся данные журнала за год, всего они занимают 132 ГБ, из них больше всего – в таблице lgp. При этом сама исходная база данных, из которой собирается этот журнал регистрации, занимает около 80 ТБ.

 

 

Расскажу подробнее про структуру таблиц.

  • В таблице error хранятся ошибки парсинга файла логов – например, если при парсинге Vector не смог корректно обработать и загрузить запись журнала в основную таблицу, информация об ошибке попадает сюда.

  • В таблице lgf хранятся идентификаторы ссылок, используемые в основной таблице логов, и их текстовые представления. Благодаря тому, что в основной таблице логов используются именно идентификаторы, удалось сократить ее объем примерно на 30%. При этом за получение журнала регистрации в человекочитаемом виде приходится «платить» – соединяться с этой таблицей и получать все представления.

 

 

  • Таблица lgp – основная, в ней хранятся абсолютно все события журнала регистрации, поэтому она и занимает больше всего места в базе. На слайде показаны топ-5 наиболее частых событий – видно, что на первом месте событие _$Data$_Update, апдейты данных.

 

 

Кроме этого, у нас есть две таблицы материализированных представлений (MatView), в которые сохраняются результаты запросов для ускорения доступа к данным.

  • mv_lgp_minute – содержит уже сагрегированные данные в разрезе минут. Далее я расскажу подробнее, для чего мы так сделали.

  • mv_session – хранит информацию о пользовательских сессиях с датой начала и датой окончания.

 

 

Теперь о том, какими способами можно получить обработанные данные из ClickHouse обратно в 1С.

  • Через внешние источники данных – но это требует настройки сервера приложения 1С.

  • Через COM или ADODB – у нас в компании этот способ запрещен, в частности, из-за отсутствия кроссплатформенности и из-за того, что различные базы используют различные версии платформы, и это тоже накладывает свои сложности.

  • Напрямую через REST API ClickHouse – это наиболее удобный и гибкий способ, и именно его мы и использовали.

Для получения через REST API обработанных данных из ClickHouse мы написали обработку, которая может использоваться в любой конфигурации. В ней можно формировать отчеты, настраивая для них различные отборы; сохранять и выбирать варианты; заменять GUID на человекочитаемые представления.

Основная цель этой обработки – это работа с журналом регистрации в 1С таким же образом, как и со стандартным журналом регистрации.

 

 

Но если нам нужно получить из ClickHouse более сложные агрегации, мы обращаемся к другим инструментам:

  • Например, у ClickHouse есть веб-интерфейс в браузере – там можно выполнять любые SQL-запросы.

  • Можно подключить базу ClickHouse к DBeaver – он также позволяет просмотреть структуру таблиц, узнать их размер и выполнить любые сложные запросы с агрегациями.

  • Можно читать данные из 1С через REST API – для этого мы, в частности, используем нашу обработку.

  • Или подключиться к ClickHouse напрямую из Grafana, чтобы тоже выполнять там запросы или анализировать данные на дашбордах.

 

 

Теперь о том, как мы используем наш журнал регистрации в ClickHouse.

  • Мы разбираем инциденты ИБ – смотрим, кто изменил тот или иной элемент справочника, зашел под админскими правами или что-то удалил, в общем, сделал что-то не так. Раньше это было очень сложно: приходилось восстанавливать журналы регистрации из архива, подключать их к 1С, настраивать отборы, долго ждать (около часа). А если сразу разобраться не получалось или требовалось проверить еще какие-то гипотезы, приходилось делать все это заново. Сейчас сотрудники сопровождения используют готовый запрос к ClickHouse, меняют параметры на нужные и за 30 секунд получают результат. Они очень рады.

  • Статистика работы пользователей – мы можем анализировать производительность сотрудников: кто сколько создал документов, сколько создал элементов справочников.

  • Дашборды в Grafana – дальше я покажу их и расскажу, как мы их используем.

  • И анализ демографии данных – при запуске новых интеграционных потоков часто требуется оценить: какие данные чаще всего изменяются, как часто, в каком объеме и сколько среди них уникальных значений. На слайде как раз показано, что когда мы собирали демографию данных из журнала регистрации стандартными средствами – без детализации до объектов, без сбора уникальных записей – это занимало около часа. Сейчас же демография данных у нас считается по уникальным записям и занимает примерно 15 секунд.

 

 

Вот так выглядят наши дашборды в Grafana.

Удобно, что Grafana интегрируется с ClickHouse напрямую – ей не нужны никакие прослойки. Заходим в интерфейс, пишем запрос, получаем данные и можем их визуализировать.

Анализируя данные журнала регистрации, мы можем отслеживать наличие или отсутствие определенных событий, видеть их длительность и интенсивность, оценивая число новых документов в час или в минуту, контролировать различные показатели системы.

Однако при построении некоторых дашбордов мы столкнулись с проблемой производительности: часть визуализаций не успевала выполняться и завершалась по таймауту.

Для решения этой проблемы мы добавили материализованное представление mv_lgp_minute, которое содержит уже сагрегированные данные в разрезе минут. Теперь запросы выполняются не к «сырым» данным, а к предварительно агрегированным, что позволяет ускорить формирование визуализаций и стабилизировать работу дашбордов.

 

 

А материализованное представление mv_session мы используем для отслеживания критически важных событий – например, чтобы знать о входе пользователя под админскими правами или о возникновении ошибки в одном из ключевых процессов.

Дело в том, что ClickHouse не поддерживает триггеры в классическом понимании. Однако есть альтернативные решения:

  • Использовать материализованное представление и через него передавать данные в классическую СУБД – PostgreSQL, MySQL, MS SQL – а там уже можно использовать триггеры.

  • Настроить отправку из материализованного представления в Kafka и подключить внешний скрипт для обработки очереди. На GitHub вы можете скачать пример реализации такого триггера: при появлении определенных событий через Materialized View данные отправляются в Kafka, после чего внешний скрипт считывает сообщения из очереди и выполняет необходимые действия – например, отправляет информацию в Sentry и уведомляет о событии через Telegram или email.

  • Настроить триггеры на стороне Grafana – задать критические значения показателей и реагировать на их превышение.

Таким образом ClickHouse позволил нам превратить журнал регистрации из проблемы в источник новых возможностей.

 

Вопросы и ответы

 

Что такое демография данных и для чего она используется?

Анализ демографии данных требуется при проектировании новых интеграционных потоков. У нас большие базы, и при запуске интеграции важно понимать реальный объем изменений, чтобы правильно выбрать инструмент.

Например, мы знаем, что за день у нас было 80 000 изменений документов. Но при анализе выясняется, что уникальных объектов – всего 10 000. Это означает, что фактически нужно передавать не 80 000 записей, а 10 000. Соответственно, можно выбрать более экономичный сценарий выгрузки – например, выполнять ее пакетно в конце дня.

Из стандартного журнала регистрации на наших объемах запросов было невозможно получить количество уникальных записей – запрос просто падал. Сейчас такой расчет занимает около 15 секунд вместо часа.

Что такое материализованное представление?

Материализованное представление задает запрос с правилами обработки данных, поступающих в исходную таблицу. При добавлении новых записей ClickHouse автоматически применяет этот запрос и сохраняет результат в отдельной таблице.

В нашем случае при вставке данных в исходную таблицу они автоматически агрегируются и сохраняются в таблице материализованного представления. В дальнейшем эти заранее подготовленные данные можно переиспользовать.

Вы сказали, что в ClickHouse более 30 движков хранения для таблиц. Какой движок вы в итоге используете?

Для основных таблиц у нас в ClickHouse используется движок MergeTree – он самый распространенный и универсальный, покрывает большую часть задач.

Насколько оправдано вынесение представлений в отдельную таблицу и использование соединений, вместо того чтобы обогащать основную таблицу?

Это осознанное решение, за счет которого мы смогли сократить основную таблицу примерно на 30%, потому что ClickHouse эффективнее сжимает короткие идентификаторы, чем текстовые представления.

Да, для получения человекочитаемого вида приходится выполнять соединения, но экономия объема это оправдывает.

Вы сказали, что в качестве движка, который загружает логи в ClickHouse, выбрали Vector. Чем вас не устроили Fluent Bit или Fluentd?

По сравнению с Fluent Bit Vector требует меньше ресурсов и значительно производительнее. К тому же Vector позволяет реализовывать сложные архитектурные схемы, описывать правила преобразования. В нашем случае это критично, поскольку у нас большие объемы логов.

Мы для выгрузки в ClickHouse используем экспортер от Евгения Акпаева, и у него есть проблема: если в журнале регистрации возникает событие «журнал регистрации поврежден», он перестает его читать и экспортировать. У Vector нет таких проблем? Или у вас журнал никогда не повреждается?

Vector корректно обрабатывает ошибки. Если при разборе возникает проблема, запись попадает в таблицу errors, откуда ее можно дополнительно проанализировать и обработать.

У вас Vector крутится как сервис на каждом сервере приложений 1С? Или где он вообще находится?

Да, Vector запущен на той же машине, что и один из серверов приложений 1С. И несмотря на наши большие объемы данных, он не оказывает существенной нагрузки на систему. Поэтому пока нам достаточно. А вообще у Vector есть возможности для масштабирования, и в дальнейшем мы можем его вынести отдельно или развернуть на несколько серверов.

Вы на каждую базу 1С создаете отдельную базу в ClickHouse?

Да, для каждой базы 1С у нас отдельная база в ClickHouse.

Как вы подключаете новые базы ко всему этому конвейеру?

Мы создаем базы и их таблички в ClickHouse вручную. Никакой автоматизации в этом плане пока нет. Но да, в дальнейшем мы планируем перейти на подход Infrastructure as Code и использовать шаблонные конфигурации с переменными окружения.

Что происходит с исходными файлами журнала регистрации 1С после того, как вы их экспортируете в ClickHouse?

У нас есть отдельные регламенты, которые по прошествии определенного периода времени уже чистят этот журнал. Но в момент, когда событие отправляется в ClickHouse, с данными журнала регистрации ничего не происходит

А чистите как, кодом? Или через команду Сократить для журнала регистрации в конфигураторе?

Нет, просто удаляем файлы.

Но для удаления файлов журнала нужно же останавливать службу в 1С. Останавливаете? Или можно на лету как-то удалить?

Останавливаем. И удаляем, используя пакетный режим конфигуратора с параметром запуска ReduceEventLogSize.

 

*************

Статья написана по итогам доклада (видео), прочитанного на конференции INFOSTART TECH EVENT.

 

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Журнал регистрации Системный администратор 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)

История изменений реквизитов и табличных частей справочников, документов, независимых регистров сведений, возможность отката изменения, восстановление удаленных объектов, сбор статистики использования базы 1С. Альтернативный журнал регистрации.

23180 руб.

22.02.2018    38128    62    56    

58

Журнал регистрации Системный администратор 1С:Предприятие 8 1C:Бухгалтерия Платные (руб)

Конфигурация LogiCH эффективно решает проблему хранения и анализа записей журналов регистрации. Разработка использует столбцовую СУБД ClickHouse, одну из самых быстрых Big Data OLAP СУБД. Любой анализ журнала можно выполнить в одном отчете, в котором доступны все возможности СКД с учетом ограничений RLS. Количество подключаемых баз не ограничено и не влияет на скорость построения анализа.

6100 руб.

28.11.2018    23759    22    9    

49

Журнал регистрации Программист Россия Бесплатно (free)

В материале рассматривается сравнение двух инструментов для работы с журналом регистрации 1С: утилиты ibcmd и платформы Vector. Описаны их функциональные возможности, тестирование производительности и практическое применение для преобразования логов в формат JSON.

20.11.2024    6287    user1913000    13    

25

Журнал регистрации Тестирование QA Программист Бесплатно (free)

Поговорим про логирование в приложениях на базе 1С, рассмотрим проблемы, которые возникают при сборе информации из этих систем, и обсудим практический опыт применения внутренних и внешних инструментов для анализа логов.

21.10.2024    7660    leemuar    8    

24

Инструменты администратора БД Журнал регистрации Системный администратор 1С:Предприятие 8 1С:Управление торговлей 11 Абонемент ($m)

Внешняя обработка для регламентного сокращения журнала регистрации для конфигураций на базе БСП и платформы 8.3.20+

1 стартмани

29.12.2023    4750    55    dima_gsv    4    

14

Журнал регистрации Мониторинг Системный администратор Программист Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

19.11.2023    3883    9    AlexSTAL    0    

8

Мониторинг Журнал регистрации Технологический журнал Системный администратор Программист Абонемент ($m)

Как легко и быстро с помощью специализированных решений собирать, парсить и передавать логи и метрики.

1 стартмани

13.11.2023    8857    15    AlexSTAL    0    

48

Журнал регистрации Инструменты администратора БД Мониторинг Мессенджеры и боты Системный администратор Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х Абонемент ($m)

Внешняя обработка для БСП-конфигураций с простым программным интерфейсом. Предназначена для мониторинга состояния системы. Базово реализована отправка ошибок из журнала регистрации, но можно легко добавить мониторинг других журналов, каких-либо действий пользователей, состояния системы (например закрытие месяца).

3 стартмани

26.09.2023    5292    29    doom2good    16    

15
Для отправки сообщения требуется регистрация/авторизация