ClickHouse: сценарии, сильные стороны, лучшие практики работы в 2026 году

от автора

ClickHouse — один из самых востребованных инструментов для хранения и анализа больших объемов данных, обеспечивающий высокую производительность и наблюдаемость сервисов и приложений. Благодаря этим параметрам многие компании внедряют его в свои ИТ-инфраструктуры для решения задач аналитики, логирования и мониторинга. Однако, несмотря на широкое распространение, практика показывает, что далеко не все команды до конца осознают все особенности и нюансы работы с этой системой, что может приводить к неэффективному использованию ресурсов, ошибкам в проектировании и снижению общей производительности. 

Привет, Хабр. Меня зовут Александр Кривяков. Я пресейл-архитектор VK Data Platform, VK Tech. В этой статье я расскажу об основных принципах работы ClickHouse, а также покажу возможные архитектурные решения и типичные сценарии применения системы.

Начнем с погружения в детали: что такое ClickHouse

ClickHouse разработан для быстрой обработки аналитических запросов и получил широкое распространение благодаря своей высокой производительности и простоте использования. Причем часто ClickHouse рассматривают как универсальное решение для аналитиков, считая, что он способен заменить традиционные базы данных, такие как PostgreSQL. Однако, чтобы понять истинные возможности и ограничения ClickHouse, необходимо рассмотреть его место среди различных классов СУБД.

Так, все СУБД можно условно разделить на несколько классов по разным признакам. Например:

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

  • По нагрузке. Выделяют OLTP (оперативная обработка транзакций), OLAP (аналитическая обработка) и HTAP (гибридная обработка).

  • По консистентности. СУБД могут обеспечивать консистентность посредством ACID-транзакций, eventual consistency и гибридных подходов.

  • По хранению. СУБД могут реализовывать строковое, колоночное, резидентное или гибридное хранение данных.

  • По архитектуре. Можно встретить архитектуры single-серверные, high availability, MPP shared nothing и shared something.

В подобной классификации ClickHouse относится к классу колоночных OLAP-СУБД. То есть он объединяет преимущества OLAP и колоночного хранения. И здесь стоит остановиться подробнее.

Что дает OLAP

OLAP (Online Analytical Processing) — это подход к обработке данных, ориентированный на выполнение аналитических запросов. В отличие от OLTP, где акцент делается на короткие транзакции, OLAP специализируется на обработке больших объемов данных и выполнении сложных аналитических операций.

ClickHouse поддерживает основные возможности OLAP, в том числе:

  • Группировка данных. Решение умеет группировать данные по различным измерениям и выполнять агрегатные функции, такие как SUM, AVG, MAX и MIN.

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

  • Детализация и обобщение. Система предоставляет возможность переходить от общих данных к более детальным уровням анализа.

Причем ClickHouse изначально проектировался таким образом, чтобы обеспечивать максимально быстрое чтение по OLAP-запросам. 

Что дает колоночное хранение

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

Это формирует определенные издержки. Например:

  • Каждая колонка хранится в отдельном файле, что увеличивает общее количество файлов в хранилище.

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

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

Но разделение данных по колонкам дает несколько существенных преимуществ:

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

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

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

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

Более того, в отличие от Parquet, где данные упакованы в единый файл, в ClickHouse каждый кусок данных представлен несколькими файлами. Например, если в Parquet 100 колонок упакованы в один файл, то в ClickHouse для каждой колонки создается два файла: один для данных и один для индекса. Таким образом, для 100 колонок в каждом куске данных будет 200 файлов.

Работа с Data parts

Куски данных в ClickHouse управляются механизмом MergeTree, который отвечает за объединение мелких кусочков в более крупные. Реализуется это по следующему алгоритму:

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

  • Со временем мелкие кусочки объединяются в более крупные, что снижает количество файлов и улучшает производительность.

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

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

