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

PG17新特性:逻辑复制故障转移

中启乘数 2024-11-18
520



前言

PostgreSQL对逻辑复制的开发与日俱增,PostgreSQL16新增可以在备库上使用逻辑复制,而PostgreSQL17在逻辑复制槽中新增了一个failover的故障转移功能。本文就把这个新特性给大家做个分享。



本文测试环境




主机名ip地址
角色
PG17-0110.197.165.109主库
PG17-02
10.197.165.113
流复制备库
PG17-0310.197.165.114逻辑复制备库



搭建流复制主备库

正常搭建一个主备的环境,注意备库要使用物理复制槽进行数据的流复制同步

创建物理复制槽:

    select pg_create_physical_replication_slot('phy_to_113');

    搭建备库时指定使用该物理复制槽:

      pg_basebackup -h 10.197.165.109 -p 5432 -U postgres -D $PGDATA -S phy_to_113 -R -v

      备库要配置如下参数:

      • hot_standby_feedback = on

      • sync_replication_slots = on

      • wal_level = logical

      • primary_conninfo 加上 dbname=postgres 参数



      搭建逻辑复制主备库

      在从主库服务器PG17-01(发布)到PG17-03服务器(订阅)搭建一个逻辑复制的发布订阅。

      发布端和订阅端创建相同的测试表:

        create table t1 (id int primary key,t text);

        发布端创建发布:

          create publication mypub for table t1 ;

          订阅端创建订阅,在这里指定不自动创建逻辑复制槽,而是指定一个逻辑复制槽名称,之后手动创建,这样方便在创建逻辑复制槽时给逻辑复制槽设置参数。

            create subscription mysub connection 'host=10.197.165.109 port=5432 user=postgres dbname=postgres' publication mypub with(create_slot=false,slot_name='lgc_to_114');

            在发布端创建逻辑复制槽,这里指定逻辑复制槽使用failover功能,最后一个参数为true就表示该复制槽使用failover功能。

              select pg_create_logical_replication_slot('lgc_to_114','pgoutput',false,false,true);

              在PG17-02数据库上查看复制槽,就会发现该数据库主库PG17-01上的逻辑复制槽同步到了该备库上,状态为false。

                postgres=# select slot_name,slot_type,active,failover from pg_replication_slots;
                slot_name | slot_type | active | failover
                ------------+-----------+--------+----------
                lgc_to_114 | logical | f | t
                (1 row)

                向发布端的测试表插入一些数据:

                  insert into t1 values (1,'PG17-01');

                  此时逻辑复制备库上测试表数据同步正常。

                    postgres=# select * from t1;
                    id | t
                    ----+---------
                    1 | PG17-01
                    (1 row)



                    演练主从切换

                    当发生主从切换后,观察逻辑复制是否可以在激活后的备库运行。

                    激活备库:

                      pg_ctl promote

                      这时向切换后的主库的测试表中插入一些数据:

                        insert into t1 values (2,'PG17-02');

                        在订阅端修改订阅连接到发布的连接信息,手动改为从激活的备库拉取发布信息。

                          alter subscription mysub connection 'host=10.197.165.113 port=5432 dbname=postgres user=postgres password=postgres';

                          此时在PG17-02数据库服务器上查看复制槽信息,发现从PG17-01数据库服务器同步的逻辑复制槽已经启动并正常同步到PG17-03订阅端。

                            postgres=# select slot_name,slot_type,active,failover from pg_replication_slots;
                            slot_name | slot_type | active | failover
                            ------------+-----------+--------+----------
                            lgc_to_114 | logical | t | t
                            (1 row)

                            此时在订阅端查看测试表,数据同步成功。

                              postgres=# select * from t1;
                              id | t
                              ----+---------
                              1 | PG17-01
                              2 | PG17-02
                              (2 rows)



                              问答时间

                              Q

                              这个特性能不能结合PG16新特性:可在备库上使用逻辑复制槽,在备库上创建使用failover功能的逻辑复制槽?

                              A

                              这个failover功能只能在主库创建逻辑复制槽时指定,如果在备库尝试创建开启failover功能的逻辑复制槽会提示报错:

                                ERROR:  cannot enable failover for a replication slot created on the standby

                                Q

                                那不创建逻辑复制槽,直接把订阅的发布信息改为未激活的已经同步逻辑复制槽的备库会正常进行逻辑复制吗

                                A

                                在修改或重新创建发布信息地址是备库的订阅后,并不能成功运行逻辑复制槽。

                                Q

                                逻辑复制槽同步会不论备库级联关系同步到该主库下的所有备库吗?

                                A

                                逻辑复制槽同步只会同步与该主库有直接流复制连接的备库,其他备库则不会同步逻辑复制槽。



                                总结

                                    在PG17中,逻辑复制槽新加的failover参数能够使备库同步主库的逻辑复制槽。使其能够在主备切换后或激活备库后,在手动切换逻辑复制的发布连接到该备库后来进行逻辑复制接续,实现逻辑复制的故障转移。

                                PostgreSQL

                                 

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

                                评论