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

逻辑复制(发布-订阅)

IT那活儿 2025-08-11
244
点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!
一

环 境

节点1ip
192.168.88.190
节点2ip
192.168.88.124
查看状态有关信息视图说明:
  • pg_publication;
    查看发布。发布本身是无状态的,复制槽是有状态的,所以没有pg_stat_publication。
  • pg_publication_tables
    查看发布的表,简单明了。
  • pg_publication_rel
    查看发布的表,都是id。
  • pg_stat_subscription
    查看订阅状态,pid是worker进程的pid。
  • pg_subscription
    查看订阅。
  • pg_subscription_rel
    查看订阅表,没有pg_subscription_tables。另外该视图可以查看订阅下面各个表的同步情况,这是复制槽视图做不到的。
\dRp list replication publications

\dRs list replication subscriptions

二

发布端

2.1 修改参数kingbase.conf
listen_addresses = '*'
wal_level = logical ####修改postgres.conf,wal_level参数重启生效
max_replication_slots = 8  ###设置数据库复制槽的数量,值必须大于订阅的数量
max_wal_senders = 10       ###设置值必须大于max_replication_slots + 物理备库数

2.2 修改sys_hba.conf文件,reload生效
host pubdb rep 192.168.88.0/32 md5
2.3 创建复制用户并赋权
createuser rep replication login connectionlimit8password'rep';
createdatabase pubdb;
GRANT ALL PRIVILEGESONDATABASE  pubdb to rep;

2.4 创建要复制的表并授权给复制用户
\c pubdb --如果复制用户不是表的owner,应该授权grantselecton trep1 to replicate1
grantselecton trep1 to rep;
createtable trep1(a int primary key,b char(10));
insertinto trep1 values(1,'abc');
altertable trep1 owner to rep ;

2.5 创建发布
注:用superuser用户也可以。
\c pubdb rep
create publication pub fortable trep1;

2.6 查看创建的发布(四种方式)
select * from pg_publication;
pubdb=> select * from pg_publication;
  oid | pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate 
-------+---------+----------+--------------+-----------+-----------+-----------+-------------
 24674 |
 pub | 24662 | f | t | t | t | t
\dRp
pubdb=> \dRp
                        List of publications
 Name | Owner | All tables | Inserts | Updates | Deletes | Truncates 
------+-------+------------+---------+---------+---------+-----------
 pub | rep | f | t | t | t | t
select * from pg_publication_tables;
pubdb=> select * from pg_publication_tables; 
 pubname | schemaname | tablename 
---------+------------+-----------
 pub | public | trep1
pubdb=> select * from pg_publication_rel;
  oid | prpubid | prrelid 
-------+---------+---------
24675| 24674 |   24669

三

订阅端

3.1 修改参数kingbase.conf
listen_addresses = '*'
wal_level = logical ####修改postgres.conf,wal_level参数重启生效
max_replication_slots = 8  ###设置数据库复制槽的数量,值必须大于订阅的数量
max_wal_senders = 10       ###设置值必须大于max_replication_slots + 物理备库数

3.2 修改sys_hba.conf文件,reload生效
host subdb rep 192.168.88.0/32 md5
3.3 创建接收用户并赋权
createuser rep replication login connectionlimit8password'rep';
createdatabase subdb;

3.4 创建要接受的表
\c subdb 
createtable trep1(a int primary key,b char(10));
altertable trep1 owner to rep ;

3.5 用superuser用户创建订阅
create subscription kingbase8lasprdl_kfs_logical_slot connection'host=192.168.88.190 port=54329 dbname=pubdb user=rep password=rep' publication pub;
3.6 查看创建的订阅(四种方式)
select * from pg_stat_subscription;
subdb=# select * from pg_stat_subscription; 
 subid | subname | pid | relid | received_lsn | last_msg_send_time | last_msg_receipt_time | latest_end_lsn | latest_end_time 
-------+-----------------------------------+-----+-------+--------------+--------------------+-----------------------+----------------+-----------------
16400| kingbase8lasprdl_kfs_logical_slot |     | |              | |                       | |
select * from pg_subscription;
subdb=# select * from pg_subscription;
  oid | subdbid |              subname | subowner | subenabled | subconninfo |         
   subslotname | subsynccommit | subpublications 
-------+---------+-----------------------------------+----------+------------+-------------------------------------------------------------------+---------
--------------------------+---------------+-----------------
16400| 16385 | kingbase8lasprdl_kfs_logical_slot | 10 | t | host=192.168.88.190 port=54329 dbname=pubdb user=rep password=rep | kingbase
8lasprdl_kfs_logical_slot | off | {pub}
\dRs
subdb=# \dRs
                       List of subscriptions
               Name | Owner | Enabled | Publication 
-----------------------------------+--------+---------+-------------
 kingbase8lasprdl_kfs_logical_slot |
 system | t | {pub}
select * from pg_subscription_rel ; 
subdb=# select * from pg_subscription_rel ; 
 srsubid | srrelid | srsubstate | srsublsn 
---------+---------+------------+----------
   16400 |
   16395| i |

创建成功后,可以在发布节点查询如下信息:
select slot_name,plugin,slot_type,database,active,restart_lsn from pg_replication_slots where slot_name='kingbase8lasprdl_kfs_logical_slot';

END


本文作者:王鑫雨(上海新炬中北团队)

本文来源:“IT那活儿”公众号

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

评论