Меня зовут Дима Синявский, я SRE-инженер в Vi.Tech — это IT-дочка ВсеИнструменты.ру. В этой статье расскажу я вам о том как мы развивались и с нами развивалась наша система логирования. Почему вам нужен Vector.dev + Clickhouse для хранения и когда это выгодно.

Когда компания была маленькой нам хватало и блокнота, чего сейчас уже не скажешь.
У нас 931 000 пайплайнов в месяц, 4 кластера Kubernetes: от 170 до 190 нод в каждом, и 200 ГБ логов ежедневно.

Начало пути

Когда вы маленькая компания — у вас может быть один-три сервера, которые стоят прямо у вас в офисе. Вашим инженерам и разработчикам достаточно просматривать логи прямо на них. Для этого как никогда лучше подходит он:

cat
cat

Конечно, вы не стоите на месте и вскоре логи начинают расти, расти, расти... и на помощь приходит он:

grep
grep

Рост продолжался. И вот у нас уже поднимаются кластера Kubernetes, приложения расползаются каждый в свой pod — логов становится еще больше! Больше логов богу логов! Конечно, с grep тут уже по консолям не напрыгаешься.

grep-ать по логам pod-ов
grep-ать по логам pod-ов

Как?! У нас уже кластер, а логи все еще неудобно искать?

Что первое что мы находим, когда ищем "Что взять для сбора логов в кластере Kubernetes?"

Типичный запрос ищущего, чем бы собрать логи
Типичный запрос ищущего, чем бы собрать логи

Мы также поискали и нашли популярное решение на базе Elastic, FluentD, Kibana (EFK). Это было бесплатно и хорошо описано, как поставить и настроить. Так мы и познакомились с стеком Elastic в 2018 году. И достаточно хорошо жили с ним. FluentD собирал нам логи, разработчики радостно искали их через Kibana, а DevOps обслуживали всё это, и все были довольны.

Наше знакомство в Elastic стеком для логов
Наше знакомство в Elastic стеком для логов

В это время у нас уже почти все приложения переехали в Kubernetes и все это работало на двух физических дата-центах (ЦОД).

3 года с Elastic - полет нормальный! Или нет?

Наша компания росла и росла, а мир вокруг менялся и создавал все новые сложности.

В 2021 году EFK стал для нас тяжелым и дорогим, а FluentD преподносил сюрпризы

  • Elastic вырос с 4 до 18 нод

  • Затраты увеличились почти в 5 раз: с 45 тыс. руб. за 2 ноды в 2 ЦОДах (180 тыс. руб.) до 45 тыс. руб. за 6 нод в 3 ЦОДах (810 тыс. руб.).

  • Мы храним логи только за последние 5 часов. К тому же, FluentD теряет логи при отправке.

Поиск возможных решений. Почему Vector и ClickHouse

На момент выбора решения нас ограничивали внешние факторы, в том числе лимит на расширение ресурсов, из-за которого приходилось долго ждать подвоза "железа".

Что было важно:

  • Перестать терять логи.

  • Уложиться в лимит.

  • Хранить логи минимум за последние 4 дня.

У нас было два возможных пути:

  1. Продолжать "есть кактус" и пытаться как-то потюнить и переделать EFK под себя, но при этом ограничиваться записью логов только за последние 5 часов.

  2. Перейти на новое решение — ClickHouse, Vector.dev и Redash.

Сравнение хранилищ и сборщиков логов

Мы провели сравнение хранилищ и сборщиков логов, осознавая, что придется идти на некоторые компромиссы.

Сравнили ClickHouse и Elastic ⭢ победил Clickhouse

  • ClickHouse использовал 9 нод вместо 18 на трех ЦОД → экономия в два раза.

  • В 8 раз уменьшилось потребление ресурсов при вставке логов (по CPU/Mem).

  • Занимаемое место под строку лога сократилось в 10 раз (с 600 байт у Elastic до 60 байт у ClickHouse).

Сравнили Vector.dev и FluentD ⭢ победил Vector

  • Vector агент требует в 10 раз меньше ресурсов памяти

  • При одинаковом росте загрузки с 0 до рабочей значительно меньше потребляет память

  • При большой нагрузке Vector успевает собрать почти в 3 раза больше логов

  • У Vector есть unit-тесты для обработчиков логов! Можно проверять правила обработки логов локально, не поднимая всех зависимостей (см. руководство “Unit testing Vector configurations”)

  • Vector не теряет логи – доставляет 99.98-100% (см. исследование “Switching From FluentD to Vector Log Aggregation Tool”)

