Пользователям 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_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