Движки таблиц

Движок таблицы в 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 для создания реплицируемых таблиц можно посмотреть в статье Типовой кластер.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней