使用 Aurora 的 PostgreSQL 逻辑复制 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Aurora 的 PostgreSQL 逻辑复制

通过将 PostgreSQL 的逻辑复制功能与 Aurora PostgreSQL 数据库集群结合使用,您可以复制和同步各个表而不是整个数据库实例。逻辑复制使用发布和订阅模型将更改从源复制到一个或多个接收者。它的工作原理是使用 PostgreSQL 预写日志(WAL)中的更改记录。源或发布者将指定表的 WAL 数据发送给一个或多个接收者(订阅者),从而复制更改并使订阅者的表与发布者的表保持同步。来自发布者的一组更改使用发布来识别。订阅者通过创建订阅(用于定义与发布者数据库及其发布内容的连接)来获取更改。复制插槽是该方案中用于跟踪订阅进度的机制。

对于 Aurora PostgreSQL 数据库集群,WAL 记录保存在 Aurora 存储中。在逻辑复制场景中充当发布者的 Aurora PostgreSQL 数据库集群从 Aurora 存储中读取 WAL 数据,对其进行解码,然后将其发送给订阅者,以便可以将更改应用于该实例上的表。发布者使用逻辑解码器对数据进行解码以供订阅者使用。原定设置情况下,Aurora PostgreSQL 数据库集群在发送数据时使用原生 PostgreSQL pgoutput 插件。提供了其他逻辑解码器。例如,Aurora PostgreSQL 还支持将 WAL 数据转换为 JSON 的 wal2json 插件。

从 Aurora PostgreSQL 版本 14.5、13.8、12.12 和 11.17 起,Aurora PostgreSQL 使用直写缓存增强了 PostgreSQL 逻辑复制过程以提高性能。WAL 事务日志本地缓存在缓冲区中,以减少磁盘输入/输出量,即在逻辑解码期间从 Aurora 存储中读取。每当您对 Aurora PostgreSQL 数据库集群使用逻辑复制时,原定设置情况下使用直写缓存。Aurora 提供了多种可用于管理缓存的函数。有关更多信息,请参阅管理 Aurora PostgreSQL 逻辑复制直写缓存

所有当前可用的 Aurora PostgreSQL 版本都支持逻辑复制。有关更多信息,请参阅《Aurora PostgreSQL 版本注释》中的 Amazon Aurora PostgreSQL 更新

注意

除了 PostgreSQL 10 中引入的原生 PostgreSQL 逻辑复制功能外,Aurora PostgreSQL 还支持 pglogical 扩展。有关更多信息,请参阅使用 pglogical 跨实例同步数据

有关 PostgreSQL 逻辑复制的更多信息,请参阅 PostgreSQL 文档中的逻辑复制逻辑解码概念

在以下主题中,您可以找到有关如何在 Aurora PostgreSQL 数据库集群之间设置逻辑复制的信息。

为 Aurora PostgreSQL 数据库集群设置逻辑复制

设置逻辑复制需要 rds_superuser 权限。Aurora PostgreSQL 数据库集群必须配置为使用自定义数据库集群参数组,以便您可以设置必要的参数,详见以下过程。有关更多信息,请参阅使用数据库集群参数组

