逻辑复制(pglogical)

pglogical是一个完全作为PostgreSQL扩展实现的逻辑复制系统,为PostgreSQL数据库提供了逻辑流复制发布和订阅的功能。

您可以加入RDS PostgreSQL插件交流钉钉群(103525002795),进行咨询、交流和反馈,获取更多关于插件的信息。

前提条件

  • RDS PostgreSQL实例大版本为10或以上。

    说明

    暂不支持RDS PostgreSQL 17。

  • 实例内核小版本为20230830或以上。

    重要

    20230830内核小版本之前已支持此插件,但为了规范插件管理,提升RDS PostgreSQL在插件侧的安全防护,RDS计划在内核版本迭代中陆续对部分存在安全风险的插件进行优化,部分插件在低内核小版本无法创建,更多信息,请参见【产品/功能变更】RDS PostgreSQL限制创建插件说明

    • 如果您的实例内核小版本低于20230830,且已经使用了此插件,则不影响使用。

    • 如果您首次创建或重新创建此插件,请升级内核小版本到最新。

  • 使用该插件前,需要将pglogical加入到shared_preload_libraries参数中。

    您可以使用RDS PostgreSQL参数设置功能,为shared_preload_libraries参数添加pglogical。具体操作,请参见设置实例参数

    说明

    该参数修改后,在提交参数时会立即重启实例。重启实例会造成连接中断,重启前请做好业务安排,并确保应用有自动重连机制,谨慎操作。

背景信息

pglogical是PostgreSQL的拓展模块,使用发布/订阅模型复制数据,使选择性复制更加高效。提供比Slony、Bucardo或Londiste更快的复制速度,支持跨版本升级。支持多场景复制,具体包括:

  • 数据库大版本升级。

  • 完整的数据库复制。

  • 利用复制集,选择性地筛选表、行、列。

  • 可从多个上游服务器,用于数据的聚集和合并。

使用插件

  • 开启pglogical。

    CREATE EXTENSION pglogical;
  • 关闭pglogical。

    DROP EXTENSION pglogical;

快速配置逻辑流复制

  1. 在发布端创建发布节点。

    说明

    发布节点中host固定配置为127.0.0.1,port请通过SQL命令SHOW PORT;查询获取。

    SELECT pglogical.create_node(
        node_name := 'provider',
        dsn := 'host=127.0.0.1 port=<端口号> dbname=test user=provider_user password=provider_pass'
    );
  2. 配置复制集。

    将public中的所有表添加到default复制集。

    SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
    说明
    • 复制集用来控制将发布节点数据库中的哪些表以及这些表上的哪些操作发布给订阅者。

    • default复制集表示发布所有表及这些表的所有操作。更多复制集定义请参见pglogical官方文档

  3. 在订阅端创建订阅节点。

    说明

    订阅节点中host固定配置为127.0.0.1,port请通过SQL命令SHOW PORT;查询获取

    SELECT pglogical.create_node(
        node_name := 'subscriber',
        dsn := 'host=127.0.0.1 port=<端口号> dbname=test user=subscriber_user password=subscriber_pass'
    );
  4. 在订阅端创建订阅。

    说明
    • 订阅中host必须配置为发布端的内网地址,例如pgm-****.pg.rds.aliyuncs.comport配置为发布端内网端口

    • 您可以前往RDS管理控制台查看内网地址内网端口,具体操作请参见查看或修改连接地址和端口

    SELECT pglogical.create_subscription(
        subscription_name := 'subscription',
        provider_dsn := 'host=<provider内网地址> port=<provider内网端口> dbname=test user=provider_user password=provider_pass'
    );

    创建订阅后,将在后台启动同步和复制流程。

相关参考

pglogical的详细说明,请参见pglogical官方文档