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