文档中心>云数据库 PostgreSQL>实践教程>使用 pglogical 进行逻辑复制

使用 pglogical 进行逻辑复制

最近更新时间:2024-09-23 14:46:41

我的收藏
pglogical 是 PostgreSQL 的插件,使用发布/订阅模型复制数据,使选择性复制更加高效。支持多场景复制,具体包括:
数据库大版本升级。
完整的数据库复制。
利用复制集,选择性地筛选表、行、列。
可从多个上游服务器,用于数据的聚集和合并。

前提条件

说明:
如您需要使用 pglogical 插件,请您 提交工单 联系我们添加 shared_preload_libraries 参数。修改 shared_preload_libraries 参数会重启实例,请确保业务有重连机制。
云数据库 PostgreSQL 支持同一地域下的同一实例或者不同实例间配置 pglogical 逻辑复制。
当前只有内核版本在 v15.6_r1.12 及以上的大版本为15的云数据库 PostgreSQL 实例支持 pglogical 插件。
请您确认 shared_preload_libraries 参数中包含 pglogical,如下图所示:
postgres=> show shared_preload_libraries;
shared_preload_libraries
-------------------------------------------------------------------------------------------------------------------------
-------------
pg_stat_statements,pg_stat_log,wal2json,decoderbufs,decoder_raw,pg_hint_plan,rds_server_handler,tencentdb_pwdcheck,pgaud
it,pglogical
(1 row)
参数 wal_level 的值为 logical,如下图所示。
postgres=> show wal_level;
wal_level
-----------
logical
(1 row)
如您需要修改 wal_level 参数,请您在 云数据库 PostgreSQL 的控制台,修改参数:


操作步骤

在发布端和订阅端实例确认可安装插件中是否有 pglogical:
postgres=> select * from pg_available_extensions where name='pglogical';
name | default_version | installed_version | comment
-----------+-----------------+-------------------+--------------------------------
pglogical | 2.4.4 | | PostgreSQL Logical Replication
(1 row)

安装插件

在发布端和订阅端实例都要安装 pglogical 插件:
postgres=> create extension pglogical;
CREATE EXTENSION
查询是否安装成功:
postgres=> select * from pg_extension where extname='pglogical';
oid | extname | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition
-------+-----------+----------+--------------+----------------+------------+-----------+--------------
16424 | pglogical | 16387 | 16423 | f | 2.4.4 | |
(1 row)

在发布端创建发布节点

新建 database,名称为 am,并切换至 am:
postgres=> create database am;
CREATE DATABASE
postgres=> \\c am
psql (14.11, server 15.6)
WARNING: psql major version 14, server major version 15.
Some psql features might not work.
You are now connected to database "am" as user "dbadmin".
am=>
创建表格 t,并插入数据:
am=> create table t(a int primary key, b int);
CREATE TABLE
am=> insert into t(a,b)values(1,1),(2,2),(3,3);
INSERT 0 3
am=> select * from t;
a | b
---+---
1 | 1
2 | 2
3 | 3
(3 rows)

创建发布节点, dns 中参数请参考 文档。这里的参数均填写发布端所在实例信息。
am=> SELECT pglogical.create_node(node_name := 'provider1',dsn := 'host=10.216.0.106 port=5432 dbname=am user=dbadmin password=Lxh202405! instanceid=postgres-gip4cpjw');
create_node
-------------
2976894835
(1 row)

配置复制集

如下示例是配置复制集中的一种,更多参数请参考 pglogical 官方文档
am=> SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
replication_set_add_all_tables
--------------------------------
t
(1 row)

在订阅端创建订阅节点

在订阅端对应的 database 中创建表格:
postgres=> \\c am
psql (14.11, server 15.6)
WARNING: psql major version 14, server major version 15.
Some psql features might not work.
You are now connected to database "am" as user "dbadmin".
am=> create table t(a int primary key, b int);
CREATE TABLE
在订阅端创建节点,dns 中参数请参考 文档。这里的参数均填写订阅端所在实例信息。
am=> SELECT pglogical.create_node(node_name := 'subscriber1',dsn := 'host=10.216.1.162 port=5432 dbname=am user=dbadmin password=Lxh202405! instanceid=postgres-70beu0ou');
create_node
-------------
330520249
(1 row)

在订阅端创建订阅

在订阅端创建节点,dns 中参数请参考 文档。这里的参数均填写发布端所在实例信息。
am=> SELECT pglogical.create_subscription(subscription_name := 'subscription1',provider_dsn := 'host=10.216.0.106 port=5432 dbname=am user=dbadmin password=Lxh202405! instanceid=postgres-gip4cpjw');
create_subscription
---------------------
1763399739
(1 row)
校验目标端数据:
am=> select * from t;
a | b
---+---
1 | 1
2 | 2
3 | 3
(3 rows)