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

В разные эпохи развития нашего проекта в качестве основного хранилища, которое являлось источником данных для аналитики, у нас были MySQL, Elasitcsearch, Exasol и ClickHouse. Последнее нам очень нравится и вообще вызывал дикий восторг, как инструмент для работы с большими массивами данных, но, если посчитать итоговую стоимость владения с учётом внедрения кластера, обучения и поддержки — лучше подумайте два раза, прежде чем тащить его в ваш стек. На наших объёмах данных вложенные усилия окупаются, но если бы мы были чуть меньше, то, наверное, экономика не сошлась бы.

Главная проблема ClickHouse — это практическое отсутствие удобных и стабильно работающих инструментов для эксплуатации и большое количество решений рядом — в погоне добиться того же пользовательского опыта, как при работе с классическим RDBMS (MySQL или PostgreSQL). Вам придётся приложить немало усилий, чтобы понять как эффективно применить ClickHouse для ваших задач. Анализировать придётся много, начиная от вопросов развёртывания до выбора оптимальных моделей данных под профиль вашей нагрузки, в общем доступе не так много рекомендаций по выбору конфигураций под разные типы задач.

С другой стороны, его киллер-фича — это возможность работать с огромными массивами данных невероятно быстро для решений в этой области: то, что раньше нам приходилось делать в Spark или через другие реализации MapReduce, теперь мы можем делать внутри ClickHouse. И бесплатно, потому что такими же плюсами обладают многие MPP решения вроде Vertica или Exasol. Но ClickHouse открытый, и за это мы платим налог на использование непрогнозируемым объёмом поддержки или развития системы. Не всем это подходит, например, есть опыт компаний, которые сначала было влезли в это дело, потом поняли, что это не то, и взяли платные продукты с платной поддержкой, с экспертизой в решении архитектурных задач именно их продуктами. В платных продуктах есть готовые инструменты, которые понятно как применять.

В общем, давайте расскажу про наш опыт.

Что такое ClickHouse и чем он стал для нас

Это решение, созданное под задачу хранения данных проекта Яндекс.Метрики, которое было заточено под сохранение данных о действиях пользователей и последующей аналитикой в интерфейсе и построении отчётов. Вот подробный пост. Он потенциально очень хорошо масштабируется (о топологии нашего кластера мы написали в отдельной статье), очень быстро работает и хранит сырые данные с простым доступом через SQL — что очень удобно для аналитики. У ClickHouse нет эффективного подхода обновления данных, атомарных операций и транзакций, но для обновления есть возможность всё же реализовать его через построение особой модели данных и движки таблиц Replacing*.

Документация по ClickHouse есть, но написана она часто излишне детализировано, а часто в духе «осталось нарисовать остальную сову», примеры нарисованных «сов» можно найти на некоторых конференциях в решении узких задач. Главная проблема для нас была в том, что то же масштабирование в кластере можно сделать несколькими разными способами, но на практике только один из трёх будет рабочим. И вы не узнаете какой, пока не попробуете все, во всяком случае такой путь был у нас. В том же Exasol в такой же ситуации метод будет только один, одобренный вендором, и по-другому сделать просто не выйдет. Зато он точно будет прост, понятен и будет гарантированно работать.

Отсутствие инструментов к нему обходится дорого, но посчитать насколько — сложно. Если бы мы могли сформулировать заранее требования к хранению данных и их использованию точно — то наверняка взяли бы Vertica или продолжили использовать Exasol. Но проблема в том, что развивающиеся продукты часто не знают, что именно им понадобится на горизонте 1-3 лет, поэтому приходится хранить всё. Плюс есть неопределённость в продукте, а при развитии новых фич часто нужны исторические данные. В случае платных решений нужные объёмы хранения были банально дороги.

Коммерческие стоят от 2 тысяч долларов в месяц. Два года назад у нас было 7,5 Тб, и мы понимали, что к 2021 году, если не случится, ну знаете, чего-нибудь особенного для индустрии путешествий, будет 20 Тб. При этом мы не могли посчитать профит от хранения 1 Тб данных, потому что платить надо сразу, а пригодиться данные могут через полгода. Каждый раз, когда мы начинаем что-то складывать в хранилище, это делается по экспертной оценке от владельца продукта: «Кажется, у этих данных есть потенциал для бизнеса».

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

