Движки таблиц в ClickHouse: что и когда выбирать

ClickHouse движки, ClickHouse примеры курсы обучение, ClickHouse для инженера данных, ClickHouse Школа Больших Данных Учебный Центр Коммерсант

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

Движки БД ClickHouse

Прежде чем разбираться с движками таблиц ClickHouse, вспомним само назначение этого термина. Движок БД или механизм хранения отвечает за управление данными в базе: хранение, извлечение и манипулирование данными. Именно он обеспечивает эффективную работу с данными, реализуя оптимальную производительность, безопасность и согласованность операций.

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

ClickHouse в качестве движка БД использует Atomic, впервые представленный в версии 20.5. Начиная с версии 20.10, он стал ядром ​​базы данных по умолчанию. По сравнению с ранее используемым движком Ordinary, он имеет более сложную файловую структуру, зато быстрее выполняет DDL-запросы, без блокировки DROP и RENAME TABLE, позволяет использовать UUID в путях Zookeeper, чтобы при расширении кластера выполнять любые манипуляции с таблицами: переименовывать, воссоздавать с тем же именем и пр. Движок Atomic поддерживает диалект SQL и настраиваемые движки таблиц, что мы рассмотрим далее.

Вместо Atomic можно использовать движки баз данных: MySQL, MaterializedMySQL, Lazy, PostgreSQL и Replicated. Движки MySQL, MaterializedMySQL и PostgreSQL позволяют подключаться к базам данных на удалённом MySQL/PostgreSQL-сервере и выполнять запросы INSERT и SELECT для обмена данными между ClickHouse и внешними БД. Это удобно при работе одного приложения с несколькими хранилищами данных. Движок MaterializedMySQL пока находится в статусе экспериментального и не рекомендуется для производственного использования. Он создает базу данных ClickHouse со всеми таблицами и данными, которые есть в MySQL, превращая сервер ClickHouse в реплику MySQL, включая чтение binlog-файла и выполняя DDL и DML-запросы.

Движок Replicated основан на Atomic и тоже пока считается экспериментальным. Он поддерживает репликацию метаданных через DDL-лог, записываемый в ZooKeeper и выполняемый на всех репликах базы данных. На одном сервере ClickHouse может одновременно работать и обновляться несколько реплицированных баз, но для любой из них есть только одна реплика.

Движок Lazy сохраняет таблицы только в оперативной памяти через несколько секунд после последнего доступа. Он может использоваться только с небольшими таблицами типа Log (движки семейства Log), которые редко запрашиваются. Синтаксис использования Laze-движка при создании БД немного отличается от других возможных. А использовать движки MySQL, MaterializedMySQL, PostgreSQL и Replicated можно, указав нужны в команде создания базы данных. Например, следующая команда создает БД test_database с движком PostgreSQL, поскольку сами данные лежат в базе данных PostgreSQL под названием postgres_db, доступной пользователю user с паролем password по сокету host:port:

