暂无图片
暂无图片
1
暂无图片
暂无图片
1
暂无图片

运维日记|postgresql-pg逻辑订阅介绍及搭建

新运维新数据 2021-04-13
5344

各位新朋友~记得先点蓝字关注我哦~


逻辑复制是一种基于数据对象的复制标识(通常是主键)复制数据对象及其更改的方法。我们使用术语“逻辑”来与物理复制加以区分,后者使用准确的块地址以及逐字节的复制方式。


9.4之后,可以进行逻辑复制,但是要基于各种插件。pg10之后,自带逻辑复制。


01 应用场景和架构

1 可用于多个库(的表)融合到一个库或一到多

2 可用于不同主版本

3 可用于不同平台,如win到linux


逻辑复制采用 发布/订阅架构。可以一对多,或者多对一。


02 相关限制

1、数据库模式(schema)和DDL命令不会被复制。但支持支持TRUNCATE命令的复制

2、序列数据不被复制


3、大对象不会被复制。没有办法可以解决这个问题,除非把数据存储在普通表中。

大对象可以在视图pg_largeobject中查看


4、复制只能从基表到基表。也就是说,发布端和订阅端上的表都必须是普通表,而不是视图、物化视图、分区根表或者外部表。如果是分区,可以一一对应地复制分区层次,但当前不能复制成一种不同的分区设置。尝试复制不是基表的表将会导致错误


03 搭建环境准备操作

#pg服务器版本为12.2

3.1

创建复制用户作为逻辑同步使用

---所有节点操作

如本次测试,共有2台服务器,分别在2台上,创建如下用户:


注意,一般不太建议是直接使用postgres用户,可以创建一个用户,如mc_logrepl.

赋予replication权限,注意,要同步的表需要赋予该用户select权限。为了测试方便,我们就直接使用postgres用户了


3.2

修改pg_hba.conf文件

---订阅端操作

    主库
    host all all 192.168.0.0/24 md5
    host replication mc_logrepl 192.168.0.0/24 md5

    第一行 #允许XX这个从服务器连接到主服务器
    第二行 #允许使用replica用户来复制,第二个字段必须填上一步添加的用户
    #psql
    psql> select pg_reload_conf();
    复制


    3.3

    修改postgresql.conf

    ---发布端操作

    1. wal_level=logical     #重启生效

    2. max_replication_slots,默认10,每一个订阅需要消耗一个slot,每一个指定了slot的流式物理复制也要消耗一个slot。

    3. max_wal_senders,默认32,每一个slot要使用一个wal sender,每一个流式物理复制也要使用一个wal sender。

    4. max_worker_processes,默认8必须大于等于max_wal_senders加并行计算进程,或者其他插件需要fork的进程数。

    #重启pg服务生效。

    #只有listen_address改变需要重启,否则select pg_reload_conf() 即可。

    pg_ctl stop –D $PGDATA

    pg_ctl start –D $PGDATA


    ---订阅端操作

    1. max_replication_slots,大于等于该实例总共需要创建的订阅数

    2. max_logical_replication_workers,大于等于该实例总共需要创建的订阅数

    3. max_worker_processes, 大于等于max_logical_replication_workers + 1 +


    04 同步表结构、创建发布、订阅

    4.1

    创建publication

      CREATE PUBLICATION name
      [ FOR TABLE [ ONLY ] table_name [ * ] [, ...]
      | FOR ALL TABLES ]
      [ WITH ( publication_parameter [= value] [, ... ] ) ];
      复制

      注意,有三种情况

      create publication mc_pub1;  这样的发布在后面添加表之后,需要刷新订阅才可同步;

      create publication mc_pub1 for table XX1,XX2;这样的发布在订阅创建之后可以直接同步到备端;新添表需要手动加到发布中。

      create publication mc_pub1 for all tables;  这样的发布可以同步所有的表,并且以后该数据库下创建的新表会自动添加到同步中。注意,一开始的表会自动同步,之后创建的表还是要更新。

      所以无论怎么样,新增表在订阅端都要进行刷新。


      4.2

      在订阅端创建想要同步的表

      可以在不同的database下,但是表名和表结构要一致。

      ##注意,不需要做初始化数据同步,和oracle的ogg有很大区别

      获取发布端的表创建语句,在订阅端创建。

      获取建表语句:

      pg_dump -t 'public.log_test' -s -f dump.sql postgres

      -s表示 –schema_only 只导出表结构,不导出表数据。


      4.3

      创建 subscription

        Syntax:
        CREATE SUBSCRIPTION subscription_name
        CONNECTION 'conninfo'
        PUBLICATION publication_name [, ...]
        [ WITH ( subscription_parameter [= value] [, ... ] ) ]
        复制

          例子如下:
          create subscription sub1 connection 'host=192.168.242.38 port=5432 dbname=test user=postgres password=postgres' publication mc_pub1;
          复制

            ###如果发布端wal_level参数没改,创建订阅会报如下错误。
            ERROR: could not create replication slot "sub20": ERROR: logical decoding requires wal_level >= logical
            复制

            05 验证

            ---发布端:

              test=# select * from pg_stat_replication;
              -[ RECORD 1 ]----+------------------------------
              pid | 12767
              usesysid | 10
              usename | postgres
              application_name | sub1
              client_addr | 192.168.242.39
              client_hostname |
              client_port | 45805
              backend_start | 2020-04-22 17:42:38.207911+08
              backend_xmin |
              state | streaming
              sent_lsn | 0/F06A7D0
              write_lsn | 0/F06A7D0
              flush_lsn | 0/F06A7D0
              replay_lsn | 0/F06A7D0
              write_lag |
              flush_lag |
              replay_lag |
              sync_priority | 0
              sync_state | async
              reply_time | 2020-04-22 18:46:19.914323+08
              复制


              ---订阅端:

                aaaa=# select * from pg_stat_subscription ;
                -[ RECORD 1 ]---------+------------------------------
                subid | 16421
                subname | sub1
                pid | 26526
                relid |
                received_lsn | 0/F06A6E8
                last_msg_send_time | 2020-04-22 18:01:03.130734+08
                last_msg_receipt_time | 2020-04-22 18:01:04.343345+08
                latest_end_lsn | 0/F06A6E8
                latest_end_time | 2020-04-22 18:01:03.130734+08
                复制

                如上,可以看到,逻辑订阅已经生效了!


                好,至此,有关pg逻辑订阅的的简单介绍就到这里。下次再见!


                美创运维中心数据库服务团队拥有Oracle ACE 1人、OCM 10余人、数十名Oracle OCP、MySQL OCP、红帽RHCA、中间件weblogic、tuxedo认证、达梦工程师 ,著有《Oracle DBA实战攻略》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》等多本数据运维优化书籍。目前运维各类数据库合计2000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、达梦等主流商业和开源数据库。并成为首批国内达梦战略合作伙伴之一,拥有海量经验和完善的人员培养体系。并同时提供超融合,私有云整体解决方案。


                文章转载自新运维新数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论

                冷狼
                暂无图片
                2月前
                评论
                暂无图片 0
                运维日记|postgresql-pg逻辑订阅介绍及搭建
                2月前
                暂无图片 点赞
                评论