Как стать автором
Поиск
Написать публикацию
Обновить
552.41
OTUS
Развиваем технологии, обучая их создателей

Разбираемся с ReplacingMergeTree в ClickHouse

Время на прочтение6 мин
Количество просмотров261
Автор оригинала: Team Propel

СУБД ClickHouse славится высокой производительностью при управлении большими наборами данных, и одной из наиболее интересных особенностей, обеспечивающих ее гибкость, является разнообразие специализированных движков таблиц, которые он предлагает. Среди них ReplacingMergeTree выделяется как мощный инструмент для поддержания чистоты и актуальности данных без ручного вмешательства или сложных конвейеров обработки.

Если вы когда-либо сталкивались с проблемой дедупликации в хранилищах данных или задавались вопросом, как эффективно управлять изменяемыми данными в системе, разработанной для скорости и простоты, использование ReplacingMergeTree может стать для вас ответом.

Табличный движок ReplacingMergeTree является частью семейства MergeTree в ClickHouse. При правильном использовании это мощный инструмент, но при неправильном использовании он может «выстрелить вам в ногу». Один из основных случаев использования ReplacingMergeTree — обработка обновлений в реальном времени. В частности, он позволяет нам создавать конвейеры, которые синхронизируют изменяемые данные в базах данных OLTP непосредственно с ClickHouse.

В последних версиях ReplacingMergeTree были добавлены новые функции, поэтому в статье мы решили подробно рассмотреть, как старые, так и новые функции, чтобы помочь пользователям ClickHouse получить от него максимальную пользу.

Что такое движок таблиц ReplacingMergeTree?

ReplacingMergeTree — это вариант стандартного движка таблиц MergeTree в ClickHouse, разработанный специально для дедупликации и замены устаревших или неверных данных. В то время как традиционные движки MergeTree ориентированы на высокую скорость вставки и эффективность запросов, ReplacingMergeTree добавляет возможность замены строк на основе первичного ключа, что делает его идеальным для случаев, когда данные могут потребовать обновления или исправления с течением времени.

Проще говоря, это способ обеспечить наличие в таблице самой последней версии каждой записи, при этом по-прежнему пользуясь преимуществами ClickHouse в плане производительности и масштабируемости.

Как работает ReplacingMergeTree?

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

Можно представить это как сборщик мусора для старых версий ваших данных. Вот как это обычно работает:

Вставка данных: всякий раз, когда вы вставляете данные в таблицу ReplacingMergeTree, ClickHouse сохраняет все версии строки, имеющие одинаковый ключ сортировки. Он не заменяет старые версии сразу во время вставки.

Процесс слияния: со временем ClickHouse выполняет слияния в фоновом режиме, и во время этих слияний удаляет устаревшие версии строк, оставляя только последнюю.

Столбцы версий (опционально): вы также можете указать столбец «version», чтобы указать, какую строку следует сохранить во время слияния. Это полезно, когда вам нужен более явный контроль, например, если вы хотите, чтобы сохранялась строка с наибольшим номером версии. Это полезно для обработки событий, возникших вне очереди.

Определение хорошего ключа сортировки

Наиболее важной функцией движка ReplacingMergeTree является определение выражение ORDER BY. В отличие от общего движка MergeTree, команда ORDER BY здесь имеет другое значение: она определяет «в конечном итоге уникальный» (eventually unique) ключ для таблицы. Это гораздо ближе к традиционному первичному ключу баз данных OLTP, который обеспечивает уникальность ключей. Разница заключается в том, что вместо отклонения неуникальных значений ReplacingMergeTree удаляет дубликаты, сохраняя только последнюю версию.

ORDER BY для ReplacingMergeTree определяет уникальный столбец или уникальную комбинацию столбцов, которые действуют как ключ. Когда строка с таким же ключом добавляется в таблицу, она считается новой версией строки. Затем ClickHouse возвращает новую версию в запросах и удаляет старые версии в фоновом режиме во время слияния. Обратите внимание, что до тех пор, пока старая версия не будет удалена в фоновом режиме, в запросах могут появляться как старая, так и новая версии. Для запроса только новой версии требуется специальный синтаксис.

При разработке хорошего ключа необходимо сочетать две цели: производительность запросов и уникальность. Рассмотрим следующий пример для понимания.

Используйте ORDER BY для оптимизации производительности запросов и добавьте уникальные столбцы в конце.

CREATE TABLE taco_order_rmt AS taco_order
ENGINE = ReplacingMergeTree
PARTITION BY toYYYYMM(taco_order_date)
ORDER BY (taco_type, salsa_spice_level, filling_type, tortilla_type, customer_id, order_id)

Здесь уникальные столбцы добавлены в конце ORDER BY, который должным образом оптимизирован для производительности. Такой подход помогает сбалансировать требования к производительности и дедупликации.

Пример ReplacingMergeTree

Чтобы определить таблицу с помощью ReplacingMergeTree, ваш SQL будет выглядеть примерно так:

CREATE TABLE taco_orders (
    order_id UInt64,
    taco_type String,
    order_time DateTime,
    version UInt64
) ENGINE = ReplacingMergeTree(version)
ORDER BY order_id;

В этом примере ClickHouse объединит строки с одинаковым order_id и сохранит ту, которая имеет наибольшую версию в процессе объединения. Это особенно полезно в сценариях, когда необходимо применить изменения данных без дополнительных шагов по очистке.

Запрос ReplacingMergeTree

При использовании запросе ReplacingMergeTree есть несколько вариантов гарантирующих получение последних версий:

Модификатор: модификатор FINAL применяет логику замены во время запроса, обеспечивая получение последней версии каждой строки. Однако это снижает производительность, особенно при запросе больших наборов данных.

Настройка: в последних версиях настройку final можно указать в запросе или профиле пользователя, что позволяет избежать явного добавления ключевого слова FINAL в каждый запрос.

Практические примеры использования

Обновления в режиме реального времени: ReplacingMergeTree можно использовать для обновлений в режиме реального времени, когда данные вставляются или обновляются на месте, чтобы заменить старые значения. Эту технику часто называют «upserts». Для вставки или обновления строк не требуется специальный синтаксис.

Дедупликация: Если ваш конвейер поступления данных иногда отправляет дубликаты записей из-за повторных попыток, использование ReplacingMergeTree может помочь сохранить только один экземпляр каждой записи, что снизит затраты на хранение и повысит точность запросов.

Медленно изменяющиеся измерения (SCD): при управлении измерениями, которые изменяются медленно, вы можете захотеть сохранить только последнюю версию, чтобы минимизировать объем хранилища и обеспечить отражение в отчетах самой актуальной информации. ReplacingMergeTree идеально подходит для этой задачи.

На что следует обратить внимание

Несмотря на всю мощь ReplacingMergeTree, есть несколько моментов, на которые следует обратить внимание:

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

Соображения по хранению: до момента слияния все версии строки хранятся в хранилище, что может временно увеличить объем занимаемого места.

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

Явный контроль над версиями: если вы используете столбец version, убедитесь, что у вас есть надежная стратегия управления версиями. Неправильные версии могут привести к сохранению неверных строк.

Обновления ORDER BY: столбцы, используемые в предложении ORDER BY, не могут быть обновлены с помощью логики замены. При проектировании ORDER BY для ReplacingMergeTree имейте в виду, какие столбцы могут потребовать обновления.

Когда использовать ReplacingMergeTree

ReplacingMergeTree лучше всего подходит для сценариев, в которых вам нужно:

  • Получить последнюю версию: вас интересует только сохранение самой последней версии записи.

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

  • Эффективное хранение изменяемых данных: вам нужно управлять данными, которые меняются со временем, но вы хотите избежать сложностей, связанных с ручной обработкой обновлений.

Заключение

ReplacingMergeTree добавляет в ClickHouse важный уровень гибкости, упрощая управление изменяющимися данными без ущерба для производительности. Если вы хотите дедуплицировать входящие записи, эффективно управлять исправлениями или просто поддерживать чистоту набора данных, ReplacingMergeTree — инструмент, который стоит рассмотреть. При правильном использовании ReplacingMergeTree может помочь вам реализовать конвейеры синхронизации в реальном времени из баз данных OLTP, таких как MySQL или PostgreSQL, сохраняя качество данных без лишних хлопот.


ReplacingMergeTree — лишь одна из возможностей ClickHouse, которая открывает дорогу к построению реальных продакшен-решений. Но за ней стоит целая экосистема приёмов и инструментов: от архитектуры и настройки до масштабирования и интеграций. Чтобы разобраться глубже, есть курс «ClickHouse для инженеров и архитекторов БД» в OTUS. Его ведут практикующие эксперты индустрии, а познакомиться с форматом можно на бесплатных уроках: это онлайн-занятия с пользой для работы, где вы сразу пробуете подходы, которые применяются в компаниях сегодня.

А чтобы проверить свой уровень знаний для поступления на курс по ClickHouse, пройдите вступительное тестирование.

Теги:
Хабы:
+4
Комментарии0

Публикации

Информация

Сайт
otus.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
OTUS