Реплицировать данные в Lakebase

В этом руководстве показано, как реплицировать данные из внешней базы данных Postgres в Lakebase с помощью логической репликации. Lakebase выступает в роли подписчика: он подключается к вашей исходной базе данных, копирует существующие данные и применяет последующие изменения до тех пор, пока вы не переключитесь. Используйте это для миграции базы данных от другого провайдера Postgres, например Amazon Aurora PostgreSQL или Amazon RDS для PostgreSQL, либо с самоуправляемого сервера Postgres в Lakebase.

Необходимые условия

  • Исходная база данных Postgres с публичной конечной точкой, к которой может получить доступ Lakebase.

  • Доступ суперпользователя к исходной базе данных или учетная запись администратора в управляемом сервисе Postgres. Установка wal_level, создание роли с атрибутом REPLICATION и создание публикации требуют такого уровня доступа.

  • Проект Lakebase для целевой базы данных.

  • Роль Lakebase Postgres для создания подписки: член роли databricks_superuser, например, роль владельца проекта, или роль, которой предоставлены как предопределённая роль pg_create_subscription, так и привилегия CREATE в целевой базе данных. pg_create_subscription Одной роли недостаточно. Без CREATE в базе данных CREATE SUBSCRIPTION завершается с permission denied for database. Чтобы предоставить databricks_superuser другой роли, см. Создать роли Postgres или Обновить роль.

    GRANT pg_create_subscription TO <role_name>;
    GRANT CREATE ON DATABASE <database_name> TO <role_name>;
    

Логическая репликация поддерживается в Lakebase. Нет отдельного шага на уровне проекта, чтобы включить это. Для подписчика Lakebase не требует изменений wal_level. Только исходному издателю нужен wal_level = logical.

Подготовьте исходную базу данных

В вашей исходной базе данных Postgres установите журнал предзаписи (WAL) в logical и убедитесь, что достаточно ресурсов для репликации. Следующий пример относится к Postgres под собственным управлением. Ваш управляемый провайдер Postgres может использовать разные настройки:

ALTER SYSTEM SET wal_level = logical;
ALTER SYSTEM SET max_wal_senders = 10;
ALTER SYSTEM SET max_replication_slots = 10;

Перезагрузите исходную базу данных, чтобы изменение wal_level вступило в силу. В управляемом сервисе используйте группу параметров или флаги провайдера, чтобы установить для wal_level значение logical. Например, на Amazon Aurora PostgreSQL установите rds.logical_replication в значение 1 в группе параметров кластера базы данных и перезагрузите кластер. В Amazon RDS для PostgreSQL установите тот же параметр в группе параметров базы данных и перезагрузите экземпляр.

Создайте роль для репликации и предоставьте ей доступ на чтение к таблицам, которые вы реплицируете:

CREATE ROLE replication_user WITH REPLICATION LOGIN PASSWORD '<password>';
GRANT USAGE ON SCHEMA public TO replication_user;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO replication_user;

Этот CREATE ROLE оператор работает так, как написано, на самоуправляемом сервере Postgres. Некоторые управляемые провайдеры Postgres не разрешают атрибут REPLICATION напрямую, а предоставляют доступ к репликации через роль, специфичную для провайдера. Если ваш источник работает на управляемом сервисе, следуйте документации провайдера, чтобы дать роли доступ к репликации, а затем используйте эту роль вместо replication_user в следующих шагах. Например, на Amazon Aurora PostgreSQL и Amazon RDS для PostgreSQL создайте роль без использования WITH REPLICATION, а затем запустите GRANT rds_replication TO replication_user.

Создайте публикацию для таблиц, которые хотите реплицировать. Каждая таблица должна содержать PRIMARY KEY или настроенную replica identity. См. Replica Identity в документации Postgres.

CREATE PUBLICATION my_publication FOR TABLE orders, customers;

Позволить Lakebase добраться до источника

Как подписчик, Lakebase инициирует исходящее подключение к вашей исходной базе данных. Это исходящее соединение регулируется сетевой политикой вашего аккаунта, которая контролирует интернет-адреса, к которым могут обращаться бессерверные рабочие нагрузки. Он не управляется проектным сеттингом Lakebase или ролью внутри базы данных.

Необходимость вносить изменения зависит от того, требует ли ваш аккаунт соблюдения сетевой политики:

  • Нет активной сетевой политики: Lakebase может связаться с любым publisher, у которого есть доступная публичная конечная точка. Изменения не требуются.
  • Активная сетевая политика: добавить хост исходной базы данных в разрешённые интернет-адреса в сетевой политике аккаунта. См. статью "Управление политиками сети". Если хост не разрешен, подписка отклоняется при создании. См. раздел Устранение неполадок.

