将数据复制到 Lakebase

本指南展示了如何利用逻辑复制将外部Postgres数据库的数据复制到Lakebase。 Lakebase 充当订阅者:它连接到你的源数据库,复制现有数据,并持续应用变更,直到你完成切换。 利用它将数据库从其他Postgres提供商迁移,比如Amazon Aurora PostgreSQL或Amazon RDS for 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 数据库中,将预写日志设置为 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。 例如,在亚马逊 Aurora PostgreSQL 中,在数据库集群参数组中将 rds.logical_replication 设置为 1,并重启集群。 在 Amazon RDS for 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 。 例如,在亚马逊 Aurora PostgreSQL 和适用于 PostgreSQL 的亚马逊 RDS 中,创建不带 GRANT rds_replication TO replication_user 的角色,然后运行 WITH REPLICATION。

为想要复制的表创建发布。 每个表必须具有 PRIMARY KEY 或设置了副本标识。 请参见Postgres文档中的 复制身份 。

CREATE PUBLICATION my_publication FOR TABLE orders, customers;

允许 Lakebase 访问源

作为订阅方,Lakebase 向你的源数据库发起出站连接。 这种出站连接受你账户的网络策略控制,该策略控制无服务器工作负载能到达的互联网目的地。 它不受 Lakebase 项目设置或数据库内角色控制。

是否需要更改取决于你的账户是否强制实施网络策略:

  • 无活动网络策略:Lakebase 可以访问任何具有可访问公共终结点的发布端。 不需要进行任何更改。
  • 主动网络策略:在账户网络策略中将源数据库的主机添加到允许的互联网目的地。 请参阅 “管理网络策略”。 如果主机不被允许,创建订阅时,该订阅会被拒绝。 请参阅 疑难解答。

订阅端连接不支持专用链接。 源数据库必须通过其公共端点实现访问。

创建目标表

逻辑复制复制的是数据,而不是架构。 在开始复制之前,先在目标 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会使其失效,订阅必须重新创建。 迁移完成后尽快取消订阅。 参见 复制槽和存储。

注释

Lakebase 作为订阅端时,它会向外连接到您的源数据库,并向其发送复制角色的凭证。 sslmode=verify-full WITH 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;

为确认初始复制已完成,请在订阅者上的监控复制中运行每表同步状态查询,并等待每个表都显示为Ready (fully live)。

当目标已追平后,停止在源上写入,确认目标已完全处于最新状态,然后将您的应用程序切换到 Lakebase 连接详细信息。

逻辑复制不复制序列值或标识计数器。 在 Lakebase 上恢复写入前,先重置每个目标序列以匹配复制的数据,否则向 SERIAL 或标识列中插入新数据时,可能会生成重复的主键:

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

当你的应用运行在Lakebase上后,删除该订阅以停止从源头复制。 当源节点可达时,取消订阅也会移除其复制槽。 参见删除订阅或发布。

关于监控和清理,请参见 管理与监控逻辑复制。

后续步骤