配置Postgres

在使用Postgres的CDC源表Connector前,上游的Postgres存储需要满足一些要求。本文将从阿里云RDS PostgreSQL、Amazon RDS for PostgreSQL和自建PostgreSQL三种环境详细为您介绍相关要求及操作。

背景信息

在正式使用Postgres CDC之前,请先进行相应的配置。在本文中我们将分别介绍如何配置阿里云RDS PostgreSQL、Amazon RDS for PostgreSQL和自建PostgreSQL。考虑到Postgres CDC是基于Postgres提供的逻辑订阅机制来进行数据同步,为方便理解您可以参见逻辑解密基本概念逻辑订阅原理与最佳实践来获取相关的背景知识。

阿里云RDS PostgreSQL

  • 阿里云RDS PostgreSQL和VVP之间需要网络连通

    • 如果RDS PostgreSQL和VVP处于相同地域的同一VPC网络中,则RDS与VVP的网络是连通的。

    • 如果RDS PostgreSQL和VVP处于不同的网络环境中,则您需要通过VPN网关等方式,将RDS PostgreSQL与VVP之间的网络打通。详情请参见Flink全托管如何访问公网?如何访问跨VPC的其他服务?

    • 请设置相应的白名单,从而确保VVP能访问RDS PostgreSQL。详情请参见设置白名单

  • 阿里云RDS PostgreSQL服务器配置要求

    • 版本限制

      目前仅支持同步10、11、12、13、14、15和16版本的PostgreSQL的数据。您可以通过执行select version()命令来查看PostgreSQL的版本。

    • 需要开启逻辑解码

      • 请设置wal_level = logical,详情请参见设置实例参数。如果设置成功后,可以通过逻辑解码文档中的示例进行测试和使用。

      • 请确保同步表的replica identity的级别为FULL

        您可以通过以下SQL代码查看并修改相应参数。

        --查看replicaidentity。
        SELECT CASE relreplident
          WHEN'd'THEN'default'
        WHEN'n'THEN'nothing'
        WHEN'f'THEN'full'
        WHEN'i'THEN'index'
        ENDASreplica_identity
        FROMpg_class
        WHEREoid='mytablename'::regclass;
        
        --修改replicaidentity。
        ALTERTABLEmytablenameREPLICAIDENTITYFULL;
  • 数据同步插件

    从阿里云RDS PostgreSQL 10开始,PostgreSQL默认已经安装了wal2json逻辑解码(wal2json)和pgoutput插件。其中,wal2json插件要求RDS PostgreSQL实例的版本为11、12或13。而pgoutput插件要求使用的PostgreSQL的版本不小于10。

    说明

    如果您使用pgoutput插件来同步相关数据,则请确保您同步数据使用的账号为高权限账号,详情请参见创建账号

Amazon RDS for PostgreSQL

  • Amazon RDS for PostgreSQL和VVP之间需要网络连通

    您需要允许VVP通过公网访问Amazon RDS for PostgreSQL,详情请参见Flink全托管如何访问公网?认可访问的IP段

  • Amazon RDS for PostgreSQL服务器配置要求

    • 版本限制

      目前仅支持同步10、11、12、13、14、15和16版本的PostgreSQL的数据。您可以通过执行select version()命令来查看PostgreSQL的版本。

    • 需要开启逻辑解码

      • 请设置rds.logical_replication的值为1。

      • 请确保wal_level的值为logical。默认情况下,如果rds.logical_replication的值被设置为1,则wal_level就自动设置为了logical。

      • 请确保需要同步的表的replica identity的级别为FULL。

        您可以通过以下SQL代码查看并修改相应参数。

        --查看replica identity。
        SELECTCASErelreplident
         WHEN'd'THEN'default'
         WHEN'n'THEN'nothing'
         WHEN'f'THEN'full'
         WHEN'i'THEN'index'
         ENDASreplica_identity
        FROMpg_class
        WHEREoid='mytablename'::regclass;
        
        --修改replica identity。
        ALTERTABLEmytablenameREPLICAIDENTITYFULL;
      • 账号角色要求

        默认情况下,只有AWS上的主账户在Amazon RDS for PostgreSQL上具有rds_replication角色,该角色保证了用户可以管理逻辑槽(logical slots),并通过逻辑槽流读数据。如果您要启用主账户以外的用户账户启动逻辑复制,则必须授予账户rds_replication角色。例如,将rds_replication授予<my_user>。您必须具有超级用户访问权限才能向用户授予rds_replication角色。如果您要启用主账户以外的账户创建初始快照,则必须对要捕获的表上的账户授予SELECT权限。

    • 数据同步插件

      请使用pgoutput作为同步插件。

自建PostgreSQL

  • 自建PostgreSQL和VVP之间需要网络连通

    • 如果您的自建PostgreSQL部署在阿里云上,且和VVP均处于同地域的同一VPC网络中,则PostgreSQL与VVP的网络是连通的。

    • 如果您的自建PostgreSQL没有部署在阿里云上,则需要有公网地址,使得VVP能够访问该地址。因此您需要通过VPN网关将自建PostgreSQL和VVP的网络打通,详情请参见Flink全托管如何访问公网?。同时,您还需要修改pg_hba.conf文件,允许VVP访问PostgreSQL,详情请参见更新pg_hba.conf文件

  • PostgreSQL服务器配置要求

    • 版本限制

      目前仅支持同步9.6、10、11、12、13、14、15和16版本的PostgreSQL的数据。您可以通过执行select version()命令来查看PostgreSQL的版本。

    • 开启逻辑解码

      • 请确保wal_level的值为logical,修改postgresql.conf并重启数据库。

      • 请确保需要同步的表的replica identity的级别为FULL。

        您可以通过以下SQL代码查看并修改相应参数。

        -- 查看replica identity。
        SELECT CASE relreplident
           WHEN 'd' THEN 'default'
           WHEN 'n' THEN 'nothing'
           WHEN 'f' THEN 'full'
           WHEN 'i' THEN 'index'
           END AS replica_identity
        FROM pg_class
        WHERE oid = 'mytablename'::regclass;
        
        -- 修改replica identity。
        ALTER TABLE mytablename REPLICA IDENTITY FULL;
      • 创建具有同步权限的账号

        数据同步账号需要拥有REPLICATION和LOGIN权限,以及需要同步表的SELECT权限。

        CREATE ROLE <replication_user> REPLICATION LOGIN;
        
        GRANT SELECT ON <table_name> TO <name>;
    • 数据同步插件

      PostgreSQL 10及以上的版本,默认已经安装了同步插件pgoutput。而对于其它版本或需要安装其它同步插件的,可以参见安装逻辑同步插件

      如果您使用pgoutput作为同步工具,则请确保该账号是需要同步表的Owner。您可以参照如下步骤,确保同步账号是需要同步表的Owner。

      -- 1.创建一个同步组。
      CREATE ROLE <replication_group>;
      
      -- 2.将原来表的owner加入到同步组中。
      GRANT REPLICATION_GROUP TO <original_owner>;
      
      -- 3.将同步账号加入到同步组中。
      GRANT REPLICATION_GROUP TO <replication_user>;
      
      -- 4.将相关的权限转给同步组。
      ALTER TABLE <table_name> OWNER TO REPLICATION_GROUP;
      说明

      此时同步账号只是单表的所有者,因此请在WITH参数内设置debezium.publication.autocreate.mode值为filtered。如果您觉得为每张表设置相关权限过于繁琐,则可以直接赋予同步账号pg_monitor权限。

      GRANT pg_monitor TO <replication_user>;