Риски перехода на новое решение

  • Vector.dev не имеет «стабильной» версии 1.0, приходится мигрировать с учётом потенциально обратно несовместимых изменений.

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

  • При выборке логов необходимо изменить язык запросов с KQL на SQL.

  • Требуется перевод наших приложений на новую систему хранения логов.

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

Технические аспекты перехода и развертывание новой системы

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

Подготовка к переходу на Vector + ClickHouse

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

  • Сбор логов с двух монолитов (критически важных);

  • Не влиять на производительность приложений при сборе логов;

  • Не терять логи и хранить их за 4 дня, вместо текущих 8 часов;

  • Обеспечить высокую доступность данных логов.

Развертывание

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

Топология "Vector as Distributed Agent" – не подошла

Топология Vector as Distributed Agent
Топология Vector as Distributed Agent

Не подошла по следующим причинам:

  • Возможны потери логов при перезагрузке агентов или потери связи с хранилищем.

  • Агенты могут перегрузить хранилище ClickHouse.

  • Невозможно агрегировать данные с нескольких источников до их отправки в хранилище.

  • Вычислительная нагрузка агента может забирать много ресурсов и негативно влиять на работу приложений.

  • Можно перегрузить метриками Prometheus одним агентом с некорректными правилами.

Топология "Vector Centralized" – не подошла

Топология Vector Centralized
Топология Vector Centralized

Эта топология оказалась лучше предыдущей, поскольку вычислительную нагрузку перенесли с агентов на агрегаторы, и можно контролировать поток событий в хранилище (пропускание и rate-limit). Однако она не подошла нам по следующим причинам:

  • Возможна потеря логов при переполнении буферов агентов.

  • Риск потерь данных также возникает при рестарте агрегатора.

Топология "Vector Stream based" – подошла

Топология Vector Stream based
Топология Vector Stream based

Эта топология позволила удовлетворить все наши требования. Kafka, которую мы используем в компании и умеем поддерживать, — стала надежным буфером в моменты перезагрузки. Мы выдерживали простой агрегатора vector до 30 минут, с накоплением более 50 млн сообщений в Kafka.

Надежная конфигурация Vector + ClickHouse для трех ЦОД

Поскольку наша компания обеспечивает надежность работы приложений при помощи трех ЦОД, система обработки и хранения логов была развернута в такой же конфигурации. 

В каждом ЦОД была развернута топология Vector Stream Based. Агенты Vector собирают логи и отправляют их сразу в Kafka. Агрегатор Vector проводит обработку логов, включая обогащение и подсчет метрик, после чего отправляет логи в хранилище ClickHouse. За метриками в агрегатор приходит наша Victoria Metrics.

 Схема развертывания системы сбора и обработки логов и метрик  в одном ЦОД
 Схема развертывания системы сбора и обработки логов и метрик  в одном ЦОД

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

Схема развертывания системы сбора и обработки логов и метрик  в двух ЦОД
Схема развертывания системы сбора и обработки логов и метрик  в двух ЦОД

а схеме выше вы видите взаимные связи элементов топологии для двух ЦОД. У нас три ЦОД, поэтому каждый элемент имеет по три связи. Мы не отображаем это на схеме, чтобы избежать перегрузки информацией. Kafka работает в кластере, так же как и ClickHouse. Victoria Metrics настроена в отказоустойчивой конфигурации.

Как мы храним логи в ClickHouse

Так как у нас не было опыта работы с логами в ClickHouse, мы выбрали прямолинейную схему размещения данных, где для каждого приложения завели отдельную таблицу, а каждому полю лога соответствует столбец в таблице. Дополнительные данные, которые Vector предоставляет о среде создания лога (например, данные о kubernetes), мы разместили в виде двух вложенных столбцов типа массив в поле other {other.key, other.value}.

У каждой таблицы указан TTL, чтобы ClickHouse автоматически очищал устаревшие логи. Мы разработали ansible плейбуки для автоматизации создания нужных таблиц, избегая необходимости каждый раз привлекать администраторов баз данных при добавлении логов нового приложения.

Обработка логов vector-агрегатором