为 Aurora PostgreSQL 数据库集群设置 PostgreSQL 逻辑复制
  1. 登录 Amazon Web Services Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  2. 在导航窗格中,选择您的 Aurora PostgreSQL 数据库集群。

  3. 打开 Configuration(配置)选项卡。在实例详细信息中,找到包含类型数据库集群参数组参数组链接。

  4. 选择此链接以打开与 Aurora PostgreSQL 数据库集群关联的自定义参数。

  5. Parameters(参数)搜索字段中,键入 rds 以查找 rds.logical_replication 参数。此参数的原定设置值为 0,这意味着它在原定设置情况下处于关闭状态。

  6. 选择 Edit parameters(编辑参数)以访问属性值,然后从选择器中选择 1 以开启该功能。根据您的预期使用情况,您可能还需要更改以下参数的设置。但是,在许多情况下,原定设置值就足够了。

    • max_replication_slots – 将此参数设置为至少等于您计划的逻辑复制发布和订阅总数的值。如果您正在使用 Amazon DMS,则此参数应至少等于集群中计划的更改数据捕获任务数加上逻辑复制发布和订阅数。

    • max_wal_sendersmax_logical_replication_workers – 将这些参数设置为至少与您打算激活的逻辑复制插槽数量或更改数据捕获的活动 Amazon DMS 任务数量相等的值。使逻辑复制插槽处于非活动状态可防止 vacuum 从表中删除过时的元组,因此,我们建议您监视复制插槽,并根据需要删除非活动的插槽。

    • max_worker_processes – 将此参数设置为至少等于 max_logical_replication_workersautovacuum_max_workersmax_parallel_workers 值的总和的值。在小型数据库实例类上,后台工件进程可能会影响应用程序工作负载,因此,如果将 max_worker_processes 设置为高于原定设置值,请监控数据库的性能。(原定设置值是 GREATEST(${DBInstanceVCPU*2},8} 的结果,这意味着,在原定设置情况下,这是 8 或数据库实例类的 CPU 等效量的 2 倍,以较大者为准)。

    注意

    您可以修改客户创建的数据库参数组中的参数值,但不能更改原定设置数据库参数组中的参数值。

  7. 选择保存更改

  8. 重启 Aurora PostgreSQL 数据库集群的写入器实例,以使更改生效。在 Amazon RDS 控制台中,选择集群的主数据库实例,然后从 Actions(操作)菜单中选择 Reboot(重启)。

  9. 当实例可用时,您可以验证逻辑复制是否已开启,如下所示。

    1. 使用 psql 连接到 Aurora PostgreSQL 数据库集群的写入器实例。

      psql --host=your-db-cluster-instance-1.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
    2. 使用以下命令验证逻辑复制是否已启用。

      labdb=> SHOW rds.logical_replication; rds.logical_replication ------------------------- on (1 row)
    3. 验证 wal_level 设置为 logical

      labdb=> SHOW wal_level; wal_level ----------- logical (1 row)

有关使用逻辑复制使数据库表与来自源 Aurora PostgreSQL 数据库集群的更改保持同步的示例,请参阅 示例:将逻辑复制与 Aurora PostgreSQL 数据库集群结合使用

关闭逻辑复制

完成复制任务后,应停止复制过程,删除复制插槽并关闭逻辑复制。在删除插槽之前,请确保不再需要它们。无法删除活动的复制插槽。

关闭逻辑复制
  1. 删除所有复制插槽。

    要删除所有复制插槽,请连接到发布者并运行以下 SQL 命令。

    SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots WHERE slot_name IN (SELECT slot_name FROM pg_replication_slots);

    运行此命令时,复制插槽不能处于活动状态。

  2. 修改与发布者关联的自定义数据库集群参数组(如为 Aurora PostgreSQL 数据库集群设置逻辑复制详述),但将 rds.logical_replication 参数设置为 0。

    有关自定义数据库参数组的更多信息,请参阅修改数据库集群参数组中的参数

  3. 重启发布者 Aurora PostgreSQL 数据库集群,以使对 rds.logical_replication 参数的更改生效。

管理 Aurora PostgreSQL 逻辑复制直写缓存

原定设置情况下,Aurora PostgreSQL 版本 14.5、13.8、12.12 和 11.17 及更高版本使用直写缓存来提高逻辑复制的性能。如果没有直写缓存,Aurora PostgreSQL 在实现原生 PostgreSQL 逻辑复制过程时使用 Aurora 存储层。为此,它将 WAL 数据写入存储,然后从存储中读回数据以对其进行解码并发送(复制)到其目标(订阅者)。这可能会导致在 Aurora PostgreSQL 数据库集群的逻辑复制过程中出现瓶颈。

直写缓存减少了使用 Aurora 存储层的需求。Aurora PostgreSQL 并不是总是从 Aurora 存储层进行写入和读取,而是使用缓冲区来缓存逻辑 WAL 流以便在复制过程中使用,而不是始终从磁盘中提取。这个缓冲区是逻辑复制使用的 PostgreSQL 原生缓存,在 Aurora PostgreSQL 数据库集群参数中标识为 rds.logical_wal_cache。原定设置情况下,此缓存使用 Aurora PostgreSQL 数据库集群的缓冲区缓存设置(shared_buffers)的 1/32,但不小于 64KB,也不超过一个 WAL 分段的大小,通常为 16MB。

当您在 Aurora PostgreSQL 数据库集群(对于支持直写缓存的版本)中使用逻辑复制时,您可以监控缓存命中率以查看其对您的使用案例的效果有多好。为此,请使用 psql 连接到 Aurora PostgreSQL 数据库集群的写入实例,然后使用 Aurora 函数 aurora_stat_logical_wal_cache,如以下示例所示。

SELECT * FROM aurora_stat_logical_wal_cache();

该函数返回如下输出。

