Практический инженерный курс по ClickHouse 26.3 LTS: проектирование схемы под нагрузку, надёжная загрузка, доказательная оптимизация, репликация, шардирование, наблюдаемость, безопасность и восстановление после сбоев.
Спроектируйте аналитическую систему, докажите её производительность измерениями и подготовьте к сбоям
После курса вы сможете не просто написать SELECT, а принять и защитить инженерные решения:
EXPLAIN, system.query_log и system.parts, находить причину деградации;Курс ориентирован на ClickHouse 26.3 LTS. Версионно зависимые возможности помечены в тексте; для практики используется закреплённый образ, а не плавающий тег latest.
Для спорных и версионно зависимых деталей используйте первичные источники: описание 26.3 LTS, установка на Debian/Ubuntu, материализованные представления, BACKUP и RESTORE и актуальная модель JOIN.
Вы строите хранилище событий для SaaS-сервиса. Нагрузка проекта постепенно растёт:
В итоговом практикуме каждая оптимизация проверяется числами: объёмом чтения, временем, памятью, количеством частей и выполнением RPO/RTO.
| Маршрут | Для кого | Темы | Подтверждение навыка |
|---|---|---|---|
| Основа | backend-разработчик без опыта ClickHouse | 1–6, 12 | Рабочая таблица событий и корректные аналитические запросы |
| Производительность | backend/data engineer | 1–7, 10–12 | Отчёт «до/после» с EXPLAIN и system.query_log |
| Распределённая система | инженер данных или платформы | все темы | Проект кластера, инструкция на случай отказа и проверенное восстановление |
| № | Тема | Наблюдаемый результат | Уровень |
|---|---|---|---|
| 1 | Архитектура | Объяснить стоимость чтения, вставки и merge | Junior |
| 2 | Воспроизводимое окружение | Запустить закреплённую LTS-версию и проверить подключение | Junior |
| 3 | Типы данных | Сократить хранение без потери смысла данных | Junior |
| 4 | MergeTree: основа | Выбрать ORDER BY, PARTITION BY и гранулярность | Junior |
| 5 | Специализированные MergeTree | Смоделировать версии, дедупликацию и агрегаты | Middle |
| 6 | SQL и функции | Решить продуктовые задачи с агрегациями, окнами и JOIN | Middle |
| 7 | Индексы и проекции | Доказать уменьшение чтения по плану и метрикам | Middle |
| 8 | Репликация | Задать модель отказа и требуемую согласованность | Senior |
| 9 | Шардирование | Выбрать ключ без перекоса и лишней пересылки данных | Senior |
| 10 | Оптимизация запросов | Найти узкое место экспериментом, а не догадкой | Senior |
| 11 | Предвычисления и словари | Выбрать инкрементальное или обновляемое MV, проекцию либо словарь | Senior |
| 12 | Жизненный цикл данных | Организовать идемпотентную загрузку, TTL и изменения | Middle |
| 13 | Наблюдаемость | Собрать сигналы и диагностировать учебный инцидент | Senior |
| 14 | Безопасность | Реализовать минимальные привилегии и изоляцию арендаторов | Middle |
| 15 | Эксплуатация | Спроектировать SLO, восстановление из копии и безопасное обновление | Senior |
| 16 | Итоговый практикум | Защитить проект на основе измерений и испытаний отказа | Senior |
На чтение должно уходить не больше 40% времени. Остальное — запросы, измерения, диагностика и письменная защита решений.
Для каждого эксперимента сохраняйте:
query_id, EXPLAIN indexes = 1 или EXPLAIN PIPELINE;read_rows, read_bytes, memory_usage, query_duration_ms;Один быстрый запуск ничего не доказывает. Сравнивайте несколько прогонов, не меняйте одновременно несколько факторов и отмечайте влияние кэша.
GROUP BY, подзапросы и JOIN;Закрепляем LTS-версию курса:
docker run -d --name clickhouse-server \
-p 8123:8123 \
-p 9000:9000 \
-v clickhouse_data:/var/lib/clickhouse \
clickhouse/clickhouse-server:26.3
Проверка:
docker exec clickhouse-server clickhouse-client \
--query "SELECT version(), timezone(), 1"
Команды удаления контейнера и тома приведены в уроке по установке. Не выполняйте их в окружении с нужными данными.
Курс завершён, когда выполнены все четыре условия:
Открытый экзамен проверяет объяснение решений. Формулировка без запроса, метрики или сценария сбоя не считается доказательством навыка.
Что такое ClickHouse, история создания, область применения, колоночная архитектура, векторизованное выполнение
Установка через Docker и нативно, clickhouse-server, clickhouse-client, веб-интерфейс, первая база данных
Числовые, строковые, даты, массивы, кортежи, Nullable, LowCardinality, специализированные типы
Что такое движки таблиц, MergeTree, Log, Memory, File, Table, Null, различия и применение
ReplacingMergeTree, SummingMergeTree, AggregatingMergeTree, CollapsingMergeTree, VersionedCollapsingMergeTree, GraphiteMergeTree
SELECT, INSERT, агрегатные функции, оконные функции, функции для работы с массивами, JOIN, подзапросы
Первичный индекс, индекс ключей сортировки, вторичные индексы (data skipping), полнотекстовый индекс, проекции
ReplicatedMergeTree, ZooKeeper/ClickHouse Keeper, кворумы вставки, восстановление после сбоев
Распределённые таблицы, шардирование, кластеры, движок Distributed, глобальные JOIN и балансировка
EXPLAIN, анализ планов выполнения, оптимизация JOIN, предикаты, партиционирование, типичные антипаттерны
Инкрементальные и обновляемые материализованные представления, загрузка истории без дублей, словари и цена предвычислений
INSERT, UPDATE, DELETE, ALTER, мутации, TTL, сжатие, кодировки, оптимизация партиций
Системные таблицы, логи, метрики, трассировка запросов, профилирование и оповещения
Пользователи, роли, права доступа, квоты, SSL/TLS, аудит и политики доступа к строкам
SLO, встроенные BACKUP/RESTORE, проверка RPO/RTO, безопасные обновления, масштабирование и разбор инцидентов
Сквозной проект аналитической платформы: схема, загрузка, измерения, отказ, восстановление и инженерная защита
Доступен после всех тем (0 из 16)
Доступен после зачёта
Online Analytical Processing — класс систем для анализа больших объёмов данных. В отличие от OLTP (транзакционных систем), OLAP оптимизирован для сложных аналитических запросов.
Пример
ClickHouse — это OLAP-система, предназначенная для аналитики, а не для транзакций.Связанные термины
База данных, хранящая данные по колонкам, а не по строкам. Это позволяет эффективно сжимать данные и выполнять запросы, читающие только несколько колонок.
Пример
В колоночной БД значения колонки `user_id` хранятся вместе, что позволяет быстро посчитать `COUNT(DISTINCT user_id)`.Связанные термины
Метод выполнения запросов, при котором операции применяются не к одной строке, а к вектору (пакету) строк одновременно. Это позволяет эффективно использовать SIMD-инструкции процессора.
Пример
При сложении двух колонок ClickHouse обрабатывает сразу 64 или 128 значений за одну CPU-инструкцию.Связанные термины
Семейство движков ClickHouse, которые хранят данные в отсортированных частях. Новые части появляются после вставок, а затем сервер объединяет их в фоне.
Пример
CREATE TABLE events ENGINE = MergeTree() ORDER BY (event_date, user_id)Связанные термины
Движок таблиц, который при слиянии частей удаляет дубликаты строк с одинаковым ключом сортировки, оставляя последнюю версию (или версию с максимальным значением версии).
Пример
CREATE TABLE users ENGINE = ReplacingMergeTree(version) ORDER BY user_idСвязанные термины
Движок таблиц, который при слиянии суммирует значения числовых колонок для строк с одинаковым ключом сортировки. Используется для предварительной агрегации данных.
Пример
CREATE TABLE sales ENGINE = SummingMergeTree() ORDER BY (date, product_id)Связанные термины
Движок для хранения предварительно агрегированных данных с использованием агрегатных функций состояния (AggregateFunction). Позволяет строить сложные преагрегации.
Пример
CREATE TABLE stats ENGINE = AggregatingMergeTree() ORDER BY date SELECT date, uniqState(user_id) AS users FROM raw GROUP BY dateСвязанные термины
Движок, который использует колонку Sign (+1/-1) для схлопывания пар строк: вставка (+1) и удаление (-1) одной логической записи. Позволяет эмулировать UPDATE/DELETE.
Пример
CREATE TABLE orders ENGINE = CollapsingMergeTree(sign) ORDER BY order_id INSERT VALUES (1, +1), (1, -1)Связанные термины
Специализированный тип-обёртка, который хранит строковые (или другие) значения в виде словаря с числовыми кодами. Значительно уменьшает размер данных и ускоряет запросы для колонок с малым числом уникальных значений.
Пример
LowCardinality(String) для колонки country_code (всего ~200 значений)Связанные термины
Тип-обёртка, позволяющий колонке хранить NULL-значения. В ClickHouse NULL — это специальное значение, а не отсутствие данных. Nullable добавляет небольшую накладную плату на хранение.
Пример
Nullable(Int32) — колонка может содержать NULLСвязанные термины
Тип данных для хранения массивов однородных элементов. ClickHouse имеет богатый набор функций для работы с массивами.
Пример
Array(String) — массив строк, [1, 2, 3] — литерал массиваСвязанные термины
Специализированный тип для хранения состояния агрегатной функции. Позволяет инкрементально обновлять агрегаты и комбинировать состояния из разных частей данных.
Пример
AggregateFunction(uniq, UInt64) — состояние для подсчёта уникальных значенийСвязанные термины
В ClickHouse первичный ключ — это не уникальность, а индекс для ускорения поиска по диапазонам. Он определяет порядок сортировки данных в партициях и используется для data skipping.
Пример
PRIMARY KEY (date, user_id) — данные сортируются по date, затем по user_idСвязанные термины
Индексы, которые позволяют пропускать гранулы данных при чтении. В отличие от традиционных индексов, они не ускоряют поиск, а уменьшают объём читаемых данных.
Пример
INDEX idx_price price TYPE minmax GRANULARITY 4 — пропускает гранулы, где price вне диапазонаСвязанные термины
Дополнительная отсортированная копия данных таблицы с другой сортировкой или агрегацией. ClickHouse автоматически выбирает оптимальную проекцию для запроса.
Пример
ALTER TABLE events ADD PROJECTION user_stats (SELECT user_id, count() GROUP BY user_id)Связанные термины
Логическое разделение данных таблицы по значению ключа партиционирования (обычно по дате). Каждая партиция хранится отдельно, что упрощает управление данными и ускоряет запросы с фильтром по партиции.
Пример
PARTITION BY toYYYYMM(event_date) — данные разбиты по месяцамСвязанные термины
Распределённая система координации, используемая ClickHouse для хранения метаданных при репликации. Обеспечивает консенсус между репликами.
Пример
ClickHouse хранит в ZooKeeper информацию о частях данных, кворумах и лидерах реплик.Связанные термины
Встроенная альтернатива ZooKeeper для координации реплик и распределённых DDL. Keeper использует Raft и рассчитан на характерную для ClickHouse нагрузку.
Пример
keeper_server в конфигурации ClickHouse может заменить внешний ZooKeeper.Связанные термины
Движок таблиц с поддержкой репликации. Данные автоматически синхронизируются между репликами через ZooKeeper/Keeper.
Пример
CREATE TABLE events ON CLUSTER cluster ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/events', '{replica}') ORDER BY dateСвязанные термины
Движок, который объединяет данные нескольких шардов в одну логическую таблицу. Сам данные не хранит, а направляет запросы на нужные шарды.
Пример
CREATE TABLE events_all ENGINE = Distributed(cluster_all, default, events, rand())Связанные термины
Горизонтальное разделение данных между несколькими серверами (шардами). Каждый шард хранит только часть данных, что позволяет масштабироваться горизонтально.
Пример
Данные пользователей распределяются по 10 шардам по хэшу user_idСвязанные термины
Механизм гарантии, что данные записаны на определённое число реплик перед подтверждением клиенту. Обеспечивает durability в распределённой системе.
Пример
INSERT INTO TABLE ... SETTINGS insert_quorum=2 — ждать подтверждения от 2 репликСвязанные термины
Объект БД, который автоматически обновляется при вставке данных в исходную таблицу. Хранит результат запроса (агрегацию, фильтрацию, трансформацию) в физической таблице.
Пример
CREATE MATERIALIZED VIEW daily_stats TO stats_table AS SELECT toDate(event_time) AS date, count() FROM events GROUP BY dateСвязанные термины
Материализованное представление, которое выполняет запрос по расписанию. Без APPEND успешное обновление заменяет прошлый результат, с APPEND дописывает новые строки.
Пример
CREATE MATERIALIZED VIEW snapshot REFRESH EVERY 1 HOUR AS SELECT ...Связанные термины
Структура данных для быстрого обогащения запросов дополнительными данными (например, из внешней БД или файла). Словари загружаются в память и кэшируются.
Пример
dictGet('users_dict', 'country', user_id) — получить страну по ID пользователяСвязанные термины
Политика автоматического удаления или перемещения данных по истечении заданного времени. Позволяет управлять жизненным циклом данных.
Пример
TTL event_date + INTERVAL 1 YEAR DELETE — удалить данные старше годаСвязанные термины
Операция массового UPDATE или DELETE в ClickHouse. Выполняется асинхронно фоном, создавая новые части данных без изменяемых строк.
Пример
ALTER TABLE users UPDATE is_active = 0 WHERE last_login < '2025-01-01'Связанные термины
Встроенные таблицы в базе system, содержащие метаданные, метрики, логи и информацию о выполнении запросов. Основной инструмент мониторинга и отладки.
Пример
SELECT * FROM system.query_log WHERE query_date = today() — логи запросовСвязанные термины
Минимальная единица чтения данных в ClickHouse (обычно 8192 строки). Индексы позволяют пропускать гранулы, не подходящие под условия запроса.
Пример
При GRANULARITY 4 вторичный индекс применяется к каждой 4-й гранулеСвязанные термины
Состав курса, уровни, практика и способы проверки знаний.
Курс включает 16 тем и 190 вопросов с разбором ответа. Начать можно с первой темы курса.
Маршрут охватывает уровни Junior, Middle, Senior. Темы расположены от основы к более сложным инженерным задачам, поэтому можно начать с подходящего места и не пропускать важные зависимости.
После прохождения тем доступен зачёт по курсу «ClickHouse: от схемы до эксплуатации» — 20 случайных вопросов с порогом 80%. После зачёта открывается экзамен с развёрнутыми ответами и автоматической оценкой, приближённый к техническому собеседованию.
Да, курс полностью бесплатный: все 16 тем доступны без оплаты.