Итоги модуля: Распределённая архитектура
Модуль 09 охватил полный стек распределённого ClickHouse — от фундаментальных механизмов репликации до облачной архитектуры SharedMergeTree. Десять уроков провели нас от одного узла с Keeper до продакшен-кластеров с несколькими шардами, кворумными записями и параллельным чтением.
Ключевые решения проектирования
-
ReplicatedMergeTree + Keeper = фундамент репликации (DIST-01). Таблица получает имя пути в Keeper (
/clickhouse/tables/{shard}/{db}/{table}), который координирует синхронизацию между репликами. Keeper хранит метаданные частей, лог репликации и DDL-блокировки. -
Лог репликации и SYSTEM RESTORE REPLICA = механизм восстановления (DIST-02). GET_PART, MERGE_PARTS, MUTATE_PART — операции в
system.replication_queue. При застрявших записях:SYSTEM RESTORE REPLICAпересоздаёт метаданные из Keeper.SYSTEM SYNC REPLICAждёт завершения очереди. -
Ключ шардирования: xxHash64 vs rand() (DIST-03).
xxHash64(user_id)концентрирует все события пользователя на одном шарде (колокация), что ускоряет GROUP BY по user_id.rand()даёт равномерное распределение, но ломает колокацию. Выбор определяется паттерном запросов. -
Выбор топологии: 1S_3R vs 2S_2R vs 3S_2R (DIST-04). 1 шард / 3 реплики = максимальная HA без горизонтального масштабирования записи. 2+ шарда = линейный рост пропускной способности записи. Каждая конфигурация — компромисс между HA, масштабированием и сложностью операционной поддержки.
-
Стратегия INSERT: локально vs через Distributed (DIST-05). Запись через Distributed-таблицу с
internal_replication=trueделегирует копирование репликам. Прямая запись в локальный ReplicatedMergeTree даёт меньше накладных расходов. Async-буферизация снижает latency за счёт риска потери данных при сбое. -
Кворум: eventual vs strong consistency (DIST-06).
insert_quorumтребует подтверждения от N реплик до возврата клиенту.select_sequential_consistencyгарантирует чтение после кворумной записи. Цена — дополнительная задержка. SharedMergeTree (Cloud) делает все записи кворумными по умолчанию. -
Параллельные реплики: горизонтальный read scale-out (DIST-07).
enable_parallel_replicas=1+max_parallel_replicasраспределяет сканирование гранул между репликами. Эффективно для больших полносканирующих запросов. Для точечных запросов с хорошей первичной фильтрацией выигрыш минимален. -
Replicated Database Engine: DDL без ON CLUSTER (DIST-08).
CREATE DATABASE ... ENGINE = Replicated(...)автоматически распространяет DDL через Keeper.CREATE TABLEна одном узле появляется на всех узлах кластера. Упрощает управление схемой в продакшене. -
SharedMergeTree: Cloud-native будущее (DIST-09). Разделяет слой вычислений (ClickHouse nodes) и слой хранения (S3/GCS/Azure). Нет репликации данных между узлами — все читают из общего объектного хранилища. Горизонтальное масштабирование compute без миграции данных.
-
Keeper: мониторинг, восстановление, миграция (DIST-10).
echo mntr | nc host 9181показывает latency, leader/follower, количество znodes.can_become_leader=falseдля learner-реплик.clickhouse-keeper-converterдля миграции с ZooKeeper. SYSTEM RESTORE REPLICA для восстановления реплики после потери данных.
Что дальше
Модуль 10: TTL, Tiered Storage и Data Lifecycle — управление жизненным циклом данных: автоматическое удаление, перенос на холодное хранилище, политики хранения на уровне таблицы и партиции. Знание распределённой архитектуры (этот модуль) необходимо для проектирования многоуровневого хранилища в кластерной среде.
Для закрепления материала выполните лабораторную работу по кластеру из репозитория курса (labs/cluster/). Лаб поднимает 3 Keeper + 2 ClickHouse в Docker Compose и включает упражнения по репликации, Distributed-запросам и мониторингу Keeper. Минимальные требования: 16 ГБ оперативной памяти. Однопоточный вариант с одним ClickHouse-узлом задокументирован в labs/cluster/README.md.