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

openGauss 3.0.0 逻辑复制部署及使用

原创 Seven 云和恩墨 2022-04-14
3750

一、逻辑复制部署

主机信息:

IP:Port 版本号 角色
197.0.193.198:26000 3.0.0 发布端
197.0.194.194:26000 3.0.0 订阅端

要求: 迁移dbpaasstoredb库下,schema为cust1的表db2_tbs

1. 修改配置文件

发布节点:

$ vi postgresql.conf
wal_level = logical
max_replication_slots = 8

wal_level:设置成logical才支持逻辑复制
max_replication_slots>=每个节点所需的(物理流复制槽数+逻辑复制槽数)

订阅节点:

$ vi postgresql.conf
wal_level = logical
max_replication_slots = 8

2. 发布节点创建逻辑复制用户

必须具有**REPLICATION,SYSADMIN/OPRADMIN** 权限

openGauss=# CREATE USER repl REPLICATION OPRADMIN LOGIN ENCRYPTED PASSWORD 'xxxxx';

3. 发布节点修改pg_hba.conf文件

host  replication  repl  0.0.0.0/0  md5

4. 发布节点使用gs_dump导出表结构

openGauss=# gs_dump  -p 26000 dbpaasstoredb -t cust1.db2_tbs -s -f db2_tbs.sql  -F p

注:逻辑复制不会同步DDL操作和原有数据,需要先将发布端表结构和原有数据迁移到订阅端

5. 发布节点创建发布

dbpaasstoredb=# CREATE PUBLICATION pub1 FOR TABLE db2_tbs ;
CREATE PUBLICATION

查询发布信息

openGauss=# select * from pg_publication;
 pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete 
---------+----------+--------------+-----------+-----------+-----------
 pub1    |       10 | f            | t         | t         | t
(1 row)

6. 订阅节点上导入表结构

$ gsql -p 26000 -d dbpaasstoredb -f db2_tbs.sql

7. 订阅节点创建加密文件

gs_guc generate -S xxxxx -D $GAUSSHOME/bin -o subscription

8. 订阅节点创建订阅

端口号不能使用主端口,应该使用主端口+1端口,否则会与线程池冲突

CREATE SUBSCRIPTION sub1 CONNECTION 'host=197.0.193.198 port=26001 dbname=dbpaasstoredb user=repl password=xxxxx' PUBLICATION pub1;

9. 查看发布订阅相关信息

发布节点查看发布信息

dbpaasstoredb=# select * from pg_publication;

image.png
发布节点上查看复制槽

dbpaasstoredb=# SELECT slot_name,plugin,slot_type,database,active,restart_lsn FROM pg_replication_slots where slot_name='sub1';

image.png

订阅节点上查看订阅信息

dbpaasstoredb=# select * from pg_subscription;

image.png

订阅节点已经在同步数据

image.png

二、逻辑复制添加表、删除表

添加表

1. 发布端和订阅端分别创建同名表表结构

openGauss=# CREATE TABLE TEST2(id int,name varchar);
CREATE TABLE

2. 发布端添加test2表至pub2

openGauss=# ALTER PUBLICATION pub2 ADD TABLE TEST2;

3. 发布端添加数据

openGauss=# INSERT INTO test2 VALUES(1,'A');
INSERT 0 1
openGauss=# INSERT INTO test2 VALUES(2,'B');
INSERT 0 1
openGauss=# SELECT * FROM test2;
 id | name 
----+------
  1 | A
  2 | B
(2 rows)

4. 订阅端查看数据

image.png

删除表

1. 查看此时pub2中发布的表

openGauss=# select * from pg_publication_tables where pubname='pub2';

image.png
2. 如果test2表不需要逻辑同步,只需要在发布节点将test2表从发布pub2中去掉即可

#  ALTER PUBLICATION pub2 DROP TABLE test2;

image.png
此时两个节点的test2表为独立的表
数据不会同步

发布端插入一条数据:

image.png
订阅端未同步:

image.png

三、逻辑复制激活、停止

激活

1. 创建一个订阅,并且不开始复制直到稍后启用复制。

openGauss=# CREATE SUBSCRIPTION sub3 CONNECTION 'host=197.0.193.198 port=26001 dbname=postgres user=repl password=xxxxx' PUBLICATION pub2 WITH (enabled = false);

image.png
2. 发布端插入数据

image.png
3. 订阅端查看数据并未同步

image.png
4. 订阅端激活订阅

openGauss=# ALTER SUBSCRIPTION sub3 SET(enabled=true);

image.png
5. 发布端插入数据

image.png
6. 订阅端同步新增数据

image.png

停止

未提供此功能,因为停止后会导致发布端逻辑复制槽无法推进,导致xlog堆积,风险较大,所以暂不提供此功能

四、分区表测试

范围分区

1. 分别在发布端,订阅端创建Range分区表表结构

CREATE TABLE staffS_p1
(
 staff_ID NUMBER(6) not null,
 HIRE_DATE DATE
)
PARTITION BY RANGE (HIRE_DATE)
( 
 PARTITION HIRE_19950501 VALUES LESS THAN ('1995-05-01 00:00:00'),
 PARTITION HIRE_19950502 VALUES LESS THAN ('1995-05-02 00:00:00'),
PARTITION HIRE_19950503 VALUES LESS THAN ('1995-05-03 00:00:00')
);

