ClickHouse
ClickHouse — это колоночная система управления базами данных (СУБД), предназначенная для обработки аналитических запросов в реальном времени (OLAP). Разработана компанией Яндекс. Позволяет выполнять интерактивные запросы к большим объёмам данных (терабайты и петабайты) с высокой скоростью.
История
Разработка ClickHouse началась в 2008 году в рамках внутреннего проекта Яндекса по созданию системы веб-аналитики для сервиса Яндекс.Метрика. Основной задачей было обеспечить возможность агрегации и анализа десятков миллиардов событий в день с задержкой не более нескольких секунд. Первая публичная версия (бета) была выпущена 15 июня 2016 года под лицензией Apache 2.0. В 2020 году проект перешёл в управление некоммерческой организации ClickHouse, Inc., созданной при участии инвесторов. К 2024 году ClickHouse является одной из самых популярных OLAP-систем в мире, используемой в сотнях компаний для задач бизнес-аналитики, мониторинга, логирования и машинного обучения.
Архитектура и принципы работы
Ключевое отличие ClickHouse от традиционных строковых СУБД (например, PostgreSQL или MySQL) — колоночное хранение данных. Данные хранятся не по строкам таблицы, а по колонкам (столбцам). Это позволяет:
- Ускорять чтение: аналитические запросы обычно затрагивают лишь несколько колонок из сотен, поэтому считываются только нужные столбцы, а не вся строка.
- Эффективнее сжимать данные: однотипные значения в колонке хорошо сжимаются алгоритмами (LZ4, ZSTD), что значительно уменьшает объём хранимых данных.
- Обрабатывать векторные инструкции процессора: данные в колонках расположены последовательно, что позволяет использовать SIMD-инструкции для параллельной обработки.
Движки таблиц (Table Engines)
ClickHouse поддерживает несколько типов движков для хранения и обработки данных. Основные:
- MergeTree — базовый движок для большинства задач. Данные партиционируются (разбиваются на части по дате или другому ключу), сортируются и индексируются. Поддерживает репликацию, сэмплинг и автоматическое слияние мелких частей в крупные.
- ReplicatedMergeTree — расширение MergeTree с поддержкой репликации через Apache ZooKeeper или ClickHouse Keeper. Обеспечивает отказоустойчивость и автоматический failover.
- Distributed — таблица-представление (view) для распределённых запросов к нескольким локальным таблицам на разных серверах, реализуя шардирование.
- Buffer — буферная таблица для накопления и пачковой вставки данных.
- Log / TinyLog — простые движки для временных таблиц или потоковой обработки, не поддерживают партиционирование и индексацию.
Индексы
Основной индекс в MergeTree — первичный ключ, который задаётся при создании таблицы. Он строится как разрежённый индекс (sparse index): для каждой группы строк (по умолчанию 8192) хранится минимальное значение ключа. При запросах ClickHouse отбрасывает партиции и части таблицы, у которых ключ не попадает в условие фильтра.
Дополнительные индексы:
- Skipping indexes (гранулярные индексы) — позволяют пропускать группы данных, если они не соответствуют условиям запроса (например, Bloom‑фильтр, min‑max).
- Projection (проекции) — автоматически создаваемые материализованные представления внутри таблицы, оптимизирующие запросы к агрегированным данным.
Партиционирование
Таблицы по MergeTree могут быть партиционированы по любому столбцу (обычно по дате или месяцу). Партиции хранятся физически отдельно, что позволяет:
- Обслуживать данные (удалять, архивировать) целыми партициями.
- Убирать из сканирования партиции, не подходящие под условия запроса.
Репликация и шардирование
ClickHouse поддерживает распределённую архитектуру:
- Репликация через Replicated* движки обеспечивает синхронизацию копий данных на разных серверах с помощью ZooKeeper.
- Шардирование реализуется с помощью таблиц типа Distributed, которые перенаправляют запросы к нескольким локальным таблицам, разбросанным по разным хостам.
Функциональные возможности
Типы данных
Поддерживаются стандартные типы (UInt8..UInt64, Int8..Int64, Float32/64, String, FixedString, Date, DateTime) и специальные (Decimal, Array, Tuple, Nested, Enum, UUID, IPv4/IPv6, LowCardinality, Nullable).
SQL-синтаксис
ClickHouse поддерживает подмножество SQL-92 с расширениями для аналитики. Отличия:
- Отсутствие полноценных транзакций (ACID на уровне партиций) и внешних ключей.
- Нет поддержки полнотекстового поиска (но есть функции для regexp).
- Специальные функции для работы с массивами, агрегатами (quantile, approx_count_distinct, topK), оконные функции (с версии 20.3).
- Возможность задавать материализованные представления (MATERIALIZED VIEW) для автоматической агрегации при вставке.
Оптимизация запросов
- Векторное выполнение: запросы обрабатываются не строка за строкой, а блоками до 1024 строк (блоки), используя SIMD-инструкции.
- Параллелизм: запросы распараллеливаются по всем ядрам CPU и по разным серверам в кластере.
- Сжатие на лету: данные в памяти и при передаче сжимаются, снижая I/O.
Операция вставки
Вставка данных производится пачками (batch). ClickHouse оптимизирован для массовых вставок (тысячи строк за раз). Одиночные вставки (INSERT ... VALUES) возможны, но неэффективны. Для реального времени используется механизм async‑insert или буферные таблицы.
Применение
- Веб-аналитика: Яндекс.Метрика, другие системы трекинга (анализ кликов, сессий, воронок).
- Логирование и мониторинг: сбор и анализ системных логов, метрик инфраструктуры (Prometheus + ClickHouse, ELK-стек).
- Бизнес-аналитика (BI): построение дашбордов и отчётов для крупных датасетов (Upsolver, Superset, Metabase).
- Anti-fraud: поиск аномалий, подозрительных транзакций в банковской сфере.
- Телеком: анализ CDR (Call Detail Records) и трафика.
- Научные данные: обработка данных с сенсоров, временных рядов.
Ограничения
- Не подходит для OLTP (точечных обновлений, маленьких транзакций, полнотекстового поиска по отдельным записям).
- Ограниченная поддержка транзакций: нет ACID в классическом понимании (только MVCC на уровне партиций).
- Отсутствие полноценной поддержки внешних ключей и реляционных ограничений.
- Сложность в настройке кластера при больших объёмах данных (балансировка, репликация, восстановление).
Критика и недостатки
- Журналирование (log‑based): при сбое могут потеряться данные, не успевшие в репликацию (хотя для многих сценариев это допустимо).
- Зависимость от ZooKeeper (или ClickHouse Keeper) для репликации — потенциальное узкое место и дополнительная сложность в администрировании.
- Неоптимально для очень широких таблиц (с тысячами колонок) — колоночная модель теряет преимущества при фильтрации по многим столбцам.
- Отсутствие полнотекстового индекса (сложно искать по части строк, только регулярные выражения).
Лицензия и сообщество
ClickHouse распространяется под лицензией Apache 2.0. Существует активное сообщество, коммерческая поддержка предоставляется компанией ClickHouse, Inc. (Сан-Франциско). Яндек остаётся основным контрибьютором кода, но проект развивается сообществом.
Источники
- Официальная документация ClickHouse. — clickhouse.com
- Holt, A. (2021). ClickHouse: Building High‑Performance Analytical Databases. — O'Reilly Media.
- Доклады на конференциях HighLoad++ (Москва) и Percona Live.
- Исходный код проекта на GitHub: github.com/ClickHouse/ClickHouse.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →