Движки таблиц
Движок таблицы в ADQM/ClickHouse — это тип таблицы, который определяет:
-
место и способ хранения данных;
-
поддерживаемые запросы;
-
конкурентный доступ к данным;
-
возможность использования индексов;
-
возможность многопоточного выполнения запроса;
-
параметры репликации данных.
Семейства движков таблиц
ADQM/ClickHouse поддерживает множество движков таблиц, которые оптимизированы для решения различных задач. Все движки разбиты на семейства (группы):
-
MergeTree — наиболее универсальные и функциональные движки таблиц для хранения больших данных и высокопроизводительного поиска. Основное свойство этих движков — быстрая вставка данных с последующей фоновой обработкой. Подробнее в разделе Семейство MergeTree ниже.
-
Log — простые движки для сценариев, когда необходимо быстро записывать и затем целиком читать множество небольших таблиц (до 1 миллиона строк).
-
Интеграционные — семейство движков для доступа к внешним системам хранения данных (ODBC, JDBC, MySQL, MongoDB, HDFS, S3, Kafka, EmbeddedRocksDB, RabbitMQ, PostgreSQL). Подробную информацию об этих движках и примеры их использования можно получить в разделе Table Engines for Integrations документации ClickHouse.
-
Специальные — семейство движков для специальных задач, например:
-
Distributed — движок для распределенной обработки запросов на нескольких серверах (подробнее о создании и использовании таблиц типа Distributed в статье Шардирование).
-
Dictionary — движок, который отображает данные словаря как таблицу.
-
Merge (не путать с движком MergeTree) — движок, который позволяет читать данные одновременно из произвольного количества других таблиц. Таблица Merge не хранит данные самостоятельно, и запись в такую таблицу не поддерживается.
-
Другие движки — подробнее в разделе Special Table Engines документации ClickHouse.
-
Получить информацию о функциональных возможностях движков таблиц можно с помощью системной таблицы system.table_engines, например:
SELECT * FROM system.table_engines WHERE name in ('MergeTree', 'TinyLog', 'MySQL');
Результат выполнения запроса:
--name--------supports_settings---supports_skipping_indices---supports_projections---supports_sort_order---supports_ttl---supports_replication---supports_deduplication---supports_parallel_insert-- │ MySQL │ 1 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ │ MergeTree │ 1 │ 1 │ 1 │ 1 │ 1 │ 0 │ 0 │ 1 │ │ TinyLog │ 1 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ 0 │ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Семейство MergeTree
Особенности таблиц семейства MergeTree
MergeTree — основной движок таблиц для работы с большими данными в ADQM. Этот движок, а также все его специальные версии, поддерживают:
-
партиционирование, то есть объединение данных таблицы в партиции (наборы записей, которыми можно гибко оперировать — отсоединять/присоединять, переносить и т.д.) по какому-либо критерию (например, по месяцу/дню/типу события);
-
репликацию данных;
-
семплирование данных;
-
оптимизированный поиск при помощи разреженного индекса по первичному ключу.
Вставка и хранение данных
Особенности хранения данных в таблицах семейства MergeTree:
-
При вставке данные записываются не единым целым, а в виде отдельных частей — кусков (data parts). Затем куски поэтапно объединяются между собой в фоновом режиме.
-
Данные в каждом куске отсортированы по первичному ключу.
-
Данные, относящиеся к разным партициям, разбиваются на разные куски. Куски разных партиций не сливаются между собой.
-
Процесс слияния данных управляется системой (система стремится к состоянию, когда каждая партиция содержит всего один отсортированный кусок данных), но его можно форсировать с помощью команды OPTIMIZE.
-
Каждый кусок данных логически делится на гранулы. Гранула — это минимальный неделимый набор данных, который считывается при выборке данных. Размер гранул задается настройками движка
index_granularity
(максимальное количество строк данных в грануле) иindex_granularity_bytes
(максимальный размер гранулы в байтах). -
Каждый кусок хранится в отдельной директории внутри директории таблицы. Куски данных могут храниться как в колоночном формате (каждый столбец хранится в отдельном файле), так и в компактном (все столбцы хранятся в одном файле).
-
В конкретный момент времени в таблице может храниться более одной копии данных — неслитые между собой куски и их объединенный вариант.
-
Старые куски, данные которых были слиты в новый, постепенно удаляются. Время хранения неактивных кусков задает табличная настройка
old_parts_lifetime
. -
Кусками можно манипулировать как партициями (например, доступны операции перемещения, отсоединения и другие).
Специальные версии движка MergeTree
Семейство MergeTree включает также следующие движки таблиц, которые наследуют функциональность MergeTree, но имеют некоторые особенности:
-
ReplacingMergeTree — удаляет дублирующиеся записи с одинаковым значением ключа сортировки. Подходит для фоновой чистки дублирующихся данных в целях экономии места, но не даёт гарантии отсутствия дубликатов.
-
SummingMergeTree — при слиянии кусков данных все строки с одинаковым ключом сортировки заменяются на одну, которая хранит суммы значений столбцов с числовым типом данных.
-
AggregatingMergeTree — используется для создания материализованных представлений (materialized views).
-
CollapsingMergeTree и VersionedCollapsingMergeTree — добавляют в алгоритм слияния кусков данных логику сворачивания (удаления) строк.
-
GraphiteMergeTree — движок для прореживания и агрегирования/усреднения данных Graphite.
Движки реплицируемых таблиц
Для создания реплицируемых таблиц используются движки семейства MergeTree с префиксом Replicated
:
-
ReplicatedMergeTree
-
ReplicatedReplacingMergeTree
-
ReplicatedSummingMergeTree
-
ReplicatedAggregatingMergeTree
-
ReplicatedCollapsingMergeTree
-
ReplicatedVersionedCollapsingMergeTree
-
ReplicatedGraphiteMergeTree
Пример использования движка ReplicatedMergeTree для создания реплицируемых таблиц можно посмотреть в статье Типовой кластер.