Перейти к основному содержимому
Перейти к основному содержимому

Интеграция Vector с ClickHouse

Community Maintained

Возможность анализа ваших журналов в реальном времени является критически важной для производственных приложений. Вы когда-нибудь задумывались, насколько хорошо ClickHouse справляется с хранением и анализом журналов? Просто посмотрите на опыт Uber по переходу от инфраструктуры ELK к ClickHouse.

Этот гид показывает, как использовать популярный конвейер данных Vector для отправки файла журнала Nginx в ClickHouse. Шаги ниже будут схожи для отправки любого типа файла журнала. Мы предположим, что ClickHouse уже запущен и Vector установлен (пока не нужно его запускать).

1. Создание базы данных и таблицы

Давайте определим таблицу для хранения событий журнала:

  1. Начнем с новой базы данных, названной nginxdb:

  2. Для начала мы просто вставим все событие журнала как одну строку. Очевидно, что это не лучший формат для анализа данных журналов, но мы разберемся с этой частью ниже, используя материализованные представления.

    примечание

    Пока нет необходимости в первичном ключе, поэтому ORDER BY установлен на tuple().

2. Настройка Nginx

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

  1. Свойство access_log отправляет журналы в /var/log/nginx/my_access.log в combined формате. Это значение помещается в раздел http вашего файла nginx.conf:

  2. Обязательно перезапустите Nginx, если вы изменили nginx.conf.

  3. Сгенерируйте несколько событий журнала в журнале доступа, посетив страницы на своем веб-сервере. Журналы в combined формате имеют следующий вид:

3. Настройка Vector

Vector собирает, преобразует и перенаправляет журналы, метрики и трассировки (называемые источниками) к различным поставщикам (называемым сборниками), включая встроенную совместимость с ClickHouse. Источники и сборники определяются в конфигурационном файле под названием vector.toml.

  1. Следующий vector.toml определяет источник типа file, который отслеживает конец my_access.log, и также определяет сборник как таблицу access_logs, определенную выше:

  2. Запустите Vector, используя приведенную выше конфигурацию. Посетите документацию Vector для получения дополнительных сведений о определении источников и сборников.

  3. Убедитесь, что журналы доступа вставляются в ClickHouse. Выполните следующий запрос, и вы должны увидеть журналы доступа в вашей таблице:

4. Парсинг журналов

Иметь журналы в ClickHouse — это здорово, но хранение каждого события как одной строки не позволяет проводить много анализа данных. Давайте посмотрим, как разобрать события журнала, используя материализованное представление.

  1. Материализованное представление (MV, для краткости) — это новая таблица, основанная на существующей таблице, и когда в существующую таблицу добавляются новые данные, новые данные также добавляются в материализованное представление. Давайте посмотрим, как определить MV, которая содержит разобранное представление событий журнала в access_logs, другими словами:

    В ClickHouse есть различные функции для разбора строки, но для начала давайте рассмотрим splitByWhitespace — которая разбивает строку по пробелам и возвращает каждый токен в виде массива. Чтобы продемонстрировать, выполните следующую команду:

    Обратите внимание, что ответ довольно близок к тому, что мы хотим! У некоторых строк есть лишние символы, и агентов пользователей (данные о браузере) не нужно было разбирать, но мы решим это на следующем шаге:

  2. Аналогично splitByWhitespace, функция splitByRegexp разбивает строку на массив на основе регулярного выражения. Выполните следующую команду, которая возвращает две строки.

    Обратите внимание, что вторая строка, возвращенная, является агентом пользователя, успешно разобранным из журнала:

  3. Прежде чем смотреть на финальную команду CREATE MATERIALIZED VIEW, давайте рассмотрим еще несколько функций, использованных для очистки данных. Например, RequestMethod выглядит как "GET с ненужной двойной кавычкой. Выполните следующую функцию trim, которая удаляет двойные кавычки:

  4. Строка времени имеет ведущую квадратную скобку и также не находится в формате, который ClickHouse может разобрать в дату. Однако, если мы изменим разделитель с двоеточия (:) на запятую (,), то разбор будет работать отлично:

  5. Теперь мы готовы определить наше материализованное представление. В наше определение включен POPULATE, что означает, что существующие строки в access_logs будут обработаны и вставлены сразу. Выполните следующий SQL-запрос:

  6. Теперь проверьте, что все сработало. Вы должны увидеть журналы доступа, красиво разобранные в столбцы:

    примечание

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

Резюме: Используя Vector, который требует лишь простой установки и быстрой конфигурации, мы можем отправить журналы с сервера Nginx в таблицу ClickHouse. Используя умное материализованное представление, мы можем разобрать эти журналы в столбцы для облегчения аналитики.