Перейти к основному содержимому
Перейти к основному содержимому

Слияния частей

Что такое слияния частей в ClickHouse?


ClickHouse быстрый не только для запросов, но и для вставок, благодаря своему слою хранения, который работает аналогично LSM-деревьям:

① Вставки (в таблицы из семейства MergeTree engine) создают отсортированные, неизменяемые части данных.

② Вся обработка данных выполняется в рамках фоновый слияний частей.

Это делает записи данных легковесными и высокоэффективными.

Для контроля количества частей на таблицу и реализации ② выше, ClickHouse непрерывно сливает (по партиции) более мелкие части в более крупные в фоновом режиме до тех пор, пока они не достигнут сжатого размера примерно ~150 ГБ.

Следующая диаграмма изображает этот процесс фонового слияния:

СЛИЯНИЯ ЧАСТЕЙ

Уровень слияния части увеличивается на единицу с каждым дополнительным слиянием. Уровень 0 означает, что часть новая и еще не была слита. Части, которые были слиты в более крупные части, помечаются как неактивные и в конечном итоге удаляются после конфигурируемого времени (по умолчанию 8 минут). Со временем это создает дерево объединенных частей. Поэтому таблица называется деревом слияния.

Мониторинг слияний

В примере что такое части таблицы мы показали, что ClickHouse отслеживает все части таблицы в системной таблице parts. Мы использовали следующий запрос, чтобы получить уровень слияния и количество хранимых строк на каждую активную часть примерной таблицы:

Запуск теперь показывает, что четыре части слились в одну финальную часть (при условии, что в таблицу не было добавлено новых вставок):

В ClickHouse 24.10 была добавлена новая панель слияний в встроенные панели мониторинга. Доступная как в OSS, так и в Cloud через HTTP-обработчик /merges, мы можем использовать ее для визуализации всех слияний частей для нашей примерной таблицы:

СЛИЯНИЯ ЧАСТЕЙ

Записанная панель выше фиксирует весь процесс, от первоначальных вставок данных до финального слияния в одну часть:

① Число активных частей.

② Слияния частей, визуально представленные в виде прямоугольников (размер отражает размер части).

Увеличение записи.

Параллельные слияния

Один сервер ClickHouse использует несколько фоновых потоков слияния, чтобы выполнять параллельные слияния частей:

СЛИЯНИЯ ЧАСТЕЙ

Каждый поток слияния выполняет цикл:

① Решить, какие части слить следующими, и загрузить эти части в память.

② Слить части в памяти в более крупную часть.

③ Записать слитую часть на диск.

Идем к ①

Обратите внимание, что увеличение числа ядер процессора и размера ОП позволяет увеличить пропускную способность фонового слияния.

Оптимизированные по памяти слияния

ClickHouse не обязательно загружает все части, которые будут сливаться, в память сразу, как показано в предыдущем примере. В зависимости от нескольких факторов и для сокращения потребления памяти (пожертвовав скоростью слияния), так называемое вертикальное слияние загружает и сливает части по блокам, а не все сразу.

Механика слияния

Диаграмма ниже иллюстрирует, как один фоновый поток слияния в ClickHouse сливает части (по умолчанию, без вертикального слияния):

СЛИЯНИЯ ЧАСТЕЙ

Слияние частей выполняется в несколько этапов:

① Декомпрессия и загрузка: Сжатые двоичные файловые столбцы из частей, которые будут сливаться, декомпрессируются и загружаются в память.

② Слияние: Данные сливаются в более крупные файловые столбцы.

③ Индексирование: Новый разреженный первичный индекс создается для слитых файловых столбцов.

④ Сжатие и хранение: Новые файловые столбцы и индекс сжимаются и сохраняются в новой директории, представляющей объединенную часть данных.

Дополнительные метаданные в частях данных, такие как вторичные индексы для пропуска данных, статистика колонок, контрольные суммы и мин-макс индексы, также восстанавливаются на основе слитых файловых столбцов. Мы опустили эти детали для простоты.

Механика шага ② зависит от конкретного движка MergeTree, так как разные движки обрабатывают слияние по-разному. Например, строки могут быть агрегированы или заменены, если они устарели. Как упоминалось ранее, этот подход перекладывает всю обработку данных на фоновые слияния, позволяя сверхбыстрые вставки, благодаря легковесным и эффективным операциям записи.

Далее мы кратко изложим механики слияния конкретных движков в семье MergeTree.

Стандартные слияния

Диаграмма ниже иллюстрирует, как части в стандартной таблице MergeTree сливаются:

СЛИЯНИЯ ЧАС�ТЕЙ

DDL-оператор на приведенной выше диаграмме создает таблицу MergeTree с ключом сортировки (town, street), что означает, что данные на диске отсортированы по этим колонкам, и соответственно создается разреженный первичный индекс.

① Декомпрессированные, предварительно отсортированные столбцы таблицы ② сливаются, при этом сохраняется глобальный порядок сортировки таблицы, определяемый ключом сортировки таблицы, ③ создается новый разреженный первичный индекс, и ④ слитые файловые столбцы и индекс сжимаются и хранятся как новая часть данных на диске.

Заменяющие слияния

Слияния частей в таблице ReplacingMergeTree работают аналогично стандартным слияниям, но только наиболее последняя версия каждой строки сохраняется, а более старые версии отбрасываются:

СЛИЯНИЯ ЧАСТЕЙ

DDL-оператор на приведенной выше диаграмме создает таблицу ReplacingMergeTree с ключом сортировки (town, street, id), что означает, что данные на диске отсортированы по этим колонкам, с соответствующим созданием разреженного первичного индекса.

Слияние ② работает аналогично стандартной таблице MergeTree, объединяя декомпрессированные, предварительно отсортированные столбцы при сохранении глобального порядка сортировки.

Тем не менее, ReplacingMergeTree удаляет дубликаты строк с одинаковым ключом сортировки, оставляя только наиболее последнюю строку на основе временной метки создания ее содержащей части.


Суммирующие слияния

Числовые данные автоматически суммируются во время слияний частей из таблицы SummingMergeTree:

СЛИЯНИЯ ЧАСТЕЙ

DDL-оператор на приведенной выше диаграмме определяет таблицу SummingMergeTree с town в качестве ключа сортировки, что означает, что данные на диске отсортированы по этому столбцу и соответственно создается разреженный первичный индекс.

На этапе ② слияния ClickHouse заменяет все строки с одинаковым ключом сортировки одной строкой, суммируя значения числовых столбцов.

Агрегирующие слияния

Пример таблицы SummingMergeTree из выше — это специализированный вариант таблицы AggregatingMergeTree, позволяющий автоматическую инкрементальную трансформацию данных с применением любой из 90+ агрегатных функций во время слияний частей:

СЛИЯНИЯ ЧАСТЕЙ

DDL-оператор на приведенной выше диаграмме создает таблицу AggregatingMergeTree с town в качестве ключа сортировки, обеспечивая порядок данных по этому столбцу на диске и соответственно создавая разреженный первичный индекс.

Во время ② слияния ClickHouse заменяет все строки с одинаковым ключом сортировки одной строкой, хранящей частичные состояния агрегирования (например, sum и count для avg()). Эти состояния обеспечивают точные результаты в результате инкрементальных фоновых слияний.