Приватный канал не поддерживается для подключения подписчика. Исходная база данных должна быть доступна через публичную конечную точку.

Создайте целевые таблицы

Логическая репликация копирует данные, а не схему. Создайте таблицы в целевой базе данных Lakebase с теми же именами и столбцами, что и в исходной базе данных, прежде чем начать репликацию. Вы можете создать их вручную или выгрузить схему из исходника и загрузить её в Lakebase. См. «Экспортировать только схему».

Создайте пустые целевые таблицы. Первоначальное копирование таблицы не выполняется при дубликативных ключах или нарушениях ограничений, если целевая таблица уже содержит строки.

Создайте подписку

Подключитесь к целевой базе данных Lakebase под ролью, которая может создавать подписки (см. Предварительные условия), затем создайте подписку, которая подключается к исходному издателю:

CREATE SUBSCRIPTION my_subscription
CONNECTION 'host=<source-host> port=5432 dbname=<source-db> user=replication_user password=<password> sslmode=verify-full sslrootcert=system'
PUBLICATION my_publication;

Создание подписки запускает слот для репликации у исходного издателя, копирует существующие строки и затем транслирует текущие изменения.

Warning

Слот репликации позволяет исходной базе сохранять журнал предзаписи (WAL) до тех пор, пока Lakebase не подтвердит получение изменений. Если подписка перестаёт потреблять изменения, например, если она отключена, отсоединена или работает со сбоями, WAL накапливается на источнике без ограничений. На производственном источнике это может заполнить хранилище источника и привести к простою.

Во время репликации следите за тем, сколько WAL сохраняет слот на источнике:

SELECT slot_name, active,
       pg_catalog.pg_size_pretty(pg_catalog.pg_wal_lsn_diff(pg_catalog.pg_current_wal_lsn(), restart_lsn)) AS retained_wal
FROM pg_catalog.pg_replication_slots;

Чтобы снизить потенциальные последствия для самостоятельно управляемого источника, установите max_slot_wal_keep_size так, чтобы ограничить, сколько WAL слот может удерживать. Если слот выходит за предел лимита, Postgres аннулирует его, и подписка должна быть создана заново. Откажитесь от подписки сразу после завершения миграции. См. Слоты репликации и хранилище.

Note

Когда Lakebase оформляет подписку, он подключается к вашей исходной базе данных и отправляет ей учетные данные роли репликации. sslmode=verify-full с помощью sslrootcert=system шифрует соединение и проверяет личность источника, что защищает передаваемые учетные данные от атаки «человек посередине». Это работает, когда ваш источник использует общедоверенный удостоверяющий центр. Более sslmode=require слабый шифрует, но не проверяет источник. Проверка источника, использующего частный центр сертификации, не поддерживается.

Проверьте репликацию

В целевой базе данных Lakebase подтвердите, что существующие строки появились:

SELECT COUNT(*) FROM orders;

Вставьте или обновите строку в источнике, затем снова запросите целевой объект. Изменение появляется на Lakebase через несколько секунд.

Отслеживайте и переключайтесь

Отслеживайте первоначальное копирование и постоянное отставание:

SELECT subname, received_lsn, latest_end_lsn, last_msg_receipt_time
FROM pg_catalog.pg_stat_subscription;

Чтобы убедиться, что первоначальная копия завершена, выполните запрос статуса синхронизации по таблице в режиме Monitor replication на абоненте и дождитесь, пока для каждой таблицы не отобразится Ready (fully live).

Когда целевая система догонит источник, прекратите запись на источнике, убедитесь, что целевая система полностью актуальна, и переключите приложение на данные подключения Lakebase.

Логическая репликация не копирует значения последовательностей или счетчики identity. Перед тем как продолжить операции записи на Lakebase, сбросьте каждую целевую последовательность для соответствия реплицированным данным, иначе новые вставки в SERIAL или в столбцы идентичности могут сгенерировать дублирующиеся первичные ключи:

SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence('orders', 'id'), (SELECT MAX(id) FROM orders));

После того как ваше приложение заработает с Lakebase, откажитесь от подписки, чтобы прекратить репликацию из источника. Когда источник доступен, прекращение подписки также убирает на нём слот для репликации. См. Удаление подписки или публикации.

Для мониторинга и очистки смотрите раздел «Управление и мониторинг логической репликации».

Дальнейшие действия