В итоге мы попробовали ClickHouse. Если бы была экспертиза в PostgreSQL, взяли бы Greenplum. Vertica мы тоже не умели и не понимали. В итоге попробовали домик, и он очень понравился аналитикам SQL-интерфейсом, скоростью работы и богатым набором функций, необходимых для их повседневной работы. Напомню, в Elasticsearch, который мы использовали для хранения части наших данных, — SQL нет, и это сильно осложняло пользовательский опыт аналитиков, не говоря об эффективности использования ресурсов.

Как пришли к Elasticsearch в 2016 году и что за задача вообще была

Тогда нам надо было сделать систему, которая позволила бы собирать данные о действиях пользователей со всех наших проектов. Причём с вечным хранением данных. Это нужно, чтобы сравнивать метрики, которые были в прошлых годах в аналогичном месяце, потому как в туристической сфере очень значительно отражается сезонность. Мы хотели проводить детальный анализ результатов АБ-тестов по сырым данным с точностью до каждого пользователя. Решения для классической веб-аналитики Яндекс.Метрика и Google Analytics бесплатные и имеют низкий порог входа. Но они довольно ограниченные и не позволяют гибко работать с сырыми данными, для нас блокирующим фактором стали ограничения на получения сырых данных и потери данных в ~10% по нашим исследованиям. Эти потери выглядели при аналитике как потеря некоторых событий в цепочке действий пользователей. На этих инструментах также нельзя строить что-то серьёзное в привязке к деньгам и не сливать финансовые данные. Мы замечали, что данные в этих системах иногда по-разному доходят до хранилищ, в результате чего и та и другая система врут относительно реальных данных по тем же заказам, причём в разные стороны. Возможно, там есть какая-то логика, из-за которой мы не можем получить все данные.

Есть простые решения, например, писать данные в логи, хранить какие-то агрегаты, полученные из логов в реляционных базах данных. И есть самое гибкое решение — построить свою дата-платформу. У этого решения нет всех недостатков предыдущих, но при этом есть дороговизна внедрения и необходимость поднятия под это инфраструктуры. Ну и нужен штат дата-инженеров. А ещё такая дата-платформа требует простоты работы с данными. В наших имеющихся системах, когда аналитики работали над продуктовой задачей, они тратили больше времени на подготовку данных, нежели на сам анализ. Ещё не хватало контроля качества и документации данных, которые мы собираем в нашу систему, и какого-то контроля потерь. Мы как минимум хотели бы сообщать аналитикам, насколько можно верить собранным данным. Плюс в требованиях было хранить целые сессии пользователей, а не какие-то агрегаты.

Мы начали собирать информацию, учиться, ходить на конференции, там общаться с людьми, которые строили уже подобные платформы. Мы не понимали какой стек нам вообще нужен для решения конкретно этой задачи. Были истории успеха у Netflix, у Linkedin и других новаторов в этой области, которые строили крутые дата-платформы, но непонятно было, пойдут ли нам эти решения. Если б мы просто начали тестировать, подходит ли нам конкретно вот этот стек для решения наших задач, то мы могли бы уйти в исследование достаточно на долгое время. В 2016 году вообще было мало практик по созданию подобных систем и мало компетентных специалистов, готовых построить систему с нуля.

К тому моменту наше хранилище для аналитиков состояло только из нескольких огромных реплик на MariaDb, куда стекались данные из всех 100+ серверов и наш опыт и опыт большинства компаний говорил о том что это не то решение, которое будет готово переварить хранение всех кликов пользователей.

Поскольку основное в архитектуре, с нашей точки зрения, было хранилище, начали мы именно с него. У нас уже на тот момент были реляционные базы, такие как MySQL, на которых было сложно получить реалтайм и правильно сегментировать данные — получалось, что они часто нужны нам в сыром виде. ClickHouse тогда ещё был недоступен публично, поэтому мы выбирали из Greenplum и Elasticsearch. В итоге мы пришли к решению, что будем внедрять Elasticsearch, потому что Elasticsearch решал несколько задач в нашей компании, например, такие как хранение логов приложений для задач эксплуатации инфраструктуры запуска наших приложений.

Elasticsearch — это документоориентированное хранилище с near-real-time доступом к данным. Данные в Elasticsearch не сразу становятся доступными для поиска. Чем меньше этот лаг, тем выше нагрузка на хранилище. Мы могли смириться с лагом в несколько минут, что снимало эту проблему. Ещё это распределённое решение для полнотекстового поиска, который имеет гибкие возможности масштабирования и достаточно богатые возможности для построения агрегации по данным. Elasticsearch позволяет гибко нарезать данные временных рядов, ну и организовывать работу с ними уже встроенными возможностями, без каких-то дополнительных действий. У них большая экосистема. Есть в стеке Kibana, которая позволяет достучаться к нашим данным, возможность строить визуализации и дашборды. Всё в бесплатной версии лицензии.

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

  • Отсутствие SQL подобного языка запросов.

  • Нет join’ов в классическом понимании, но есть альтернатива.

  • Нет контроля консистентности и транзакций.

  • Ещё один источник данных для аналитиков который придётся осваивать.

Несмотря на все ограничения, хранилище успешно решало бизнес-задачи и имело вот такую структуру:

Год назад в хранилище было 12 Тб данных, и это без сессий ботов. 12 миллиардов документов. В среднем писалось по 20 тысяч записей в минуту. Бывали пики до 40 тысяч. Девять нод Elasticsearch.

Работало с базой пять продуктовых команд, 11 аналитиков и 2 дата-инженера на поддержке и развитии текущей системы.

«Вы распиливаете монолит, а мы собираем его обратно»

Мы росли, наша архитектура проекта развивалась, новые проекты делались на микросервисной архитектуре, старые монолиты постепенно разделялись на мелкие проекты, начало появляться множество серверов баз данных для изоляции между группами сервисов, c которыми работал production код. Итак, мы выросли из старой архитектуры из-за:

  • Потребностей в удобстве доступа к данным.

  • Скорости работы с данными.

  • Необходимости подключать удобные BI-инструменты.

  • Сложности поддерживания старой системы реплик и нескольких хранилищ.

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

В качестве альтернативы ClickHouse мы рассматривали ещё некоторые системы аналитики, которые поставляются как SaaS (в сравнении с ними собственное внедрение open source окупалось за считанные недели, как нам казалось, посчитав потом, могу сказать — месяцы), были BigQuery, RedShift и решения в AWS. Но у нас не было экспертизы, как готовить такое, чтобы было экономически сообразно. Из того, что мы посчитали, всё было дороже и менее предсказуемым, чем MVP на базе ClickHouse. Плюс почти во всех облачных решениях нужно аналитиков контролировать и выстраивать процесс, чтобы они не сделали запрос, который обойдётся дорого, потому что оплата шла по факту за чтение/количество запросов и сложность этих запросов. Например, пропустил join по всей базе — и упс, прилетает счёт на пару тысяч долларов. В ClickHouse порог входа в аналитики куда проще: если они вдруг уложат хранилище, оно быстро упадёт и быстро поднимется. Но, скорее, пережуёт запрос. Переделывать принципы работы аналитиков мы не хотели, поэтому решили сразу, что плата за сложность запроса — плохая идея, которая потребовала бы внедрения новых процессов и обучения.

В ClickHouse хранение данных очень эффективное, то, что у нас занимало около 15 Тб в Elasticsearch, заняло в итоге 4 Тб в ClickHouse. В основном мы храним действия в сессии пользователя и состав выдач железнодорожных и авиабилетов ему. Есть и заказы, и билинг, и документы и всё остальное, но в сравнении с этими категориями это просто капля в море по объёму. Сейчас мы на пути сбора данных со всех сервисов компании (монолит и около 1000 микросервисов) и собираем их в одно Data Lake на базе ClickHouse. Такую задачу также можно решить поднятием кластера Spark или Hadoop, делающего распределённые join, но решения по сложности сопровождения и сложности архитектур сильно проигрывают ClickHouse.

