Пользователям ClickHouse Cloud рекомендуется использовать ClickPipes для репликации PostgreSQL в ClickHouse. Этот способ нативно поддерживает высокопроизводительную CDC (фиксация изменений данных) для PostgreSQL.
MaterializedPostgreSQL создает снимок базы данных PostgreSQL и загружает необходимые таблицы. Эти таблицы могут представлять собой любое подмножество таблиц из любого подмножества схем указанной базы данных. Вместе со снимком движок базы данных получает LSN, а после выполнения первоначального дампа таблиц начинает получать обновления из WAL. После создания базы данных новые таблицы, добавленные в базу данных PostgreSQL, автоматически в репликацию не включаются. Их нужно добавлять вручную запросом ATTACH TABLE db.table.
Репликация реализована с использованием протокола PostgreSQL Logical Replication Protocol, который не позволяет реплицировать DDL, но позволяет определить, произошли ли изменения, нарушающие репликацию (изменение типов столбцов, добавление или удаление столбцов). Такие изменения обнаруживаются, и соответствующие таблицы перестают получать обновления. В этом случае следует использовать запросы ATTACH/DETACH PERMANENTLY, чтобы полностью перезагрузить таблицу. Если DDL не нарушает репликацию (например, при переименовании столбца), таблица все равно будет получать обновления (вставка выполняется по позиции).
Этот движок базы данных является экспериментальным. Чтобы использовать его, установите
allow_experimental_database_materialized_postgresql в 1 в файлах конфигурации или с помощью команды SET:Создание базы данных
host:port— конечная точка сервера PostgreSQL.database— имя базы данных PostgreSQL.user— имя пользователя PostgreSQL.password— пароль пользователя.
Пример использования
Динамическое добавление новых таблиц в репликацию
MaterializedPostgreSQL новые таблицы в соответствующей базе данных PostgreSQL не обнаруживаются автоматически. Такие таблицы можно добавить вручную:
Динамическое удаление таблиц из репликации
Схема PostgreSQL
- Одна схема для одного движка базы данных
MaterializedPostgreSQL. Требуется использовать настройкуmaterialized_postgresql_schema. Доступ к таблицам осуществляется только по имени таблицы:
- Любое количество схем с указанным набором таблиц для одного движка базы данных
MaterializedPostgreSQL. Требуется использовать настройкуmaterialized_postgresql_tables_list. Каждая таблица записывается вместе со своей схемой. Доступ к таблицам осуществляется одновременно по имени схемы и имени таблицы:
materialized_postgresql_tables_list должны быть указаны вместе с именем своей схемы.
Требуется materialized_postgresql_tables_list_with_schema = 1.
Предупреждение: в этом случае точки в именах таблиц не допускаются.
- Любое количество схем с полным набором таблиц для одного движка базы данных
MaterializedPostgreSQL. Для этого требуется использовать настройкуmaterialized_postgresql_schema_list.
Требования
-
Параметр wal_level в файле конфигурации PostgreSQL должен иметь значение
logical, а параметрmax_replication_slots— значение не менее2. - Для каждой реплицируемой таблицы должен быть задан один из следующих идентификаторов реплики:
- первичный ключ (по умолчанию)
- индекс
Репликация значений TOAST не поддерживается. Будет использовано значение по умолчанию для данного типа данных.
Настройки
materialized_postgresql_tables_list
materialized_postgresql_schema
materialized_postgresql_schema_list
materialized_postgresql_max_block_size
- Положительное целое число.
65536.
materialized_postgresql_replication_slot
materialized_postgresql_snapshot.
materialized_postgresql_snapshot
materialized_postgresql_replication_slot.
materialized_postgresql_tables_list нельзя. Чтобы обновить список таблиц в этом параметре, используйте запрос ATTACH TABLE.
materialized_postgresql_use_unique_replication_consumer_identifier
0.
Если установить 1, можно настроить несколько таблиц MaterializedPostgreSQL, указывающих на одну и ту же таблицу PostgreSQL.
materialized_postgresql_use_extended_date_and_time_types
date и timestamp/timestamptz с типами ClickHouse Date32 и DateTime64, которые поддерживают более широкий диапазон значений, чем типы PostgreSQL. Значение по умолчанию: 1.
Если задано значение 0, вместо них используются более узкие типы Date и DateTime (значения вне их диапазона или с точностью до долей секунды представить невозможно).
Этот параметр влияет только на типы столбцов, которые вывод типов выбирает при создании вложенных таблиц, поэтому его необходимо указывать при выполнении CREATE DATABASE. Позже его нельзя изменить с помощью ALTER DATABASE ... MODIFY SETTING (уже созданные вложенные таблицы сохраняют свои фиксированные типы столбцов, и такая попытка изменения отклоняется); чтобы изменить его, пересоздайте базу данных. Он не применяется к движку таблицы MaterializedPostgreSQL, где типы столбцов задаются явно.
Примечания
Переключение слота логической репликации при сбое
materialized_postgresql_replication_slot, а сам слот должен быть экспортирован с параметром EXPORT SNAPSHOT. Идентификатор снимка нужно передать через настройку materialized_postgresql_snapshot.
Обратите внимание, что использовать это следует только при реальной необходимости. Если явной необходимости нет или вы не до конца понимаете, зачем это нужно, лучше позволить движку таблицы самостоятельно создать слот репликации и управлять им.
Пример (от @bchrobot)
-
Настройте слот репликации в PostgreSQL.
-
Дождитесь, пока слот репликации будет готов, затем начните транзакцию и экспортируйте идентификатор снимка транзакции:
-
В ClickHouse создайте базу данных:
-
Завершите транзакцию PostgreSQL, как только убедитесь, что репликация в DB ClickHouse работает. Проверьте, что после переключения при сбое репликация продолжается:
Необходимые разрешения
- CREATE PUBLICATION — привилегия на выполнение запроса CREATE.
- CREATE_REPLICATION_SLOT — привилегия репликации.
- pg_drop_replication_slot — привилегия репликации или права суперпользователя.
-
DROP PUBLICATION — владелец публикации (
usernameв самом движке MaterializedPostgreSQL).
2 и 3 и обойтись без этих разрешений. Используйте настройки materialized_postgresql_replication_slot и materialized_postgresql_snapshot. Но с большой осторожностью.
Доступ к таблицам:
- pg_publication
- pg_replication_slots
- pg_publication_tables
Резервное копирование и восстановление
MaterializedPostgreSQL можно создать резервную копию. Данные каждой реплицируемой таблицы хранятся во вложенной таблице ReplacingMergeTree, поэтому команда BACKUP DATABASE включает эти данные, делегируя это вложенной таблице.
MaterializedPostgreSQL на месте не поддерживается. Восстановленный объект MaterializedPostgreSQL сразу начинает репликацию из действующего источника PostgreSQL, поэтому восстановление поверх него снимка резервной копии привело бы к смешению данных из снимка с текущим состоянием удалённого источника. Поэтому в этом случае команда RESTORE завершается отказом. Вместо этого восстанавливайте захваченные данные в обычные таблицы ReplacingMergeTree:
-
В резервной копии базы данных сохранённое определение каждой таблицы уже является синтетической вложенной таблицей
ReplacingMergeTree(а не движкомMaterializedPostgreSQL), поэтому каждую таблицу можно восстановить напрямую в новую, ещё не существующую таблицу: -
Для резервной копии автономной таблицы
MaterializedPostgreSQLсохранённое определение представляет собой сам движокMaterializedPostgreSQL. Заранее создайте таблицуReplacingMergeTreeс той же структурой, что и вложенная таблица (включая столбцы_signи_version), и восстановите данные в неё: