Elastic Stack vs ClickStack
- Интерфейс и оповещения: инструменты для выполнения запросов к данным, создания панелей мониторинга и управления оповещениями.
- Хранилище и движок запросов: backend-системы, отвечающие за хранение данных обсервабилити и выполнение аналитических запросов.
- Сбор данных и ETL: агенты и конвейеры, которые собирают данные телеметрии и обрабатывают их перед ингестией.
| Роль | Elastic Stack | ClickStack | Комментарии |
|---|---|---|---|
| Интерфейс и оповещения | Kibana — панели мониторинга, поиск и оповещения | ClickStack UI (HyperDX) — интерфейс реального времени, поиск и оповещения | Оба служат основным интерфейсом для пользователей, включая визуализации и управление оповещениями. Интерфейс ClickStack специально разработан для задач обсервабилити и тесно связан с семантикой OpenTelemetry. |
| Хранилище и движок запросов | Elasticsearch — хранилище JSON-документов с инвертированным индексом | ClickHouse — столбцовая база данных с векторизованным движком | Elasticsearch использует инвертированный индекс, оптимизированный для поиска; ClickHouse использует столбцовое хранение и SQL для высокоскоростной аналитики по структурированным и полуструктурированным данным. |
| Сбор данных | Elastic Agent, Beats (например, Filebeat, Metricbeat) | OpenTelemetry Collector (edge + шлюз) | Elastic поддерживает пользовательские компоненты-отправители и единый агент под управлением Fleet. ClickStack опирается на OpenTelemetry, что позволяет организовать независимый от вендора сбор и обработку данных. |
| SDK для инструментирования | Elastic APM agents (проприетарные) | OpenTelemetry SDKs (распространяемые вместе с ClickStack) | SDK Elastic привязаны к стеку Elastic. ClickStack строится на OpenTelemetry SDKs для журналов, метрик и трасс на основных языках. |
| ETL / Обработка данных | Logstash, ingest pipelines | OpenTelemetry Collector + ClickHouse materialized views | Elastic использует ingest pipelines и Logstash для преобразования данных. ClickStack переносит вычисления на момент вставки с помощью materialized views и processors в OTel collector, которые эффективно и поэтапно преобразуют данные. |
| Архитектурная философия | Вертикально интегрированный стек, проприетарные агенты и форматы | Основанные на открытых стандартах, слабо связанные компоненты | Elastic строит тесно интегрированную экосистему. ClickStack делает акцент на модульности и стандартах (OpenTelemetry, SQL, Объектное хранилище), обеспечивая гибкость и экономическую эффективность. |
Elasticsearch vs ClickHouse
Основные структурные понятия
| Elasticsearch | ClickHouse / SQL | Описание |
|---|---|---|
| Поле | Столбец | Базовая единица данных, содержащая одно или несколько значений определенного типа. Поля Elasticsearch могут хранить примитивные значения, а также массивы и объекты. Поле может иметь только один тип. ClickHouse также поддерживает массивы и объекты (Tuples, Maps, Nested), а также динамические типы, такие как Variant и Dynamic, которые позволяют одному столбцу содержать значения нескольких типов. |
| Документ | Строка | Набор полей (столбцов). Документы Elasticsearch по умолчанию более гибкие: новые поля динамически добавляются на основе данных (тип определяется по данным). Строки ClickHouse по умолчанию привязаны к схеме, и пользователи должны вставлять все столбцы строки или их подмножество. Тип JSON в ClickHouse поддерживает аналогичное создание полуструктурированных динамических столбцов на основе вставленных данных. |
| Индекс | Таблица | Единица выполнения запросов и хранения данных. В обеих системах запросы выполняются по индексам или таблицам, в которых хранятся строки/документы. |
| Неявно | Схема (SQL) | SQL-схемы группируют таблицы в пространства имен и часто используются для управления доступом. В Elasticsearch и ClickHouse схем нет, но обе системы поддерживают безопасность на уровне строк и таблиц через роли и RBAC. |
| Кластер | Кластер / База данных | Кластеры Elasticsearch — это экземпляры среды выполнения, управляющие одним или несколькими индексами. В ClickHouse базы данных организуют таблицы в логическом пространстве имен, обеспечивая ту же логическую группировку, что и кластер в Elasticsearch. Кластер ClickHouse — это распределенный набор узлов, аналогичный Elasticsearch, но он отделен от самих данных и не зависит от них. |
Моделирование данных и гибкость
Dynamic, Variant и JSON. Они позволяют выполнять ингестию полуструктурированных данных с динамическим созданием столбцов и автоматическим определением типов, как в Elasticsearch. Аналогично, тип Map позволяет хранить произвольные пары ключ-значение, хотя и ключ, и значение при этом должны иметь один и тот же тип.
Подход ClickHouse к гибкости типов более прозрачен и управляем. В отличие от Elasticsearch, где конфликты типов могут вызывать ошибки ингестии, ClickHouse позволяет хранить данные смешанных типов в столбцах Variant и поддерживает эволюцию схемы за счёт использования типа JSON.
Если JSON не используется, схема задаётся статически. Если для строки значения не указаны, соответствующие столбцы должны иметь тип Nullable (в ClickStack не используется), либо для них будет использовано значение по умолчанию для данного типа, например пустое значение для String.
Ингестия и преобразование
enrich, rename, grok) для преобразования документов перед индексацией. В ClickHouse аналогичная функциональность достигается с помощью incremental materialized views, которые могут фильтровать и преобразовывать или обогащать входящие данные и вставлять результаты в целевые таблицы. Вы также можете вставлять данные в движок таблицы Null, если нужно хранить только вывод materialized view. Это означает, что сохраняются только результаты materialized view, а исходные данные отбрасываются, что позволяет экономить место в хранилище.
Для обогащения Elasticsearch поддерживает специальные enrich processors, которые добавляют контекст к документам. В ClickHouse словари можно использовать как во время выполнения запроса, так и на этапе ингестии, чтобы обогащать строки — например, для сопоставления IP-адресов с местоположениями или lookup-операций по user-agent при вставке.
Языки запросов
ES|QL доступны только левые внешние JOIN. ClickHouse поддерживает полный синтаксис SQL, включая все типы JOIN, оконные функции, подзапросы (в том числе коррелированные) и CTE. Это важное преимущество, если вам нужно коррелировать сигналы обсервабилити с бизнес-данными или данными инфраструктуры.
В ClickStack в интерфейсе доступен совместимый с Lucene поиск, что упрощает переход, наряду с полной поддержкой SQL через ClickHouse. Этот синтаксис сопоставим с синтаксисом query string в Elastic. Точное сравнение этого синтаксиса см. в статье “Поиск в ClickStack и Elastic”.
Форматы файлов и интерфейсы
Индексирование и хранение
Обработка вставки в ElasticsearchⒶ Новые документы Ⓑ сначала попадают в буфер индексирования в памяти, который по умолчанию сбрасывается раз в секунду. Для определения целевого сегмента для сброшенных документов используется формула маршрутизации, после чего для этого сегмента на диске записывается новый сегмент Lucene. Чтобы повысить эффективность запросов и обеспечить физическое удаление удалённых или обновлённых документов, сегменты Lucene постоянно сливаются в фоновом режиме в более крупные сегменты, пока не достигнут максимального размера 5 ГБ. При этом при необходимости можно принудительно выполнить слияние в ещё более крупные сегменты.
_source (в сжатом виде с помощью LZ4, Deflate или ZSTD), тогда как ClickHouse не хранит отдельное представление документа. Данные восстанавливаются из столбцов во время выполнения запроса, что экономит место в хранилище. Аналогичная возможность доступна в Elasticsearch через Synthetic _source, но с некоторыми ограничениями. Отключение _source также имеет последствия, которые для ClickHouse неактуальны.
В Elasticsearch mapping индекса (эквивалент схем таблиц в ClickHouse) определяют типы полей и структуры данных, используемые для такого хранения и выполнения запросов.
ClickHouse, напротив, — колоночно-ориентированная система: каждый столбец хранится независимо, но всегда отсортирован по первичному ключу/ключу сортировки таблицы. Такая упорядоченность позволяет использовать разреженные первичные индексы, благодаря которым ClickHouse может эффективно пропускать данные во время выполнения запроса. Когда запросы фильтруются по полям первичного ключа, ClickHouse читает только релевантные части каждого столбца, существенно сокращая дисковый ввод-вывод и повышая производительность — даже без полного индекса для каждого столбца.
ClickHouse также поддерживает индексы пропуска данных, которые ускоряют фильтрацию за счёт предварительного вычисления индексных данных для выбранных столбцов. Их нужно явно определять, но они могут значительно повысить производительность. Кроме того, ClickHouse позволяет задавать кодеки сжатия и алгоритмы сжатия для каждого столбца — Elasticsearch такого не поддерживает (его сжатие применяется только к хранению JSON в _source).
ClickHouse также поддерживает сегментирование, но его архитектура ориентирована прежде всего на вертикальное масштабирование. Один сегмент может хранить триллионы строк и при этом работать эффективно, пока это позволяют память, CPU и диск. В отличие от Elasticsearch, у сегмента нет жесткого ограничения на число строк. Сегменты в ClickHouse логические — по сути, это отдельные таблицы, — и не требуют партиционирования, если только набор данных не превышает емкость одного узла. Обычно это происходит из-за ограничений по объему диска, и сегментирование ① применяют только тогда, когда действительно необходимо горизонтальное масштабирование, — это снижает сложность и накладные расходы. В этом случае, как и в Elasticsearch, сегмент будет хранить подмножество данных. Данные внутри одного сегмента организованы как набор ② неизменяемых частей данных, содержащих ③ несколько структур данных.
Обработка внутри сегмента ClickHouse полностью распараллелена, и пользователям рекомендуется масштабироваться вертикально, чтобы избежать сетевых затрат, связанных с перемещением данных между узлами.
Обработка вставок в ClickHouseВставки в ClickHouse по умолчанию синхронные — запись подтверждается только после коммита, — но можно настроить асинхронные вставки, чтобы получить буферизацию и батчинг, как в Elastic. Если используются асинхронные вставки данных, Ⓐ новые строки сначала попадают в Ⓑ буфер вставки в памяти, который по умолчанию сбрасывается раз в 200 миллисекунд. Если используется несколько сегментов, для маршрутизации новых строк в нужный сегмент используется distributed таблица. Затем для сегмента на диске записывается новая часть.
Распределение и репликация
SELECT на все сегменты и объединяя результаты. Для операций INSERT они балансируют нагрузку, равномерно распределяя данные между сегментами. Репликация в ClickHouse очень гибкая: любая реплика (копия сегмента) может принимать записи, а все изменения асинхронно синхронизируются с остальными. Такая архитектура позволяет без перерывов обслуживать запросы во время сбоев или обслуживания, а повторная синхронизация выполняется автоматически, что устраняет необходимость в жестком соблюдении схемы primary-secondary на уровне данных.
ClickHouse CloudВ ClickHouse Cloud архитектура использует shared-nothing-модель вычислений, в которой один сегмент опирается на объектное хранилище. Это заменяет традиционную Высокую доступность на основе реплик, позволяя нескольким узлам одновременно читать и записывать один и тот же сегмент. Разделение хранилища и вычислений обеспечивает эластичное масштабирование без явного управления репликами.
- Elastic: Сегменты представляют собой физические структуры Lucene, привязанные к памяти JVM. Избыточное количество сегментов снижает производительность. Репликация синхронная и координируется master node.
- ClickHouse: Сегменты логические и вертикально масштабируемые, с очень эффективным локальным выполнением. Репликация асинхронная (но может быть последовательной), а координация — легковесная.
Дедупликация и маршрутизация
_id, направляя их в соответствующие сегменты. ClickHouse не хранит идентификатор строки по умолчанию, но поддерживает дедупликацию при вставке, позволяя пользователям безопасно повторять неудачные вставки. Для большего контроля ReplacingMergeTree и другие движки таблиц поддерживают дедупликацию по заданным столбцам.
Маршрутизация индекса в Elasticsearch гарантирует, что определённые документы всегда направляются в определённые сегменты. В ClickHouse можно определить ключи сегментации или использовать таблицы Distributed, чтобы добиться схожей локальности данных.
Агрегации и модель выполнения
SELECT count(*) FROM ... GROUP BY ... в Elasticsearch является terms aggregation, то есть один из видов bucket aggregation в Elasticsearch.
GROUP BY в ClickHouse с count(*) и terms aggregation в Elasticsearch в целом эквивалентны по функциональности, но заметно различаются по реализации, производительности и качеству результатов.
В Elasticsearch эта агрегация оценивает результаты в запросах “top-N” (например, при выводе 10 хостов с наибольшим числом событий), если запрашиваемые данные распределены по нескольким сегментам. Это ускоряет выполнение, но может снижать точность. Уменьшить эту ошибку можно, проверяя doc_count_error_upper_bound и увеличивая параметр shard_size — ценой роста использования памяти и снижения производительности запроса.
Elasticsearch также требует указывать настройку size для всех агрегаций по бакетам — вернуть все уникальные группы без явного лимита невозможно. Агрегации с большим числом уникальных значений могут упереться в ограничение max_buckets или потребовать постраничного обхода с помощью composite aggregation, что часто оказывается сложным и неэффективным.
ClickHouse, напротив, выполняет точные агрегации из коробки. Такие функции, как count(*), возвращают точные результаты без дополнительных изменений конфигурации, благодаря чему поведение запросов становится проще и предсказуемее.
ClickHouse не накладывает ограничений на размер. Вы можете выполнять неограниченные запросы GROUP BY на больших датасетах. Если превышены пороги памяти, ClickHouse может выгружать промежуточные данные на диск. Агрегации с группировкой по префиксу первичного ключа особенно эффективны и часто выполняются с минимальным потреблением памяти.
Модель выполнения
- SIMD-векторизации: операции над столбцовыми данными используют SIMD-инструкции CPU (например, AVX512), что позволяет обрабатывать значения батчами.
- Параллелизма на уровне кластера: в распределенных конфигурациях каждый узел выполняет обработку запросов локально. Промежуточные состояния агрегации потоково передаются на инициирующий узел и объединяются. Если ключи
GROUP BYв запросе совпадают с ключами сегментирования, слияние можно свести к минимуму или полностью избежать.
Эта модель обеспечивает эффективное масштабирование по ядрам и узлам, благодаря чему ClickHouse хорошо подходит для крупномасштабной аналитики. Использование промежуточных состояний агрегации позволяет объединять промежуточные результаты из разных потоков и узлов без потери точности. Elasticsearch, напротив, назначает один поток на сегмент для большинства агрегаций независимо от того, сколько ядер CPU доступно. Эти потоки возвращают локальные для сегмента результаты top-N, которые затем объединяются на координирующем узле. Такой подход может не в полной мере задействовать системные ресурсы и приводить к неточностям в глобальных агрегациях, особенно когда часто встречающиеся термины распределены по нескольким сегментам. Точность можно повысить, увеличив параметр
shard_size, но это приводит к росту использования памяти и задержек при выполнении запросов.
Итог: ClickHouse выполняет агрегации и запросы с более мелкозернистым параллелизмом и более гибким управлением аппаратными ресурсами, тогда как Elasticsearch опирается на выполнение на основе сегментов с более жесткими ограничениями.
Чтобы подробнее разобраться в механике агрегаций в этих технологиях, рекомендуем запись в блоге “ClickHouse vs. Elasticsearch: The Mechanics of Count Aggregations”.
Управление данными
Управление жизненным циклом индекса vs встроенный TTL
Уровни хранения и архитектуры hot-warm
MergeTree, которые могут автоматически перемещать старые данные между разными томами (например, с SSD на HDD, а затем в Объектное хранилище) по заданным правилам. Это позволяет реализовать подход Elastic с hot-warm-cold — но без сложностей, связанных с управлением несколькими ролями узлов или кластерами.
ClickHouse CloudВ ClickHouse Cloud это работает еще проще: все данные хранятся в Объектном хранилище (например, S3), а вычислительные ресурсы отделены от хранения. Данные могут оставаться в объектном хранилище до момента запроса, после чего они загружаются и кэшируются локально (или в распределенном кэше), обеспечивая тот же профиль затрат, что и frozen-уровень в Elastic, но с более высокой производительностью. При таком подходе данные не нужно перемещать между уровнями хранения, поэтому архитектуры hot-warm становятся избыточными.
Rollups и инкрементальные агрегации
blue (11, 12 и 13), появившихся с момента предыдущего checkpoint. Поэтому исходный индекс фильтруется по всем существующим документам blue, и с помощью composite aggregation (чтобы использовать pagination результатов) агрегированные значения пересчитываются заново (а индекс назначения обновляется документом, который заменяет документ с предыдущими значениями агрегации). Аналогично в точках ② и ③ новые checkpoints обрабатываются путем проверки изменений и пересчета агрегированных значений по всем существующим документам, принадлежащим одному и тому же бакету blue.
ClickHouse использует принципиально иной подход. Вместо периодической повторной агрегации данных ClickHouse поддерживает incremental materialized views, которые преобразуют и агрегируют данные во время вставки. Когда новые данные записываются в исходную таблицу, materialized view выполняет заранее определенный SQL-запрос агрегации только для новых вставленных блоков и записывает агрегированные результаты в целевую таблицу.
Эта модель возможна благодаря поддержке в ClickHouse Промежуточных состояний агрегации — промежуточных представлений функций агрегации, которые можно хранить и затем объединять. Это позволяет поддерживать частично агрегированные результаты, которые быстро запрашиваются и недорого обновляются. Поскольку агрегация происходит по мере поступления данных, нет необходимости запускать дорогостоящие периодические задачи или заново агрегировать старые данные.
Ниже мы схематично показываем, как работают incremental materialized views (обратите внимание, что мы используем синий цвет для всех строк, принадлежащих одной и той же группе, для которой хотим заранее вычислить агрегированные значения):
На диаграмме выше исходная таблица materialized view уже содержит часть данных, в которой хранятся некоторые строки blue (с 1 по 10), принадлежащие одной и той же группе. Для этой группы в целевой таблице представления также уже существует часть данных, хранящая Промежуточное состояние агрегации для группы blue. Когда происходят вставки ① ② ③ в исходную таблицу с новыми строками, для каждой вставки создается соответствующая часть данных исходной таблицы, и параллельно, только для каждого блока вновь вставленных строк, вычисляется промежуточное состояние агрегации и вставляется в виде части данных в целевую таблицу materialized view. ④ Во время фоновых слияний частей промежуточные состояния агрегации объединяются, что приводит к инкрементальной агрегации данных.
Обратите внимание, что все агрегатные функции (их более 90), включая их комбинации с combinators агрегатных функций, поддерживают Промежуточные состояния агрегации.
Более конкретный пример сравнения Elasticsearch и ClickHouse для инкрементальных агрегаций см. в этом примере.
Преимущества подхода ClickHouse включают:
- Всегда актуальные агрегаты: materialized view всегда остаются синхронизированными с исходной таблицей.
- Без фоновых задач: агрегации выполняются на этапе вставки, а не во время выполнения запроса.
- Лучшая производительность в реальном времени: идеально подходит для рабочих нагрузок обсервабилити и Real-time аналитики, где свежие агрегаты нужны мгновенно.
- Комбинируемость: materialized view можно выстраивать слоями или объединять через JOIN с другими представлениями и таблицами для более сложных стратегий ускорения запросов.
- Разные TTL: для исходной таблицы и целевой таблицы materialized view можно задавать разные настройки TTL.
Поддержка lakehouse
- Интеграция с каталогом данных: ClickHouse поддерживает интеграцию с каталогами данных, такими как AWS Glue, что позволяет автоматически обнаруживать таблицы в объектном хранилище и получать к ним доступ.
- Поддержка объектного хранилища: нативная поддержка запросов к данным, хранящимся в S3, GCS и Azure Blob Storage, без необходимости перемещения данных.
- Федерация запросов: возможность коррелировать данные из нескольких источников, включая таблицы lakehouse, традиционные базы данных и таблицы ClickHouse, с помощью внешних словарей и табличных функций.
- Инкрементальная загрузка: поддержка непрерывной загрузки из таблиц lakehouse в локальные таблицы MergeTree с использованием таких возможностей, как S3Queue и ClickPipes.
- Оптимизация производительности: выполнение распределённого запроса к данным lakehouse с помощью cluster functions для повышения производительности.