Но схлопывание кусков — это не единственная функция MergeTree. Помимо простого объединения данных, механизм MergeTree позволяет выполнять дополнительные операции в процессе слияния кусочков. Например:

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

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

  • Coalescing MergeTree. Добавляет новую информацию в существующий набор данных, объединяя ее с предыдущими значениями.

  • Aggregating, Summing MergeTree. Осуществляет автоматическое суммирование данных при слиянии кусочков, что экономит место и ускоряет последующие запросы.

Таким образом, MergeTree дает широкие возможности для автоматизации обработки данных.

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

Примечание: Механизм MergeTree в ClickHouse объединяет кусочки данных (data parts) только внутри одной партиции. Например, данные за январь не сольются с данными за февраль. Из‑за этого на границах периодов (дней, месяцев) может возникать неконсистентность. 

Более того, надо помнить, что, если какая‑то партиция не оптимизирована (например, из‑за высокой нагрузки), ее данные остаются в виде мелких кусочков. Но при запросах, охватывающих несколько партиций, система обрабатывает оптимизированные и неоптимизированные данные по‑разному — это может привести к ошибкам в движках Collapsing MergeTree или Replacing MergeTree: дубликаты не удалятся, старые версии записей сохранятся, а агрегации дадут неверный результат.

О кластерах ClickHouse

Специфика ClickHouse проявляется и на уровне кластеров — в разных СУБД под «кластером» понимаются разные сущности. Например:

  • В PostgreSQL кластер — это, по сути, согласованные копии одних и тех же данных: мастер, синк-реплика, асинк-реплики. То есть существует один главный мастер, а все остальное — подстраховка. 

  • Кластер Greenplum подразумевает, что данные разбиты на шарды (сегменты) с репликацией и все строго контролирует специально выделенный мастер. То есть формируется некий строй под четкой командой.

  • В ClickHouse же кластер формируют равноправные инстансы, которые могут общаться друг с другом, а могут и не общаться. Причем кластером эти инстансы становятся только в том случае, если явно указана соответствующая конфигурация в движке таблицы (например, с использованием Replicated*). И эта «кластерность» распространяется только в рамках конкретной задачи и конкретного объекта — в остальных случаях инстансы ведут себя как независимые узлы.

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

  • В погоне за производительностью ClickHouse жертвует гарантиями консистентности — их нет по умолчанию.

  • Консистентность зависит от движка (Replicated*) и того, куда идет вставка: в локальную таблицу или в Replicated, Distributed.

  • Консистентность зависит от режима вставки (quorum).

  • Если СУБД сообщила, что данные приняты, это не значит, что они приняты везде, повсюду, в одинаковом виде.

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

  • отсутствие четкого понимания, вставились данные или нет, особенно при распределенной вставке;

  • появление дубликатов от ретраев со сбоями;

  • возможные разные результаты на разных репликах (eventual consistency!) — если есть балансировщик, можно записать данные в одну реплику, а через секунду обратиться к другой и понять, что данных нет;

  • неатомарность операций на разных шардах.

Таким образом, за сохранением консистентности в ClickHouse надо следить тщательно и непрерывно.

Лучшие практики применения ClickHouse 

Как и в случае с другими СУБД, при выборе сценариев применения ClickHouse и вариантов его интеграции в инфраструктуру для работы с данными, в первую очередь учитываются сильные и слабые стороны. Так, ClickHouse плохо справляется с OLTP с высокими требованиями к консистентности, конкурентными UPDATE, полнотекстовым поиском и очередями.

Вместе с тем он способен обеспечить:

  • очень высокий ingress;

  • дешевые агрегации по миллиардам строк;

  • фильтрацию по времени, пользователю, сервису, типу события.

В связи с этим он оптимален, а порой и вовсе незаменим в кейсах, где подразумевается:

  • лог-аналитика: API, CDN;

  • кликстрим, ивент-стрим, продуктовая аналитика, Security Audit, логи безопасности;

  • BI, воронки, self-service;

  • Time-Series на большом объеме, телеметрия, работа с IoT.

