为 RDS for PostgreSQL 数据库实例设置逻辑复制 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

RDS for PostgreSQL 数据库实例设置逻辑复制

以下过程说明如何在两个 RDS for PostgreSQL 数据库实例之间启动逻辑复制。这些步骤假设来源(发布者)和目标(订阅者)都如设置 pglogical 扩展中所述设置了 pglogical 扩展。

创建发布者节点并定义要复制的表

这些步骤假设您的 RDS for PostgreSQL 数据库实例有一个数据库,其中包含一个或多个您要复制到另一个节点的表。您需要在订阅者上根据发布者重新创建表结构,因此,如果需要,首先获取表结构。为此,您可以使用 psq1 元命令 \d tablename,然后在订阅者实例上创建相同的表。以下过程在发布者(来源)上创建示例表以用于演示目的。

  1. 使用 psql 连接到具有要用作订阅者来源的表的实例。

    psql --host=source-instance.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb

    如果没有现有表要复制,可以按如下方式创建示例表。

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

      CREATE TABLE docs_lab_table (a int PRIMARY KEY);
    2. 使用以下 SQL 语句用生成的数据填充表。

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

      SELECT count(*) FROM docs_lab_table;
  2. 将这一 RDS for PostgreSQL 数据库实例标识为发布者节点,如下所示。

    SELECT pglogical.create_node( node_name := 'docs_lab_provider', dsn := 'host=source-instance.aws-region.rds.amazonaws.com port=5432 dbname=labdb'); create_node ------------- 3410995529 (1 row)
  3. 将要复制的表添加到默认的复制集。有关复制集的更多信息,请参阅 pglogical 文档中的复制集

    SELECT pglogical.replication_set_add_table('default', 'docs_lab_table', 'true', NULL, NULL); replication_set_add_table --------------------------- t (1 row)

发布者节点设置已完成。现在,您可以设置订阅者节点以接收来自发布者的更新。

设置订阅者节点并创建订阅以接收更新

这些步骤假设已使用 pglogical 扩展设置了 RDS for PostgreSQL 数据库实例。有关更多信息,请参阅 设置 pglogical 扩展

  1. 使用 psql 连接到要从发布者接收更新的实例。

    psql --host=target-instance.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
  2. 在订阅者 RDS for PostgreSQL 数据库实例上,创建与发布者上存在的相同表。在本例中,该表为 docs_lab_table。您可以按如下所示创建表。

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

    SELECT count(*) FROM docs_lab_table; count ------- 0 (1 row)
  4. 将这一 RDS for PostgreSQL 数据库实例标识为订阅者节点,如下所示。

    SELECT pglogical.create_node( node_name := 'docs_lab_target', dsn := 'host=target-instance.aws-region.rds.amazonaws.com port=5432 sslmode=require dbname=labdb user=postgres password=********'); create_node ------------- 2182738256 (1 row)
  5. 创建订阅。

    SELECT pglogical.create_subscription( subscription_name := 'docs_lab_subscription', provider_dsn := 'host=source-instance.aws-region.rds.amazonaws.com port=5432 sslmode=require dbname=labdb user=postgres password=*******', replication_sets := ARRAY['default'], synchronize_data := true, forward_origins := '{}' ); create_subscription --------------------- 1038357190 (1 row)

    完成此步骤后,将在订阅者上的表中创建发布者上表中的数据。您可以使用以下 SQL 查询来验证是否已发生这种情况。

    SELECT count(*) FROM docs_lab_table; count ------- 5000 (1 row)

此后,对发布者上的表所做的更改将复制到订阅者上的表中。