MaterializedPostgreSQL
Пользователям ClickHouse Cloud рекомендуется использовать ClickPipes для репликации PostgreSQL в ClickHouse. Этот сервис нативно поддерживает высокопроизводительный CDC (фиксацию изменений данных) для PostgreSQL.
Создаёт базу данных ClickHouse с таблицами из базы данных PostgreSQL. Сначала база данных с движком MaterializedPostgreSQL создаёт снимок базы данных PostgreSQL и загружает необходимые таблицы. Необходимые таблицы могут включать любое подмножество таблиц из любого подмножества схем указанной базы данных. Вместе со снимком движок базы данных получает LSN и, как только начальная выгрузка таблиц выполнена, начинает получать обновления из WAL. После создания базы данных вновь добавляемые таблицы в базе данных PostgreSQL не добавляются в репликацию автоматически. Их нужно добавлять вручную с помощью запроса ATTACH TABLE db.table.
Репликация реализована с использованием протокола логической репликации PostgreSQL (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. Такие таблицы можно добавить вручную:
До версии 22.1 добавление таблицы в репликацию оставляло неудалённый временный слот репликации (с именем {db_name}_ch_replication_slot_tmp). Если вы подключаете таблицы в ClickHouse версии ниже 22.1, обязательно удалите этот слот вручную (SELECT pg_drop_replication_slot('{db_name}_ch_replication_slot_tmp')). В противном случае будет расти использование дискового пространства. Эта проблема исправлена в версии 22.1.
Динамическое исключение таблиц из репликации
Можно исключить отдельные таблицы из репликации:
Схема PostgreSQL
Схемы PostgreSQL (schema) можно настраивать тремя способами (начиная с версии 21.12).
- Одна схема для одного движка базы данных
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 должен иметь значение
logical, а параметрmax_replication_slots— значение не менее2в конфигурационном файле PostgreSQL. -
Каждая реплицируемая таблица должна иметь один из следующих вариантов replica identity:
- первичный ключ (по умолчанию)
- индекс
Сначала всегда проверяется первичный ключ. Если он отсутствует, проверяется индекс, заданный как идентификатор реплики. Если индекс используется как идентификатор реплики, в таблице должен быть только один такой индекс. Вы можете проверить, какой тип идентификатора реплики используется для конкретной таблицы, с помощью следующей команды:
Репликация значений TOAST не поддерживается. Будет использоваться значение по умолчанию для данного типа данных.
Настройки
materialized_postgresql_tables_list
Задает список таблиц базы данных PostgreSQL, разделенный запятыми, которые будут реплицироваться с помощью движка базы данных MaterializedPostgreSQL.
Для каждой таблицы можно указать подмножество реплицируемых столбцов в круглых скобках. Если подмножество столбцов не указано, реплицируются все столбцы этой таблицы.
Значение по умолчанию: пустой список — означает, что будет реплицирована вся база данных PostgreSQL.
materialized_postgresql_schema
Значение по умолчанию: пустая строка (используется схема по умолчанию).
materialized_postgresql_schema_list
Значение по умолчанию: пустой список (используется схема по умолчанию).
materialized_postgresql_max_block_size
Задаёт количество строк, собираемых в памяти перед сбросом данных в таблицу базы данных PostgreSQL.
Возможные значения:
- Положительное целое число.
Значение по умолчанию: 65536.
materialized_postgresql_replication_slot
Слот репликации, созданный пользователем. Должен использоваться вместе с materialized_postgresql_snapshot.
materialized_postgresql_snapshot
Текстовая строка, идентифицирующая снимок, из которого будет выполнен начальный дамп таблиц PostgreSQL. Должен использоваться вместе с materialized_postgresql_replication_slot.
При необходимости настройки можно изменить с помощью DDL‑запроса. Однако настройку materialized_postgresql_tables_list изменить нельзя. Чтобы обновить список таблиц в этой настройке, используйте запрос ATTACH TABLE.
materialized_postgresql_use_unique_replication_consumer_identifier
Использует уникальный идентификатор потребителя при репликации. Значение по умолчанию — 0.
Если установлено в 1, позволяет настроить несколько таблиц MaterializedPostgreSQL, указывающих на одну и ту же таблицу PostgreSQL.
Заметки
Переключение (failover) логического слота репликации
Логические слоты репликации, которые существуют на первичном сервере, недоступны на резервных репликах.
Поэтому при переключении ролей новый первичный (бывший физический standby) не будет знать о слотах, которые существовали на старом первичном сервере. Это приведёт к нарушению репликации из PostgreSQL.
Решением является самостоятельное управление слотами репликации и создание постоянного слота репликации (некоторая информация доступна здесь). Необходимо передать имя слота через настройку materialized_postgresql_replication_slot, и слот должен быть экспортирован с опцией EXPORT SNAPSHOT. Идентификатор снимка необходимо передать через настройку materialized_postgresql_snapshot.
Обратите внимание, что это следует использовать только в том случае, если это действительно нужно. Если в этом нет реальной необходимости или нет полного понимания причин, лучше позволить движку таблицы создавать и управлять собственным слотом репликации.
Пример (от @bchrobot)
-
Настройте слот репликации в PostgreSQL.
-
Дождитесь готовности слота репликации, затем начните транзакцию и экспортируйте идентификатор снимка транзакции (snapshot):
-
В ClickHouse создайте базу данных:
-
Завершите транзакцию в PostgreSQL после того, как подтвердите репликацию в базу данных ClickHouse. Убедитесь, что репликация продолжается после переключения:
Необходимые привилегии
-
CREATE PUBLICATION — привилегия на выполнение оператора создания публикации.
-
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