Это часть 1 руководства по миграции с PostgreSQL на ClickHouse. На практическом примере показано, как эффективно выполнить миграцию с помощью репликации в реальном времени (CDC). Многие из рассмотренных здесь концепций также применимы к ручному массовому переносу данных из PostgreSQL в ClickHouse.
Набор данных
post, vote, user, comment и badge, появившиеся на Stack Overflow с 2008 года по апрель 2024 года. Схема PostgreSQL для этих данных показана ниже:
DDL-команды для создания таблиц в PostgreSQL доступны здесь.
Эта схема, хотя и не обязательно является оптимальной, использует ряд популярных возможностей PostgreSQL, включая первичные ключи, внешние ключи, партиционирование и индексы.
Мы перенесем каждую из этих концепций в их эквиваленты в ClickHouse.
Для пользователей, которые хотят загрузить этот набор данных в экземпляр PostgreSQL, чтобы протестировать шаги migration, мы предоставили данные в формате pg_dump для скачивания вместе с DDL, а ниже приведены последующие команды загрузки данных:
Хотя в нашем примере для демонстрации разницы в производительности между Postgres и ClickHouse используются результаты на полном наборе данных, все описанные ниже шаги работают точно так же и для меньшего подмножества. Если вы хотите загрузить в Postgres полный набор данных, см. здесь. Из-за ограничений внешних ключей, задаваемых приведённой выше схемой, полный набор данных для PostgreSQL включает только строки, удовлетворяющие требованиям ссылочной целостности. При необходимости версию в формате Parquet без таких ограничений можно легко загрузить напрямую в ClickHouse.
Миграция данных
Репликация в реальном времени (CDC)
users создается в ClickHouse с помощью ClickPipes.
Ручная массовая загрузка с периодическими обновлениями
- Табличные функции - использовать табличную функцию Postgres в ClickHouse, чтобы
SELECT-ом получить данные из Postgres и выполнить ихINSERTв таблицу ClickHouse. Подходит для массовой загрузки наборов данных объёмом до нескольких сотен ГБ. - Экспорт - экспортировать данные в промежуточные форматы, такие как CSV или SQL-скрипт. Затем эти файлы можно загрузить в ClickHouse либо через клиент с помощью конструкции
INSERT FROM INFILE, либо с использованием объектного хранилища и связанных с ним функций, то есть s3, gcs.
DESCRIBE с табличной функцией Postgres. Следующая команда описывает таблицу posts в PostgreSQL; измените её в соответствии с вашим окружением:
Query
Query
INSERT INTO SELECT, считывая данные из PostgresSQL и вставляя их в ClickHouse:
Query
SELECT можно применить условие WHERE. Этот подход также можно использовать для поддержки обновлений, если гарантируется, что они изменяют один и тот же столбец. Однако для поддержки удалений потребуется полная перезагрузка, что по мере роста таблицы может быть сложно реализовать.
Мы покажем начальную и инкрементальную загрузку с использованием CreationDate (предполагается, что это значение обновляется при обновлении строк)..
ClickHouse будет проталкивать на сервер PostgreSQL простые условия из секцииWHERE, такие как=,!=,>,>=,<,<=и IN. Поэтому инкрементальные загрузки можно сделать эффективнее, если убедиться, что на столбцах, используемых для определения набора изменений, есть индекс.
Один из возможных способов обнаруживать операции UPDATE при использовании репликации запросов — использовать системный столбецНажмите здесь, чтобы перейти к части 2XMIN(идентификаторы транзакций) как водяную метку: изменение этого столбца указывает на изменение данных, и соответствующие изменения можно применять к целевой таблице. Пользователям, использующим этот подход, следует учитывать, что значенияXMINмогут циклически переполняться, а сравнения требуют полного сканирования таблицы, что усложняет отслеживание изменений.