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

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

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

注意

订阅用户节点的 node_name 不能以 rds 开头。

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

这些步骤假设您的 Aurora 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. 将这一 Aurora 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 扩展设置了 Aurora PostgreSQL 数据库集群。有关更多信息,请参阅 设置 pglogical 扩展

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

    psql --host=target-instance.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
  2. 在订阅者 Aurora 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. 将这一 Aurora 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)

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