逻辑复制是数据同步的一种方式,数据变化同步的一种方式。该方式一般是基于主键或者是唯一键来做的。逻辑复制使用的是分发订阅的模式实现的。
一、逻辑复制的应用场景
备库需要提供写能力的情况,例如双主库
只需要部分表的同步情况,例如数据上报、OLAP数仓等
不通平台数据库之间的复制,例如linux、windows上的pg之间的复制
二、逻辑复制的限制
不支持分区表的同步,分区表只能按照子分区表来实现分发订阅
只支持普通表和普通表上的DML,不支持序列、视图、物化视图、外部表、大对象,不支持truncate、DDL
需要同步的表必须设置REPLICA IDENTITY ,通常使用主键或者唯一键
一个publisher可以包含一张或多张表,一张表可以有一个或多个publishers
逻辑复制不同于流复制,不是严格的主从关系,订阅者端的普通表依然可以进行增删改操作
同步表的表结构需要在发布者和订阅者两边保持一致 通常使用 pg_dump来初始化
三、参数配置
修改postgresql.conf和 pg_hba.conf两个配置文件,关于配置文件的说明可参考 配置文件详解
1、修改postgresql.conf数据库参数文件(修改这些参数需要重启数据库)
a、发布者端设置
设置wal_level 级别为logical:wal_level = logical
设置max_wal_senders,此参数值要不小于max_replication_slots的参数值,默认值是10
设置max_replication_slots,此参数值不少于subscriptions的个数,默认值是10
b、订阅者端设置
设置wal_level级别为logical:wal_level = logical
设置max_logical_replication_workers,此参数值不少于订阅者的个数,默认是4
设置max_worker_processes,此参数值不少于max_logical_replication_workers值+1
2、在pg_hba.conf添加白名单(根据真实情况自行限制网段)
host all repuser 0.0.0.0/0 md5
3、创建专门用于逻辑复制的用户。
该用户需要具有复制表的读权限,一般用超级用户。
create user repl superuser login password 'repl654321';
四、发布者配置
publisher是逻辑复制的数据发布方,也是第一步。
--查看source_db数据库的发布者source_db=# \dRpList of publicationsName | Owner | All tables | Inserts | Updates | Deletes------+-------+------------+---------+---------+---------(0 rows)--在crmdb数据库上创建名为pub的发布者source_db=# CREATE PUBLICATION pub;CREATE PUBLICATIONsource_db=#source_db=# \dRpList of publicationsName | Owner | All tables | Inserts | Updates | Deletes-------+----------+------------+---------+---------+---------pub | postgres | f | t | t | t(1 row)--查看pub发布的详细信息source_db=# \dRp+Publication pubOwner | All tables | Inserts | Updates | Deletes----------+------------+---------+---------+---------postgres | f | t | t | t(1 row)source_db=# \dRpList of publicationsName | Owner | All tables | Inserts | Updates | Deletes------+-------+------------+---------+---------+---------(0 rows)--在crmdb数据库上创建名为pub的发布者source_db=# CREATE PUBLICATION pub;CREATE PUBLICATIONsource_db=#source_db=# \dRpList of publicationsName | Owner | All tables | Inserts | Updates | Deletes-------+----------+------------+---------+---------+---------pub | postgres | f | t | t | t(1 row)--查看pub发布的详细信息source_db=# \dRp+Publication pubOwner | All tables | Inserts | Updates | Deletes----------+------------+---------+---------+---------postgres | f | t | t | t(1 row)
五、订阅端配置
subscriber是逻辑复制的接收者。--查看target_db数据库下的订阅者
target_db=# \dRsList of subscriptionsName | Owner | Enabled | Publication------+-------+---------+-------------(0 rows)--在sub_db数据库上创建名为mysub的订阅者target_db=# CREATE SUBSCRIPTION sub CONNECTION 'dbname=source_db host=source_ip user=repl password=repl654321 port=6432' PUBLICATION pub;NOTICE: created replication slot "sub" on publisherCREATE SUBSCRIPTIONtarget_db=#target_db=# \dRsList of subscriptionsName | Owner | Enabled | Publication-------+----------+---------+-------------sub | postgres | t | {pub}(1 row)--查看订阅者mysub的详细信息target_db=# \dRs+List of subscriptionsName | Owner | Enabled | Publication | Synchronous commit | Conninfo-------+----------+---------+-------------+--------------------+-------------------------------------------------------------------------------------sub | postgres | t | {pub} | off | dbname=source_ip host=source_ip user=repl password=repl654321 port=6432(1 row)
六、添加需要同步的表
#在源端,也就是发布者的数据库--创建表,注意需要有replication identity ,也即是需要主键source_db=# create table tb1(id int primary key,col1 varchar(20));CREATE TABLEsource_db=# insert into tb1(id,col1) select generate_series(1,3000),'teststring';INSERT 0 3000--添加到发布者pubsource_db=# alter publication pub add table tb1;ALTER PUBLICATION--查看发布者的详细信息source_db=# \dRp+ pubPublication pubOwner | All tables | Inserts | Updates | Deletes----------+------------+---------+---------+---------postgres | f | t | t | tTables:"public.tb1"#在目标库,也就是订阅者端--创建相同的表target_db=# create table tb1(id int primary key,col1 varchar(20));CREATE TABLE--刷新一下订阅者source_db=# ALTER SUBSCRIPTION sub REFRESH PUBLICATION;ALTER SUBSCRIPTION--查询数据是否已经同步过来source_db=# select count(*) from tb1;count-------3000(1 row)
关于约束对逻辑复制的影响
一般来说,逻辑复制,不管是pg官方还是第三方,例如ogg等,目标的的触发器、约束都要禁用掉。
官方关于逻辑复制的文档
文章转载自三杯酒coO,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