При этом можно выделить несколько примеров архитектур, в которых ClickHouse будет максимально раскрывать потенциал производительности и скорости. 

Data Last Mile

Архитектура Data Last Mile подразумевает размещение ClickHouse в качестве завершающего звена цепочки хранения данных перед конечными потребителями, такими как BI-системы, встроенные аналитические модули и клиентские приложения. Это позволяет обеспечить высокую скорость обработки запросов и удобный доступ к аналитическим данным.

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

Поскольку архитектура Data Last Mile сочетает в себе надежность и контроль данных на уровне традиционного хранилища с высокой скоростью и гибкостью на уровне аналитической обработки, подобная реализация подойдет, когда одновременно важна как точность данных, так и скорость отклика BI/аналитики.

Быстрый Ingress 

Подобная архитектура предполагает прямую передачу данных в ClickHouse, который, благодаря своей масштабируемости и эффективной модели данных, способен быстро принимать и обрабатывать большие объемы информации. Источниками данных могут служить очереди сообщений, стриминговые сервисы (например, Apache Kafka или Spark Streaming), крупные корпоративные приложения или системы интернета вещей с многочисленными датчиками.

Работает это следующим образом:

  • Входящий поток данных поступает непосредственно в ClickHouse, который обеспечивает быструю запись и первичную обработку.

  • Данные агрегируются в ClickHouse для формирования оперативной картины текущего состояния.

Здесь также стоит отметить, что при необходимости данные из ClickHouse могут передаваться в другие системы, такие как Lakehouse или MPP-движки, для проведения более глубоких анализов. Причем после завершения обработки данные могут возвращаться обратно в ClickHouse для предоставления пользователям в виде готовых аналитических витрин.

Но стоит понимать, что архитектуру Fast Ingress лучше применять только тогда, когда скорость получения данных сильно важнее точности. 

Примечание: ClickHouse также можно эффективно применять в системах для работы с метриками и логами. Например, с его использованием выстроена архитектура VK StatsHouse — основной системы мониторинга vk.com, которая по состоянию на июнь 2024 года принимала более 1,6 миллиарда измерений в секунду от 28 000 серверов. Подробнее о ней можно почитать на GitHub и узнать из нашего доклада на HighLoad

Выводы и рекомендации

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

Конечно, ClickHouse — это не решение для всех проблем с большими данными, и его не стоит выбирать в ситуациях, когда есть тяжелый ETL, высокие требования по качеству данных (нет возможности потерять даже 0,1% данных) и полноценная AD-HOC аналитика.

Вместе с тем система будет оптимальным выбором во многих сценариях. Например:

  • Классические RDBMS (Postgres, sq-sql) уже не тянут по скорости. Много колонок в итоговых данных: OLAP витрины 20–50 и более колонок.

  • Есть нагруженный BI. Большое количество параллельных подключений к СУБД. Live Connect BI: Superset, Datalans.

  • Осуществляется объемная вставка данных в фиксированном формате. Embedded-аналитика, бэкенд для приложений с большими данными (АБ-тесты и подобные).

  • Реализуется работа с логами и метриками. Есть необходимость подключаться разными способами: SQL, JDBC, HTTP, RPC.

Но для эффективной работы стоит придерживаться некоторых рекомендаций:

  • Лучше сразу выбирать кластерную топологию СУБД, иначе придется переписывать запросы, пайплайны и переучивать команду.

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

  • Полезно тщательно изучить дополнительные функции ClickHouse SQL и обучить им команду. То же с приемами DE: словари, карты и другие.

Если вы еще не работаете с ClickHouse, можете протестировать его в рамках сервиса VK Data Platform. Для этих целей VK Cloud предоставляет бонус в размере 20 тысяч рублей. Если же уже имеете опыт взаимодействия и построения архитектур с ClickHouse, пожалуйста, поделитесь им в комментариях, будет полезно.

ссылка на оригинал статьи https://habr.com/ru/articles/1061284/