Learning Platform
Глоссарий Troubleshooting
Урок 04.06 · 15 мин
Средний
Выбор движкаDecision TreeUse Cases

Дерево решений: какой движок выбрать?

Мы разобрали шесть движков семейства MergeTree. Каждый решает свою задачу, но в реальных проектах выбор не всегда очевиден. Этот урок даёт систематический фреймворк: дерево решений и матрицу use case -> engine.


Интерактивное дерево решений

Дерево решений: выбор MergeTree движка
Нужны ли обновления / дедупликация?Начните здесь. Определите основной паттерн работы с данными: insert-only аналитика (логи, события), обновление существующих записей, или предварительная агрегация?
Нет
MergeTreeMergeTree -- базовый движок. Append-only: каждый INSERT создаёт новый part. Нет дедупликации, нет агрегации. Идеален для логов, событий, time-series, clickstream.
Да
Какой тип обновления?Тип обновления определяет движок: полная замена строки (Replacing), суммирование числовых полей (Summing), произвольные агрегатные функции (Aggregating), или sign-based отмена (Collapsing).
Полная замена строки
ReplacingMergeTreeReplacingMergeTree -- дедупликация по ORDER BY ключу при merge. ВАЖНО: дедупликация НЕ происходит при INSERT! Используйте FINAL для корректных результатов. Опциональный ver столбец определяет победителя.
Суммирование числовых полей
SummingMergeTreeSummingMergeTree -- автоматическое суммирование числовых столбцов (не входящих в ORDER BY) при merge. Идеален для счётчиков (просмотры, клики). В запросах всегда используйте sum() -- суммирование может быть неполным.
Произвольные агрегатные функции
AggregatingMergeTreeAggregatingMergeTree -- паттерн -State/-Merge для произвольных агрегатных функций. Колонки типа AggregateFunction(sum, UInt64). INSERT через sumState(), SELECT через sumMerge(). Канонический паттерн: MV + AggregatingMergeTree.
Sign-based отмена строк
Порядок INSERT гарантирован?CollapsingMergeTree и VersionedCollapsingMergeTree используют sign столбец (Int8: +1 = state, -1 = cancel). Разница в требовании к порядку вставки cancel/state строк.
Да
CollapsingMergeTreeCollapsingMergeTree -- требует строгий порядок: state (+1) вставляется ДО cancel (-1). Если порядок нарушен, коллапсирование не сработает. Подходит для однопоточной вставки.
Нет
VersionedCollapsingMergeTreeVersionedCollapsingMergeTree -- добавляет Version столбец, что позволяет вставлять cancel/state в любом порядке. Предпочтительнее CollapsingMergeTree для многопоточной и распределённой вставки.

Пройдите дерево сверху вниз. Каждый узел — вопрос о паттерне работы с данными. Наведите курсор на любой узел для подробного объяснения.


Пошаговый обход дерева

Шаг 1: Нужны ли обновления / дедупликация?

Если данные пишутся один раз и не требуют изменений (логи, clickstream, time-series, audit events) — ответ “Нет”, и правильный выбор — MergeTree. Это самый простой и производительный движок.

Шаг 2: Какой тип обновления?

Если обновления нужны, определите их тип:

  • Полная замена строки по ключу (user profiles, product catalogs) — ReplacingMergeTree
  • Суммирование числовых полей (page view counters, metric rollups) — SummingMergeTree
  • Произвольные агрегатные функции (HyperLogLog uniq, quantile percentiles) — AggregatingMergeTree
  • Sign-based отмена строк (order status updates, financial corrections) — Collapsing-движки

Шаг 3 (только для Collapsing): Порядок INSERT гарантирован?

  • Однопоточная, последовательная вставка — CollapsingMergeTree
  • Многопоточная или distributed вставка — VersionedCollapsingMergeTree

Матрица use case -> engine