Наши приложения отправляют структурированные JSON-логи, которые достаточно просто обрабатывать на агрегаторе и обогащать при необходимости. Vector может обрабатывать различные виды логов, включая логи сторонних приложений, которые не используют JSON, приводя их к нужному формату.

Работа с логами, поиск и выборка логов

Для работы с логами мы предлагаем прямое подключение к базе через различные клиенты, а также через ReDash — графическую веб-консоль для выполнения запросов в ClickHouse. Хотя это не предоставляет такого удобства, как Kibana, для нас это осознанный компромисс. Преимуществом является то, что разработчикам не требовалось изучать с нуля новый язык запросов, так как SQL известен почти всем.

Переход занял 1 год. Что мы получили?

  • Все прод-сервисы переведены на сбор логов через vector.dev.

  • Экономия ресурсов: количество нод уменьшилось в 8-10 раз, место для логов — в 10 раз.

  • Логи продовых систем теперь хранятся 4 дня вместо 5 часов.

  • Не теряем логи — доставляется 99.98-100%.

  • DevOps и CTO довольны.

  • Разработчики привыкли к надёжности системы: логи не теряются.

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

Как это может пригодиться вам

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

Когда вам НЕ нужен переход на Vector + ClickHouse

  • Вы небольшая компания с несколькими серверами и у вас нет множества приложений.

  • У вас достаточно ресурсов для тюнинга и адаптации решений из Elastic стека под свои нужды.

  • У вас достаточно ресурсов для расширения мощностей под Elastic, чтобы решить проблему "железом".

Когда вам это нужно

  • Ваша компания растет, но не хватает ресурсов на расширение мощностей для Elastic.

  • Вы используете сборщик логов FluentD, и при вашей нагрузке он теряет логи.

Заключение

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

Комментарии (30)


  1. panter_dsd
    24.04.2024 12:41

    На сколько я вижу, кафка у вас является такой жииирной точкой отказа - что делать, если она свалится?


    1. benjik
      24.04.2024 12:41
      +3

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


    1. r3code Автор
      24.04.2024 12:41
      +1

      У нас 3 ЦОЦ и между ними есть избыточная связанность. Надежность для нас достаточная.


      1. azk
        24.04.2024 12:41
        +1

        Почему Кафка, а не балансировка между n-нодами Vector? Уже много времени прошло, но на сколько помню свои исследования, Кафка из 9 год проживал 250к строк в секунду, один вектор прожевал 50-60к строк. Поставить балансировщик и 5 вектор прокси по идее выгоднее.

        P.S. мы не смогли отказаться от кибаны, т.к. потребители логов админы и дежурка, но тоже рассматривали данную схему, т.к. она более выгодна с точки зрения утилизации ресурсов . Остались на OVK(opensearch, vector, kibana)


        1. r3code Автор
          24.04.2024 12:41
          +1

          Что сказать, в момент выбора мы полагались на официальную документацию Vector в которой уже было описано решение с Kafka, как готовое для прод применений. Так как время дорого, а все для ее воплощения было под рукой, то мы ее и применили.

          Можете поподробнее рассказать про вашу схему с балансировщиками (что за балансировщики применяли)? И что за вектор-прокси? Как в этой схеме обеспечивается защита от потери логов в моменты перезагрузки vector (например в нашем случае буфер на агенте точно не спасет, так как логов очень много)



          1. azk
            24.04.2024 12:41

            Vector-proxy - это тот же самый vector, который выполняет только проксирование трафика(у вас на схеме это Vector-агрегатор). В нашем случае используется F5 балансировщик, который распределяет трафик между N Vector-proxy. Можно вполне использовать и HA-Proxy для этих целей. Т.к. при взаимодействии между Vector -> Vector, успешно доставленным сообщение считает только при подтверждении его доставки приемником, то перезагрузка одного из N Vector-proxy не приводит к потере сообщений, т.к. не доставленное сообщение отправляется повторно по новому адресу полученному от балансировщика.


  1. alebedev7
    24.04.2024 12:41

    А рассматривали OpenSearch, Filebit, logstash ?


    1. r3code Автор
      24.04.2024 12:41

      OpenSearch не рассматривали, logstash - отказались еще до перехода на ELK, причины поросли мхом уже.  А Filebit да смотрели, но vector победил - вот тут https://medium.com/ibm-cloud/log-collectors-performance-benchmarking-8c5218a08fea можно посмотреть сравнение


  1. chemtech
    24.04.2024 12:41
    +3

    Рассматривали ли Loki/Promtail ?


    1. r3code Автор
      24.04.2024 12:41

      Grafana Loki + Promtail  сам появился только в апреле 2018 года и был достаточно сырой, потому был исключен из рассмотрения в нашем случае.


  1. bondeg
    24.04.2024 12:41

    А логи проходят ревью на актуальность? Без понимания инфраструктуры остаётся лишь гадать, но выглядит будто есть значительный объем избыточных логов/мощностей для их хранения.


    1. r3code Автор
      24.04.2024 12:41

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


  1. vainkop
    24.04.2024 12:41
    +7

    200 Гб логов ежедневно

    Мы храним логи только за последние 5 часов

    Логи продовых систем теперь хранятся 4 дня вместо 5 часов

    В тексте не ошибка и логов всего 200Гб(Гигабайт) в день?

    Сейчас у одного из клиентов с 1Тб (Терабайт) логов в день отлично справляется 2 кластера (dev + prod) Loki в simple scalable конфигурации с хранением в S3 и логи хранятся за сколько угодно давно, т.к. S3 относительно дёшев и логи более чем за год нужны для compliance и т.п. Впрочем и на дисках используя Minio тоже будет не так дорого и достаточно производительно и поддерживается Loki из коробки. И даже Kafka не используется, хотя в теории не помешает. И это на версии 2.9, а сейчас 3.0 вышла с bloom фильтрами, которые на 70-90% должны снизить объём скачиваемых при поисковых запросах логов.

    Метрики в двух VictoriaMetrics cluster.

    По-моему на 1Tb/день логов в день, даже без аналогичных требований по длительности хранения, ваше решение сильно проигрывает по стоимости и сложности архитектуры и необходимости её поддерживать.

    Но снизить стоимость решения в 10 раз - это отличное достижение, поздравляю!


    1. r3code Автор
      24.04.2024 12:41
      +1

      200 Гб в день - это верно для нашей инфраструктуры. Мы можем и 1Тб генерить, только разреши писать все от DEBUG уровня и все запросы с телом запроса )) Но нам и 200 хватает )

      Уже давал коммент по поводу Loki выше. В 2018 году он был совсем зелен и не рассматривался как готовое в прод решение.

      Я бы с удовольствием прочитал о вашем решении, чтобы посмотреть и сравнить. У нас используются bloom фильтры в Clickhouse, вероятно в вас тоже он?

      Говоря о нашем решении мы сразу оговариваемся, что мы были ограничены в ресурсах, потому мы выбирали компромиссное решение, а не лучшее.


      1. vainkop
        24.04.2024 12:41
        +1

        Говоря bloom фильтры я имел ввиду то, что реализовала команда Loki https://grafana.com/blog/2024/04/09/grafana-loki-3.0-release-all-the-new-features/, как это реализовано в Clickhouse хз

        Мы не ограничиваем разработку в том, что им необходимо.

        Наше решение - это несколько EKS кластеров + 2 Loki кластера simple scalable + promtail из того же helm chart'а + AWS S3, но у других облачных провайдеров тоже можно использовать block storage. Да и на дисках на Minio я бы тоже рассмотрел, я уже говорил.

        С учётом даты 2018 вашего внедрения обсуждать сравнение с Loki действительно несколько бессмысленно, т.к. для меня он стал Production ready только недавно.

        Но сейчас Loki - это решение которое наиболее дешёвое и функциональное, никаких компромиссов.


        1. r3code Автор
          24.04.2024 12:41

          У нас есть Minio, а в S3 в принципе можно прямо из Clickhouse настроить выгрузку для холодного хранилища. Пока у нас все на своих ресурсах внутри наших ЦОД.

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


          1. vainkop
            24.04.2024 12:41
            +2

            Нам холодное хранилище как бы не нужно, т.к. всё и так в s3. Можно отправлять совсем старые логи в glacier, но там есть нюансы и пока не воспользовались.

            Логи в Loki умеет и Vector писать, у них есть sink ссылка , но у нас как-то сходу все форматы и всё остальное практически вообще без настроек взлетели из дефолтного helm subchart promtail и по производительности он устраивает, поэтому им пользуемся.


          1. budnikovsergey
            24.04.2024 12:41

            Promtail можно гонять локально со всеми тестами, как и любой другой парсер логов. Сам loki не умничает и отказоустойчиво гонит данные без парсинга в хранилище а затем работает по принципу распределённого grep. За счёт параллелизации можно получить чумовые скорости и всё это при одной копии сохранённых данных. Ну и связка grafana loki + grafana tempo + grafana чертовски удобна как единая точка доступа ко всем артефактам наблюдаемости и перехода между логами и трейсами.


            1. r3code Автор
              24.04.2024 12:41

              Я вот сейчас не могу объективно сравнить Vector и Loki. Решение по вектору мы принимали тогда в 2018 и в тех условиях.

              Поискал сегодня, делал ли кто-то подобный переход с ELK на Loki. Попалась схожая с моей статья 2022 года - "Как мы перешли с Elastic на Grafana stack и сократили расходы в несколько раз" https://habr.com/ru/companies/m2tech/articles/693504/
              и вторая What I like using Grafana Loki for (and where I avoid it) https://utcc.utoronto.ca/~cks/space/blog/sysadmin/GrafanaLokiWhatILikeItFor
              Будет интересно почитать и сравнить. Будет база для выбора решения коллегам.

              Еще такая штука как https://github.com/metrico/qryn (ранее cLoki) позиционируют как Loki + Clickhouse. Вот оно мне кажется более похожим на наш сетап. И возможно если бы оно существовало в 2018 в готовом к прод виде, то могло бы подойти, но qryn начал развиваться только с декабря 2018.


  1. fujinon
    24.04.2024 12:41
    +1

    Перекликается с https://www.uber.com/blog/logging/


    1. r3code Автор
      24.04.2024 12:41

      Спасибо за ссылку - не видел этой статьи. Действительно проблема схожая.
      Там они еще описывают, как изменили свою схему хранения в ClickHouse. Мы тоже отошли от начальной схемы и сейчас переходим на новую - об этом я тоже расскажу, но позже.


      1. AlexSTAL
        24.04.2024 12:41

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


        1. r3code Автор
          24.04.2024 12:41

          Опишем в отдельной статье. Пока вот можете посмотреть в видео доклада https://devopsconf.io/moscow/2024/abstracts/11564 (если доступ есть), или хотя бы в презентации (она там доступна для скачивания) с слайда 115 про Unified Log Pipeline.


          1. AlexSTAL
            24.04.2024 12:41

            Ознакомился с презентацией. Вы пишите про унификацию именований. А я подумал, что речь про использование каких-то фич ClickHouse


            1. r3code Автор
              24.04.2024 12:41

              Да фичами уже не разрулишь такое, надо договариваться с разработкой - это сильно упрощает жизнь и нам и им.


  1. AlexSTAL
    24.04.2024 12:41

    Отличный стек. У нас сейчас всё что можно/нужно на нём - ЖР, ТЖ, RAS 1С, логи кролика, логи web, даже логи windows напрямую и т.д. А ошибки сразу экспортируем в Sentry, с моей точки зрения отличнейший баг-трекер. На инфостарте несколько статей публиковал, но народ в комментариях молчит https://infostart.ru/1c/tools/1973657/


    1. r3code Автор
      24.04.2024 12:41

      Посмотрел в вашей статье картинки, очень заинтерисовало как выделали схему по этапам трансформации сообщений. Это только картинка для статьи или у вас есть интерфейс визуализации топологии Vector? Я такой видел в демо DataDog (они купили vector и развивают), у них там видно как трансформы соединены и как идет переток событий https://youtu.be/GjcLWupY0jk?t=2990


      1. AlexSTAL
        24.04.2024 12:41

        Это только картинка для статьи, при чём с официального сайта, если не ошибаюсь. До визуализации топологии ещё руки не дошли


  1. qiwi_k
    24.04.2024 12:41

    За статью спасибо! Но как теперь разработчикам работается без кибаны? Удобно ли им юзать кликхаус?


    1. r3code Автор
      24.04.2024 12:41

      Конечно не так удобно. Особенно если ты давно с ней работал и руки привыкли. Человеку всегда тяжело переходить на новое, надо же изучить. Но тут плюс в том, что не пришлось учить новый язык запросов, так как SQL знает большинство.
      Мы вообще пошли немного дальше уже, о чем расскажем отдельно. Мы в этом году поменяли структуру хранения в базе, требования к самим логам, и сделали GUI для поиска по логам, которое упрощает поиск. Об этом расскажем несколько позже.