CREATE DATABASE test_database
ENGINE = PostgreSQL('host:port', 'postgres_db, 'user', 'password'[, `schema`, `use_table_cache`]);

Опционально можно задать схему БД PostgreSQL и кэширование структуры таблиц БД.

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

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

  • MergeTree – универсальные движки для высоконагруженных задач: MergeTree, ReplacingMergeTree, SummingMergeTree, AggregatingMergeTree, CollapsingMergeTree, VersionedCollapsingMergeTree и GraphiteMergeTree. Они быстро вставляют данные и обрабатывают их в фоновом режиме, чтобы ускорить последующий доступ к вновь вставленным записям. Эти движки поддерживают репликацию данных в БД с движком Replicated, а также партиционирование. Как мы уже отмечали в прошлой статье, выбор движка зависит от типового варианта использования таблицы. Например, MergeTree отлично подходит для хранения временных рядов в ClickHouse, поддерживая высокую скорость вставки и запросов на больших объемах данных. А SummingMergeTree хорошо работает с простыми агрегациями. Для работы с данными временных рядов инструмента мониторинга Graphite рекомендуется GraphiteMergeTree, а CollapsingMergeTree может снизить объем потребляемого пространства за счет удаления строк, эквивалентных по ключу сортировки.
  • Log — простые движки с небольшим набором функций: TinyLog, StripeLog и Log. Они эффективны, когда надо быстро записать много небольших таблиц (менее 1 миллиона строк) и прочитать их позже целиком. Log-движки хранят данные на диске, поддерживают распределенные файловые системах HDFS и S3. При записи новые данные добавляются в конец файла. Конкурентный доступ к данным обеспечивается за счет блокировок. Во время INSERT-запросов таблица блокируется, а другие запросы на чтение и запись ожидают разблокировки таблицы. При отсутствии запросов на запись количество конкурентных запросов на чтение не ограничено. Операции мутации данных и индексы не поддерживаются, поэтому SELECT-запросы не эффективны для выборки диапазонов. Из-за неатомарной записи данных есть риск получить таблицу с повреждёнными данными, если вдруг операция записи прервется, к примеру, из-за отказа сервера. Движок TinyLog менее эффективен по сравнению с StripeLog и Log: он медленный и не поддерживает параллельного многопоточного чтения данных. Из-за того, что TinyLog хранит каждый столбец в отдельном файле, он потребляет столько же ресурсов (файловых дескрипторов), как StripeLog и Log. TinyLog подходит для простых сценариев с низкой нагрузкой. Log и StripeLog поддерживают параллельное чтение. Log сохраняет каждый столбец таблицы в отдельном файле, а StripeLog хранит все данные в одном файле. Поэтому StripeLog использует меньше файловых дескрипторов операционной системы, но Log эффективнее считывает данные.
  • Интеграционные движки для взаимодействия со сторонними системами: брокеры сообщений (Kafka, RabbitmQ), СУБД (MySQL, PostgreSQL, MongoDB, RocksDB), распределенная файловая система Hadoop (HDFS), облачное объектное хранилище AWS S3, а также универсальные драйверы для связи с базами данных ODBC и JDBC. О работе с движком RocksDB читайте в нашей новой статье.
  • Движки для специальных операций с файлами, URL-адресами, а также данными различных типов в оперативной памяти и буфере (Distributed, Materialized, View, Dictionary, Merge, File, Null, Set, Join, URL, View, Memory, Buffer).

Выбор движка указывается при создании таблицы в DDL-запросе:

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr1] [compression_codec] [TTL expr1] [COMMENT 'comment for column'],
    name2 [type2] [NULL|NOT NULL] [DEFAULT|MATERIALIZED|EPHEMERAL|ALIAS expr2] [compression_codec] [TTL expr2] [COMMENT 'comment for column'],
    ...
) ENGINE = engine
  COMMENT 'comment for table'

Для уже созданной таблицы изменить движок нельзя. Да и вообще область применения команды изменения таблицы ALTER TABLE довольно ограничена: этот SQL-запрос поддерживается только для таблиц с движком семейства MergeTree, а также Merge и Distributed для шардирования таблиц с целью повышения производительности и горизонтальной масштабируемости емкости БД. Поэтому при создании таблицы дата-инженер должен учитывать все варианты ее использования и возможные риски, чтобы выбрать наиболее подходящий движок. Как это сделать, вы узнаете на нашем курсе.

Освойте администрирование и эксплуатацию ClickHouse для аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Я даю свое согласие на обработку персональных данных и соглашаюсь с политикой конфиденциальности.

Источники

  1. https://clickhouse.com/docs/category/engines
  2. https://clickhouse.com/docs/en/sql-reference/statements/create/table
  3. https://github.com/ClickHouse/clickhouse-presentations/blob/master/meetup46/database_engines.pdf
Поиск по сайту