MaterializedPostgreSQL
Пользователям ClickHouse Cloud рекомендуется использовать ClickPipes для репликации PostgreSQL в ClickHouse. Это нативно поддерживает высокопроизводительное изменение данных (CDC) для PostgreSQL.
Создает базу данных ClickHouse с таблицами из базы данных PostgreSQL. Сначала база данных с движком MaterializedPostgreSQL
создает снимок базы данных PostgreSQL и загружает требуемые таблицы. Требуемые таблицы могут включать любой подмножество таблиц из любого подмножества схем из указанной базы данных. Вместе с базой данных снимок получает LSN, и после завершения начального дампа таблиц начинает извлекать обновления из WAL. После создания базы данных новые добавленные таблицы в базу данных PostgreSQL автоматически не добавляются в репликацию. Их необходимо добавлять вручную с помощью запроса ATTACH TABLE db.table
.
Репликация реализована с использованием протокола логической репликации PostgreSQL, который не позволяет реплицировать 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 может быть настроена 3 способами (начиная с версии 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
.
Заметки
Переключение слота логической репликации
Слоты логической репликации, которые существуют на первичном, недоступны на резервных репликах.
Поэтому если произойдет переключение, новый первичный (старый физический резервный) не будет знать о любых слотах, которые существовали со старым первичным. Это приведет к нарушению репликации из PostgreSQL.
Решение этой проблемы заключается в том, чтобы управлять слотами репликации самостоятельно и определить постоянный слот репликации (некоторую информацию можно найти здесь). Вам нужно будет передать имя слота через настройку materialized_postgresql_replication_slot
, и он должен быть экспортирован с опцией EXPORT SNAPSHOT
. Идентификатор снимка необходимо передать через настройку materialized_postgresql_snapshot
.
Обратите внимание, что вы должны использовать это только в том случае, если это действительно необходимо. Если в этом нет реальной необходимости или полного понимания причин, лучше позволить движку таблицы создавать и управлять своим собственным слотом репликации.
Пример (от @bchrobot)
-
Настройте слот репликации в PostgreSQL.
-
Дождитесь готовности слота репликации, затем начните транзакцию и экспортируйте идентификатор снимка транзакции:
-
В 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