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

「瀚高数据库技术栈」细说瀚高数据同步工具Dbrep第二讲

瀚高数据库 2021-10-27
1019

                       

一、功能简介

上次介绍了瀚高的Dbrep工具实现到异构数据库的数据复制(瀚高数据库复制到某国产数据库),本次来介绍一下Dbrep工具的另一个实用功能:数据双向同步。
双向同步是业务信息系统中常有的现实需求,比如:在描述同一个对象的数据发生了新增、变更和删除时,多个系统之间的数据需要同步。传统的数据库层解决方案常采用外部数据同步工具、数据库Trigger、Policy与UDF组合实现相关需求。当业务需求发生变更或新增,调整工作量和时效都难以保证。使用瀚高数据库集成的Dbrep工具,可以快速的实现同构数据库间的双向数据同步。
                        
二、实现原理
PostgreSQL已经实现了通过Logical replication实现逻辑复制(发布与订阅),可以进行表级别的数据单向同步复制。而对实现双向同步的需求,往往需要借助第三方ETL工具来,同时还要避免产生数据重复写入和冲突(ping-pong)现象,比如出现这样的循环发送和接收:

为了解决ping-pong的问题,需要增设数据源筛选的功能,在接收到DML请求时,对逻辑层实际需要replay的部分进行鉴别,即可以识别下图中,蓝色和红色箭头的请求是否由为重复发起,以实现数据一致,避免进入ping-pong循环。

         
                        
三、实测记录
1.测试环境
服务器
服务器127
服务器128
服务器IP
192.168.70.127
192.168.70.128
数据库名
db127
db128

2.系统准备和数据库安装 

关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service
 关闭 SELINUX
# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g"  /etc/selinux/config
# setenforce 0
# cat etc/selinux/config | grep SELINUX=disabled
# getenforce
安装系统软件包
# yum install vim wget readline readline-devel zlib zlib-devel openssl openssl-devel pam-devel libxml2-devel libxslt-devel python-devel tcl-devel gcc gcc-c++ rsync -y
安装HGDB,这里使用HGDB企业版rpm安装包进行安装并自动完成数据库初始化:
修改一下pg_hba文件,测试环境没有使用加密通信和密码校验,在pg_hba.conf中添加2行:
host all all 0.0.0.0/0 trust
host replication all 0.0.0.0/0 trust
修改监听为*,配置wal_level级别为logical;
开启双向同步功能开关(hg_enable_duplex_copy)。
重启数据库:
pg_ctl restart
 
3.双向同步实验
1)准备测试表
  • 新建数据库

为了测试效果更直观,以IP地址为标记创建了测试库:

127:
    create database db127;br

    128:

      create database db128;br
      • 创建测试表

      db127和db128分别创建相同结构测试表:

        create table duptest1 (id int primary key,code int,mm text);br
        2)创建双向同步
        • db127和db128分别创建发布

        发布的动作可以是insert、update、delete和truncate,我们使用默认的配置,即全部包括。

        The default is to publish all actions, and so the default value for this option is 'insert, update, delete, truncate'
        127:
          create publication pub_127_1 for table duptest1;

          128:

            create publication pub_128_1 for table duptest1;

            查看两个数据库的发布:

            • 127,128分别创建到对端的订阅

            这里需要注意的是,目前dbrep_dual双向同步是对“增量数据”进行同步,所以在订阅创建的时候需要使用”copy_data=false”参数,该参数默认是true,即单向订阅的时候默认对基表数据进行拷贝。

            128:
              create subscription sub_128_1 connection 'host=192.168.70.127 port=5432 user=highgo password=Test@123 dbname=db127' publication pub_127_1 with(copy_data=false);

              127:

                create subscription sub_127_1 connection 'host=192.168.70.128 port=5432 user=highgo password=Test@123 dbname=db128' publication pub_128_1 with(copy_data=false);

                创建完成后查看订阅情况:

                  select * from pg_subscription;
                  3)双向同步测试
                  • insert测试

                  127:
                    insert into duptest1 values (1,110,’Police’);
                    insert into duptest1 values (2,120,’First-adi’);

                    128:

                      insert into duptest1 values (3,122,’Traffic-accident’);
                      insert into duptest1 values (4,12123,’Traffic-service’);

                      可以看到127和128的插入的数据已经同步。 

                      • Update测试

                        127上更新一条数据:

                        update duptest1 set code = 95518,mm = 'PICC' where id = 4;

                        128同步了127更新的数据

                        128上更新:
                          update duptest1 set code = 95511,mm = 'PINGAN' where id = 4;

                          数据update后,127和128的数据已经同步 

                          • Delete测试

                          127上删除数据:

                            delete from duptest1 where code = 122;

                            128同步了删除操作

                            128上删除一条数据:
                              delete from duptest1 where code = 120;

                              数据delete后,127和128的数据已经同步。

                              •  truncate测试

                              127上进行truncate表操作

                              truncate操作同样会在128上同步操作

                              4)测试环境清理
                              127:
                                drop subscription sub_127_1;
                                drop publication pub_127_1;
                                drop table duptest1;
                                128:
                                  drop subscription sub_128_1;
                                  drop publication pub_128_1;
                                  drop table duptest1;
                                                
                                  四、FAQ
                                  • 限制条件

                                  1)双向同步涉及的表,在创建订阅时,只支持增量数据同步(即copy_data=false);
                                  2)双向同步的表,表结构需要一致。不支持单向同步中,源表列可以少于目的表的方式;
                                  3)若无主键,订阅表上必须有相应的唯一索引或REPLICA IDENTITY(通常业务系统表都包含主键或唯一索引);
                                  4)只支持基表到基表的复制,而不是视图、物化视图、分区根表、外部表等之间的同步;
                                  5)序列数据类型不支持(序列是单独维护的);
                                  6)大对象数据暂不支持(目前支持储存在普通表中的数据类型)。

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

                                  评论