Какой движок для какой задачи
Use CaseБизнес-сценарий или технический use case
EngineРекомендуемый движок семейства MergeTree
ПочемуПочему именно этот движок оптимален для данного use case
Логи / события / clickstreamWeb server access logs, application error logs, CDN request logs. Данные append-only, обновления не нужны.
MergeTreeMergeTree -- базовый движок. Максимальная производительность для append-only workloads. Нет overhead от дедупликации или агрегации.
Append-only, нет обновленийAppend-only: данные пишутся один раз. Нет бизнес-потребности в обновлении или дедупликации. MergeTree -- самый быстрый и простой выбор.
User profiles с обновлениямиUser profiles, product catalog, device registry. Нужно хранить последнюю версию записи, старые версии не нужны.
ReplacingMergeTreeReplacingMergeTree -- дедупликация по ORDER BY ключу при merge. Оставляет строку с максимальным ver.
Полная замена по ключуПолная замена строки: старая версия не нужна, достаточно хранить последнюю. Дедупликация при merge уменьшает хранение.
Счётчики page viewsPage view counters, daily click counts, metric rollups. Числовые столбцы суммируются при merge.
SummingMergeTreeSummingMergeTree -- автоматическое суммирование числовых столбцов при merge. Уменьшает хранение для инкрементальных метрик.
Автосуммирование при mergeИнкрементальная агрегация: каждый INSERT добавляет delta к общей сумме. Merge суммирует строки с одинаковым ключом.
Complex pre-aggregation (HLL, percentiles)Hourly/daily rollups с HyperLogLog (uniq users), percentiles (p99 latency), avg(). Сложные агрегатные функции, которые нельзя свести к простому суммированию.
AggregatingMergeTreeAggregatingMergeTree -- паттерн -State/-Merge для произвольных агрегатных функций. Хранит бинарные состояния (HyperLogLog, t-digest).
Произвольные агрегатные функцииПроизвольные агрегаты: uniq (HyperLogLog), quantile (t-digest), avg (sum+count). SummingMergeTree не поддерживает -- нужен полный -State/-Merge.
Order status updates (cancel + new)Order status updates (new -> paid -> shipped), financial corrections, event cancellation. Нужна точная отмена отдельных строк, не полная замена.
Collapsing / VersionedCollapsingCollapsingMergeTree (однопоточная вставка) или VersionedCollapsingMergeTree (многопоточная). Sign-based отмена строк.
Аддитивная агрегация с отменойSign-based отмена: cancel (-1) + new state (+1). Позволяет корректную аддитивную агрегацию sum(amount * Sign) с учётом отмен.
Multi-tenant SaaS metricsMulti-tenant SaaS: per-tenant metric rollups, tenant-level dashboards. Нужна агрегация с группировкой по tenant_id.
Summing / AggregatingSummingMergeTree для простых счётчиков (views, clicks) или AggregatingMergeTree для сложных метрик (uniq users per tenant, p99 per tenant).
Зависит от типа агрегацииЗависит от сложности метрик: простые суммы -> SummingMergeTree; HLL/percentiles -> AggregatingMergeTree. ORDER BY (tenant_id, metric_key).

GraphiteMergeTree: нишевый вариант

GraphiteMergeTree — специализированный движок для хранения метрик в формате Graphite (name, value, timestamp, version). Он выполняет rollup (понижение разрешения) и прореживание данных по возрасту согласно правилам retention policy.

Если вы используете Graphite как систему мониторинга и хотите хранить метрики в ClickHouse — GraphiteMergeTree автоматизирует rollup. Для всех остальных сценариев используйте один из шести основных движков.


Правило по умолчанию

TIP

Сомневаетесь? Начните с MergeTree. Переход на специализированный движок — это оптимизация, не необходимость. MergeTree справится с любой аналитической нагрузкой. Специализированные движки уменьшают хранение и ускоряют определённые паттерны запросов, но не являются обязательными.


Ключевые выводы

  1. Начните с вопроса “нужны ли обновления?” Если нет — MergeTree. Если да — определите тип обновления.
  2. Полная замена строки -> ReplacingMergeTree. Суммирование -> SummingMergeTree. Сложные агрегаты -> AggregatingMergeTree. Sign-based отмена -> Collapsing.
  3. VersionedCollapsingMergeTree предпочтительнее CollapsingMergeTree для production-систем с несколькими источниками данных.
  4. GraphiteMergeTree — только для Graphite-метрик. Не универсальный выбор.
  5. MergeTree по умолчанию: если не уверены, начните с MergeTree. Миграция на специализированный движок — оптимизация, которую можно сделать позже.

Проверьте понимание

Результат: 0 из 0
Аналитический
Вопрос 1 из 3. Система принимает 10 миллионов событий/час и нужно хранить pre-aggregated hourly stats (count, uniq users, p99 latency). Какой движок для target-таблицы?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 7