На текущий момент удалось созданием внутренней базы знаний понизить порог входа в ClickHouse для разработчиков в командах, которые не имеют экспертов в хранилищах для использования ClickHouse как минимум для доставки данных от production кода до Data Lake на базе ClickHouse с минимальным оказанием консалтинга экспертов в ClickHouse для разработчиков, что позволило не делать «узким горлышком» одну команду и перенести зону ответственности на команды, которые являются источниками данных. С более сложными системами вроде Hadoop это сделать было бы сложнее.

В итоге схема, к которой мы пришли ниже, где ClickHouse играет важную роль:

За пару лет эксплуатации ClickHouse мы натыкались на ломающиеся достаточно важные части функционала, например, такие как ClickHouse-copier(инструмент для миграции данных между кластерами), мы не доверяем новым удобным фичам вроде чтения из Kafka или из других источников, потому как в случае проблем исследовать проблемы и делать drill down практически невозможно, и достаточно регулярно в них встречались баги или недокументированные особенности, которые приводили к потерям данных в краевых случаях, поэтому мы используем ClickHouse как решение для хранения и доступа к данным, а инструменты доставки используем во вне. 

Мы считаем, что пока в начале пути, и ещё много надо сделать. В планах:

  1. На текущий момент витрины данных для быстрого доступа у нас хранятся в Exasol, но мы хотим рассмотреть для этой задачи ClickHouse на основе Materialized View и встроить в наш процесс создания витрин.

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

  3. Научиться быстро локализовывать возникающие проблемы производительности новых запросов и ловить не оптимальные запросы на ранних этапах.

  4. Интеграция со всеми сервисами, данные которых необходимы для какой-либо аналитики внутри компании.

  5. Полностью заменить этим хранилищем те функции, которые выполняла большая реплика MariaDb которую упоминали ранее.

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

  7. Начать декомпозицию потоков данных по доменным областям и двигаться в сторону Data Mesh.

А в этом посте мой коллега рассказывает к какой схеме организации кластера пришли и почему.

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

А еще у нас открыты вакансии и мы ищем к нам в команду еще одного классного DevOps на развитие этой инфраструктуры.

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


  1. cadovvl
    07.09.2021 11:49
    +4

    Возможно, покажусь занудой, но мне в статье сильно не хватило конкретики.

    Всевозможные "наши данные" и "наша аналитика", а можно пример? Как выглядит классический аналитический отчет, классический сценарий использования?
    Данные, которые собираем "на всякий случай" - можно пример? Клики по кнопке "показать еще", или время сессии. Какого рода данные? Очень хочется знать, какой природы данные кликхаус из 15ТБ превратит в 4 (опыт-то уникальный!).

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

    Да, я видел схему, но там маловато информации... "Приходилось писать по 20 тысяч записей в минуту" может значить все что угодно. Я один раз отправил суммарно 1 ТБ данных с 20к машин по сети (в течение часа), которые принимались всего на 16-и серверах. Это положило свежесть данных для аналитики на неделю, но потом все доехало и нормально живет. В вашем случае 20к записей - это сколько в объеме, пики грозят задержкой в аналитике или потерями данных, во что упиралась производительность, если были проблемы? Какие (если есть) проблемы остались после перехода на CH?

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




    1. sab0tazh Автор
      07.09.2021 13:59
      +3

      В основном мы работаем с данными продаж, которые позволяют сегментировать типы совершенных заказов, а так же click stream, все действия пользователей на сайте (клики, заходы на страницы, какие-то действия в интерфейсе) по которым в основном анализируются воронки посещаемость отдельных проектов. click stream в целом приметивен это как правило документ из нескольких полей обязательными там: имя события (с очень низкой кардинальностью, т.е. много событий которые имеют малое кол-во уникальных значений), время события на устройстве пользователя и идентификатор пользователя UUID, есть еще несколько технических обязательных параметров, но не думаю что это важно + все события имеют несколько сотен возможных параметров, по сути если это представить в виде таблички это очень широкая табличка с большим кол-вом колонок. Clickhouse очень хорошо жмет данные если вы их храните ввиде колонок скалярных типов (не используя массивы, структуры типа nested, строки с json и пр.)

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

      На другие вопросы чуть позже отвечу


    1. sab0tazh Автор
      07.09.2021 16:20
      +1

      Как обещал отвечаю на оставшиеся вопросы (-:

      ElasticSearch у нас использовался только для хранения информации о действиях пользователей (clickstream), в случае текущего кластера clickhouse - это уже data lake для хранения, обработки и объединения данных из всех источников, тут поток данных расширился сильно. Если вопрос про инсталляцию того ElasticSearch, то у нас средний размер записей около 400 байт на запись (размер уже в хранилище с некоторым коэффициентом сжатия).

      Про решение проблем с пиками и скоростью разбора этих пиков это скорее уже тема для след. статьи про это мы тоже напишем в ближайшее время. Но сейчас кратко могу ответить что в целом проблему с пиками мы не испытывали и доставляли данные с задержкой до 2-ух минут. Зачет запись данных в хранилище пачками по несколько тысяч. До хранилища ранее у нас стоял redis где копились данные, сейчас мы перешли в большинстве мест на kafka, как накопительный буфер.

      После перехода на CH у нас добавилось работы по поддержке этого хранилища, по крайней мере на текущем этапе, но это возможно из за того что запросов к хранилищу стало больше, но при этом задачи решаются быстрее, ранее аналитики выгружали куски данных в python + pandas и крутили уже сегменты данных в памяти, для 95% задач этого достаточно, но не удобно для использования. В целом мы ставили задачи которые решили переходом: повысить удобство использования хранилища аналитиками, эффективнее использовать ресурсы хранилища, уменьшить кол-во задач где аналитику приходится всю обработку данных строить на pandas и без использования BI инструментов.


      1. cadovvl
        07.09.2021 16:39
        +1

        До хранилища ранее у нас стоял redis где копились данные

        Какой-нибудь журнал на случай отключения до дампа данных?

        Про решение проблем с пиками и скоростью разбора этих пиков это скорее уже тема для след. статьи

        Ну, тут каждый ответ - тема для статьи. Я про это и пытался сказать: уверен, там под капотом клондайк.

         ранее аналитики выгружали куски данных в python + pandas

        Сейчас вы сделали для них промежуточный интерфейс, или это превратилось в python + SQL?

        таблички это очень широкая табличка с большим кол-вом колонок

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



        Вцелом, я не думаю, что стоит продолжать разбор здесь: жду новых статей с интересными техническими деталями %)

        И спасибо за ответы!


        1. sab0tazh Автор
          07.09.2021 20:53
          +1

          Какой-нибудь журнал на случай отключения до дампа данных?

          Не понял вопроса, но думаю имеется ввиду "отключения для дампа", это отдельно рассмотрим в другой статье. Скорее стык между окружением с low latency и окружением которое может работать медленно потому что идет обслуживание или к нам вышел новый аналитики который по незнанию приложил хранилище )

          Сейчас вы сделали для них промежуточный интерфейс, или это превратилось в python + SQL?

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

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

          Большинство enum + числа, но много datetime и основной прожорливый тип это конечно UUID, но в clickhouse для его хранения есть тоже достаточно эффективный тип колонок UUID.


  1. chevardante
    08.09.2021 14:18

    >> Вам придётся приложить немало усилий, чтобы понять как эффективно применить ClickHouse для ваших задач

    Altinity?


    1. sab0tazh Автор
      08.09.2021 14:27

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

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

      Если речь про cloud решения которые делает altinity, то тут исследований не проводили, мы пробовали использовать яндекс.облако и нам не понравилась эксплуатация этого решения, когда речь коснулась мониторинга и траблшутинга некоторых проблем, но возможно на текущий момент ситуация изменилась. Но как быстрый старт - это отличное решение!


      1. chevardante
        09.09.2021 11:49

        Спасибо. Все верно, я про их поддержку/экспертизу.