name | active_pid | cache_hit | cache_miss | blks_read | hit_rate | last_reset_timestamp -----------+------------+-----------+------------+-----------+----------+-------------- test_slot1 | 79183 | 24 | 0 | 24 | 100.00% | 2022-08-05 17:39... test_slot2 | | 1 | 0 | 1 | 100.00% | 2022-08-05 17:34... (2 rows)

为了便于阅读,已缩短了 last_reset_timestamp 值。有关此函数的更多信息,请参阅 aurora_stat_logical_wal_cache

Aurora PostgreSQL 提供了以下两个用于监控直写缓存的函数。

如果您发现自动调整的 WAL 缓存大小不足以满足您的工作负载,则可以通过修改自定义数据库集群参数组中的参数来手动更改 rds.logical_wal_cache 的值。请注意,任何小于 32kB 的正值都被视为 32kB。有关 wal_buffers 的更多信息,请参阅 PostgreSQL 文档中的预写日志

管理 Aurora PostgreSQL 的逻辑插槽

流式传输活动在 pg_replication_origin_status 视图中捕获。要查看此视图的内容,您可以使用 pg_show_replication_origin_status() 函数,如下所示:

SELECT * FROM pg_show_replication_origin_status();

您可以使用以下 SQL 查询获取逻辑插槽的列表。

SELECT * FROM pg_replication_slots;

要删除逻辑插槽,请使用 pg_drop_replication_slot 以及插槽的名称,如以下命令所示。

SELECT pg_drop_replication_slot('test_slot');

示例:将逻辑复制与 Aurora PostgreSQL 数据库集群结合使用

以下过程说明了如何在两个 Aurora PostgreSQL 数据库集群之间启动逻辑复制。发布者和订阅者都必须配置为进行逻辑复制,如为 Aurora PostgreSQL 数据库集群设置逻辑复制中详述。

作为指定发布者的 Aurora PostgreSQL 数据库集群也必须允许访问复制插槽。为此,请基于 Amazon VPC 服务修改与 Aurora PostgreSQL 数据库集群的虚拟公有云(VPC)关联的安全组。通过将与订阅者的 VPC 关联的安全组添加到发布者的安全组来允许入站访问。有关安全组的更多信息,请参阅《Amazon VPC 用户指南》中的使用安全组控制到资源的流量

完成这些初步步骤后,您可以对发布者使用 PostgreSQL 命令 CREATE PUBLICATION,并对订阅者使用 PostgreSQL 命令 CREATE SUBSCRIPTION,详见以下过程。

在两个 Aurora PostgreSQL 数据库集群之间启动逻辑复制过程

这些步骤假设您的 Aurora PostgreSQL 数据库集群有一个写入器实例,其中包含一个用于创建示例表的数据库。

  1. 在发布者 Aurora PostgreSQL 数据库集群上

    1. 使用以下 SQL 语句创建一个表。

      CREATE TABLE LogicalReplicationTest (a int PRIMARY KEY);
    2. 使用以下 SQL 语句将数据插入到发布者数据库。

      INSERT INTO LogicalReplicationTest VALUES (generate_series(1,10000));
    3. 使用以下 SQL 语句验证表中是否存在数据。

      SELECT count(*) FROM LogicalReplicationTest;
    4. 使用 CREATE PUBLICATION 语句为此表创建发布,如下所示。

      CREATE PUBLICATION testpub FOR TABLE LogicalReplicationTest;
  2. 在订阅者 Aurora PostgreSQL 数据库集群上

    1. 在订阅者上创建与在发布者上创建的同一个 LogicalReplicationTest 表,如下所示。

      CREATE TABLE LogicalReplicationTest (a int PRIMARY KEY);
    2. 验证此表为空。

      SELECT count(*) FROM LogicalReplicationTest;
    3. 创建订阅以获取来自发布者的更改。您需要使用以下有关发布者 Aurora PostgreSQL 数据库集群的详细信息。

      • host – 发布者 Aurora PostgreSQL 数据库集群的写入器数据库实例。

      • port – 写入器数据库实例正在侦听的端口。PostgreSQL 的默认值为 5432。

      • dbname – 数据库的名称。

      CREATE SUBSCRIPTION testsub CONNECTION 'host=publisher-cluster-writer-endpoint port=5432 dbname=db-name user=user password=password' PUBLICATION testpub;
      注意

      作为安全最佳实践,请指定除此处所示提示以外的密码。

      创建订阅后,将在发布者上创建逻辑复制槽。

    4. 要验证此示例中的初始数据是否在订阅者上复制,请在订阅者数据库中使用以下 SQL 语句。

      SELECT count(*) FROM LogicalReplicationTest;

