Интеграция Vector с ClickHouse
Возможность анализировать ваши логи в реальном времени критически важна для производственных приложений. Вы когда-нибудь задумывались, хорошо ли ClickHouse подходит для хранения и анализа логов? Просто посмотрите на опыт Uber по преобразованию своей инфраструктуры логирования с ELK на ClickHouse.
Этот гид показывает, как использовать популярный конвейер данных Vector для получения (tail) файла логов Nginx и отправки его в ClickHouse. Шаги, описанные ниже, будут аналогичны для получения любого типа файла логов. Мы предположим, что ClickHouse уже запущен и Vector установлен (пока его запускать не нужно).
1. Создать базу данных и таблицу
Давайте определим таблицу для хранения событий логов:
- Мы начнем с новой базы данных с именем
nginxdb
:
- Для начала мы просто вставим все событие лога в виде одной строки. Очевидно, это не лучший формат для выполнения аналитики по данным логов, но мы разберемся с этим ниже, используя материализованные представления.
На данный момент нет реальной необходимости в первичном ключе, поэтому ORDER BY установлен на tuple().
2. Настроить Nginx
Мы, конечно, не хотим тратить слишком много времени на объяснение Nginx, но также не хотим скрывать все детали, поэтому на этом этапе мы предоставим вам достаточно информации, чтобы настроить логирование в Nginx.
- Следующее свойство
access_log
отправляет логи в/var/log/nginx/my_access.log
в формате combined. Это значение добавляется в секциюhttp
вашего файлаnginx.conf
:
-
Не забудьте перезапустить Nginx, если вам пришлось изменить
nginx.conf
. -
Сгенерируйте несколько событий логов в журнале доступа, посетив страницы на вашем веб-сервере. Логи в формате combined имеют следующий формат:
3. Настроить Vector
Vector собирает, преобразует и маршрутизирует логи, метрики и трассировки (называемые источниками) множеству разных поставщиков (называемых приемниками), включая готовую совместимость с ClickHouse. Источники и приемники определяются в файле конфигурации с именем vector.toml.
- Следующий vector.toml определяет источник типа file, который получает конец my_access.log, и также определяет приемник как таблицу access_logs, определенную выше:
-
Запустите Vector, используя указанную выше конфигурацию. Посетите документацию Vector для получения дополнительной информации о том, как определить источники и приемники.
-
Проверьте, что логи доступа вставляются в ClickHouse. Выполните следующий запрос, и вы должны увидеть логи доступа в вашей таблице:

4. Обработка логов
Важно иметь логи в ClickHouse, но хранение каждого события в виде одной строки не позволяет проводить много аналитики данных. Давайте посмотрим, как парсить события логов, используя материализованное представление.
- Материализованное представление (коротко MV) — это новая таблица на основе существующей таблицы, и когда вставляются данные в существующую таблицу, новые данные также добавляются в материализованное представление. Давайте увидим, как определить MV, который содержит разобранное представление событий логов в access_logs, другими словами:
В ClickHouse есть различные функции для разбора строки, но для начала давайте рассмотрим splitByWhitespace — которая разбивает строку по пробелам и возвращает каждый токен в массиве. Для демонстрации выполните следующую команду:
Обратите внимание, что ответ довольно близок к тому, что нам нужно! У нескольких строк есть лишние символы, а пользовательский агент (детали браузера) не требует разбора, но мы разберемся с этим на следующем шаге:
- Подобно splitByWhitespace, функция splitByRegexp разбивает строку на массив на основе регулярного выражения. Выполните следующую команду, которая возвращает две строки.
Обратите внимание, что вторая строка — это пользовательский агент, успешно разобранный из лога:
- Перед тем, как рассмотреть финальную команду CREATE MATERIALIZED VIEW, давайте посмотрим на несколько дополнительных функций, используемых для очистки данных. Например,
RequestMethod
выглядит как "GET с нежелательной двойной кавычкой. Выполните следующую функцию trim, которая удаляет двойную кавычку:
- Строка времени содержит открывающую квадратную скобку и также не находится в формате, который ClickHouse может разобрать на дату. Однако если мы изменим разделитель с двоеточия (:) на запятую (,), то разбор будет работать отлично:
- Теперь мы готовы определить наше материализованное представление. Наша запись включает POPULATE, что означает, что существующие строки в access_logs будут обработаны и вставлены немедленно. Выполните следующий SQL-запрос:
- Теперь убедитесь, что это сработало. Вы должны увидеть логи доступа аккуратно разобранные по колонкам:

Урок выше сохранил данные в две таблицы, но вы можете изменить исходную таблицу nginxdb.access_logs
, чтобы использовать движок таблицы Null — разобранные данные все равно окажутся в таблице nginxdb.access_logs_view
, но необработанные данные не будут храниться в таблице.
Итог: Используя Vector, для которого требовалась всего лишь простая установка и быстрая настройка, мы можем отправлять логи с сервера Nginx в таблицу в ClickHouse. С помощью умного материализованного представления мы можем разобрать эти логи на колонки для упрощенной аналитики.