为 RDS for PostgreSQL 数据库实例设置逻辑复制
以下过程说明如何在两个 RDS for PostgreSQL 数据库实例之间启动逻辑复制。这些步骤假设来源(发布者)和目标(订阅者)都如设置 pglogical 扩展中所述设置了 pglogical
扩展。
创建发布者节点并定义要复制的表
这些步骤假设您的 RDS for PostgreSQL 数据库实例有一个数据库,其中包含一个或多个您要复制到另一个节点的表。您需要在订阅者上根据发布者重新创建表结构,因此,如果需要,首先获取表结构。为此,您可以使用 psq1
元命令 \d
,然后在订阅者实例上创建相同的表。以下过程在发布者(来源)上创建示例表以用于演示目的。tablename
-
使用
psql
连接到具有要用作订阅者来源的表的实例。psql --host=
source-instance
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres
--password --dbname=labdb
如果没有现有表要复制,可以按如下方式创建示例表。
-
使用以下 SQL 语句创建一个示例表。
CREATE TABLE docs_lab_table (a int PRIMARY KEY);
-
使用以下 SQL 语句用生成的数据填充表。
INSERT INTO docs_lab_table VALUES (generate_series(1,5000));
INSERT 0 5000
-
使用以下 SQL 语句验证表中是否存在数据。
SELECT count(*) FROM docs_lab_table;
-
-
将这一 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)
-
将要复制的表添加到默认的复制集。有关复制集的更多信息,请参阅 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 扩展。
-
使用
psql
连接到要从发布者接收更新的实例。psql --host=
target-instance
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres
--password --dbname=labdb
-
在订阅者 RDS for PostgreSQL 数据库实例上,创建与发布者上存在的相同表。在本例中,该表为
docs_lab_table
。您可以按如下所示创建表。CREATE TABLE docs_lab_table (a int PRIMARY KEY);
-
验证此表为空。
SELECT count(*) FROM docs_lab_table;
count ------- 0 (1 row)
-
将这一 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)
-
创建订阅。
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)
此后,对发布者上的表所做的更改将复制到订阅者上的表中。