2. 发布端将staffS_p1表添加至已有的part发布中

openGauss=# alter publication part add table staffs_p1 ;
ALTER PUBLICATION

3. 发布端插入数据

openGauss=# insert into staffS_p1 values (1,'1995-04-01 00:00:00');
INSERT 0 1

4. 订阅端查看,数据已同步

image.png
5. 发布端添加分区

openGauss=# alter table staffS_p1 add PARTITION HIRE_19950504 VALUES LESS THAN ('1995-05-04 00:00:00');

image.png
6. 订阅端查看

image.png
新添加的分区不会同步

间隔分区

1. 分别在发布端,订阅端创建Interval分区表表结构

CREATE TABLE sales
(prod_id NUMBER(6),
 time_id DATE
)
PARTITION BY RANGE (time_id)
INTERVAL('1 day')
( PARTITION p1 VALUES LESS THAN ('2019-02-01 00:00:00'),
 PARTITION p2 VALUES LESS THAN ('2019-02-02 00:00:00')
);

2. 发布端将staffS_p1表添加至已有的part发布中

openGauss=# alter publication part add table sales ;
ALTER PUBLICATION

3. 发布端插入数据

openGauss=# insert into sales values (1,'1995-04-01 00:00:00');
INSERT 0 1
openGauss=# insert into sales values (2,'2000-04-01 00:00:00');     
INSERT 0 1

image.png

4. 订阅端查看(只能同步不超过创建的分区范围的数据)

image.png
官方手册显示,目前不支持interval partition表复制

列表分区

1. 分别在发布端,订阅端创建List分区表表结构

CREATE TABLE test_list (col1 int, col2 int)
partition by list(col1)
(
partition p1 values (2000),
partition p2 values (3000),
partition p3 values (4000),
partition p4 values (5000)
);

2. 发布端将test_list表添加至已有的part发布中

openGauss=# alter publication part add table test_list ;
ALTER PUBLICATION

3. 发布端插入数据

openGauss=# insert into test_list values (2000,2000);
INSERT 0 1
openGauss=# insert into test_list values (3000,3000);
INSERT 0 1

4. 订阅端查看,数据已同步

image.png
5. 发布端添加分区

openGauss=# alter table test_list add PARTITION p5 VALUES (6000);

image.png
6. 订阅端查看

image.png

哈希分区

1. 分别在发布端,订阅端创建Hash分区表表结构

CREATE TABLE test_hash (col1 int, col2 int)
partition by hash(col1)
(
partition p1,
partition p2
);

2. 发布端将test_hash表添加至已有的part发布中

openGauss=# alter publication part add table test_hash ;
ALTER PUBLICATION

3. 发布端插入数据

image.png
4. 订阅端查看

数据已同步

image.png

五、注意事项

摘自官方手册:

  • 不支持DDL语句解码,在执行特定的DDL语句(如普通表truncate或分区表exchange)时,可能造成解码数据丢失。
  • 不支持列存、数据页复制的解码。
  • 不支持级联备机进行逻辑解码。
  • 当执行DDL语句(如alter table)后,该DDL语句前尚未解码的物理日志可能会丢失。单条元组大小不超过1GB,考虑解码结果可能大于插入数据,因此建议单条元组大小不超过500MB。
  • openGauss支持解码的数据类型为:INTEGER、BIGINT、SMALLINT、TINYINT、SERIAL、SMALLSERIAL、BIGSERIAL、FLOAT、DOUBLE PRECISION、DATE、TIME[WITHOUT TIME ZONE]、TIMESTAMP[WITHOUT TIME ZONE]、CHAR(n)、VARCHAR(n)、TEXT。
  • 如果需要ssl连接需要保证前置条件GUC参数ssl=on。
  • 逻辑复制槽名称必须小于64个字符,且只包含小写字母、数字或者下划线中的一种或几种。
  • 当前逻辑复制不支持MOT特性。
  • 当逻辑复制槽所在数据库被删除后,这些复制槽变为不可用状态,需要用户手动删除。
  • 仅支持utf-8字符集。
  • 对多库的解码需要分别在库内创建流复制槽并开始解码,每个库的解码都需要单独扫一遍日志。
  • 不支持强起,强起后需要重新全量导出数据。
  • 备机解码时,switchover和failover时可能出现解码数据变多,需用户手动过滤。Quorum协议下,switchover和failover选择升主的备机,需要与当前主机日志同步。不允许主备,多个备机同时使用同一个复制槽解码,否则会产生数据不一致。
  • 只支持主机创建删除复制槽。
  • 数据库故障重启或逻辑复制进程重启后,解码数据存在重复,用户需自己过滤。
  • 计算机内核故障后,解码存在乱码,需手动或自动过滤。
  • 当前备机逻辑解码,不支持开启极致RTO。
  • 请确保在创建逻辑复制槽过程中长事务未启动,启动长事务会阻塞逻辑复制槽的创建。
  • 不支持interval partition表复制。
  • 不支持全局临时表。
  • 在事务中执行DDL语句后,该DDL语句与之后的语句不会被解码。
  • 如需进行备机解码,需在对应主机上设置guc参数enable_slot_log = on。
  • 禁止在使用逻辑复制槽时在其他节点对该复制槽进行操作,删除复制槽的操作需在该复制槽停止解码后执行。
最后修改时间:2022-04-15 15:58:33
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论