在发布者上进行的任何其他更改都会被复制到订阅者。

逻辑复制会影响性能。我们建议您在复制任务完成后关闭逻辑复制。

示例:使用 Aurora PostgreSQL 和 Amazon Database Migration Service 的逻辑复制

您可以使用 Amazon Database Migration Service (Amazon DMS) 复制数据库或数据库的一部分。使用 Amazon DMS 将数据从 Aurora PostgreSQL 数据库迁移到另一个开源或商用数据库。有关 Amazon DMS 的更多信息,请参阅 Amazon Database Migration Service 用户指南

以下示例演示如何从作为发布者的 Aurora PostgreSQL 数据库设置逻辑复制,然后使用 Amazon DMS 进行迁移。此示例使用在 示例:将逻辑复制与 Aurora PostgreSQL 数据库集群结合使用 中创建的相同发布者和订阅者。

要设置 Amazon DMS 的逻辑复制,需要有您在 Amazon RDS 中的发布者和订阅者的详细信息。特别是,您需要有发布者的写入器数据库实例和订阅者的数据库实例的详细信息。

请获取发布者的写入器数据库实例的以下信息:

  • Virtual Private Cloud (VPC) 标识符

  • 子网组

  • 可用区 (AZ)

  • VPC 安全组

  • 数据库实例 ID

请获取发布者的数据库实例的以下信息:

  • 数据库实例 ID

  • 源引擎

使用 Amazon DMS 进行 Aurora PostgreSQL 的逻辑复制
  1. 准备发布者数据库来与 Amazon DMS 一起工作。

    要实现此目的,PostgreSQL 10.x 及更高版本的数据库需要您对发布者数据库应用 Amazon DMS 封装函数。有关此步骤以及后续步骤的详细信息,请参阅《Amazon Database Migration Service 用户指南》将 PostgreSQL 版本 10.x 及更高版本用作 Amazon DMS 的源中的说明。

  2. 通过以下网址登录 Amazon Web Services Management Console并打开 Amazon DMS 控制台:https://console.amazonaws.cn/dms/v2。在右上方,选择发布者和订阅者所位于的相同 Amazon 区域。

  3. 创建 Amazon DMS 复制实例。

    选择与发布者的写入器数据库实例的值相同的值。包括以下设置:

    • 对于 VPC,选择与写入器数据库实例相同的 VPC。

    • 对于 Replication Subnet Group(复制子网组),选择与写入器数据库实例具有相同值的子网组。如有必要,请创建一个新的子网组。

    • 对于 Availability zone (可用区),选择与写入器数据库实例相同的区域。

    • 对于 VPC Security Group (VPC 安全组),选择与写入器数据库实例相同的组。

  4. 为源创建 Amazon DMS 终端节点。

    使用以下设置将发布者指定为源终端节点:

    • 对于 Endpoint type (终端节点类型),选择 Source endpoint (源终端节点)

    • 选择 Select RDS DB Instance (选择 RDS 数据库实例)

    • 对于 RDS Instance (RDS 实例),选择发布者的写入器数据库实例的数据库标识符。

    • 对于 Source engine (源引擎),选择 postgres

  5. 为目标创建 Amazon DMS 终端节点。

    使用以下设置将订阅者指定为目标终端节点:

    • 对于 Endpoint type (终端节点类型),选择 Target endpoint (目标终端节点)

    • 选择 Select RDS DB Instance (选择 RDS 数据库实例)

    • 对于 RDS Instance (RDS 实例),选择订阅者数据库实例的数据库标识符。

    • Source engine (源引擎) 选择值。例如,如果订阅者是 RDS PostgreSQL 数据库,则选择 postgres。如果订阅者是 Aurora PostgreSQL 数据库,请选择 aurora-postgresql

  6. 创建 Amazon DMS 数据库迁移任务。

    您使用数据库迁移任务指定要迁移的数据库表,使用目标架构映射数据并在目标数据库上创建新表。至少为 Task configuration (任务配置) 使用以下设置:

    • 对于 Replication instance (复制实例),选择您在之前的步骤中创建的复制实例。

    • 对于 Source database endpoint (源数据库终端节点),选择您在之前的步骤中创建的发布者源。

    • 对于 Target database endpoint (目标数据库终端节点),选择您在之前的步骤中创建的订阅者目标。

    其余任务详细信息取决于您的迁移项目。有关为 DMS 任务指定所有详细信息的更多信息,请参阅 Amazon Database Migration Service 用户指南中的使用 Amazon DMS 任务

在 Amazon DMS 创建任务后,它开始将数据从发布者迁移到订阅者。