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

细说瀚高数据同步工具Dbrep第一讲

瀚高售前团队 2021-09-18
1037
                    
一、背景简介
数据库是信息技术的基础,随着数据的不断增长,对数据安全、数据一致性、高可用等提出了更高的要求。数据复制是提高信息系统可靠性和可用性的关键技术
瀚高提出了基于逻辑复制的自研工具—Dbrep。该方案不依赖源数据库的触发器或者规则,对源数据库几乎没有影响,能以极少的系统开销实现秒级的数据同步,支持同构库和异构库之间的数据复制,另外还支持双向复制
                    
二、原理介绍
在进行数据同步时,源端数据库需要进行一系列逻辑复制相关的设置,包括修改配置文件、为指定的表(或整个库)创建发布。Dbrep向发布端数据库申请订阅,请求创建复制槽(slot),并将数据转发给目标库,原理图如下:
Dbrep作为订阅端,向发布端数据库请求数据。当用户操作这些表时,发布端数据库会为这些操作生成WAL日志,wal_sender作为发布端的真正发送进程,使用解码器分析WAL日志,生成一条逻辑复制协议数据,并发送给Dbrep。
Dbrep收到数据,根据逻辑复制协议进行解析,并根据数据内容,或重组新的SQL语句,或将数据填充到发送缓冲中,然后通过相关数据库驱动接口,将数据发送到目标库中。
Dbrep和源数据库之间通过心跳检测来保证网络可用。当心跳检测失败时,启动网络断线重连机制,尝试进行多次重连。Dbrep和目的库之间通过驱动程序以长连接的形式连接数据库,当最近一次数据发送失败时,若返回网络失败的错误,也会启动网络断线重连机制,尝试进行多次重连。
Dbrep的原理用一句话总结:源端库为需要的表创建发布(publication),Dbrep订阅该发布,然后转发给目标库
                   
3、功能简介
Dbrep提供了以下功能:
1)异构数据库实时复制:Dbrep是基于PostgreSQL开发的数据库系统(包含但不限于瀚高数据库),支持到MySQL、Oracle等国外主流数据库,以及国产数据库的数据同步。
(2)网络断线重连:对系统运行期间可能出现的网络波动和短时离线,Dbrep提供了重连机制,保证了在数据传输时,Dbrep与源数据库之间、Dbrep与目标数据库之间的网络总是可用的。
3)失败重试机制:Dbrep为每一条语句的执行,都提供了多次尝试,以保证当前语句的执行不受异构数据库状态的影响。当多次尝试都未成功时,程序会直接退出,并将所作尝试记录到日志中。因异构数据库状态导致的失败,并不会影响Dbrep的再次运行,Dbrep会重新从源数据库获取数据再次执行上次失败的语句。
(4)断点续传机制:wal_sender与Dbrep交互时,源端以slot数据结构为载体记录传输信息,包含当前发送的LSN号码、对端接收情况等。Dbrep会实时记录当前的复制进度到LSN文件夹,并以确认包的形式向源数据库汇报,源数据库仅清理被确认过的WAL日志。当与源端链接意外断开时,Dbrep尚未提交的数据被异构数据库回滚,由于未向源数据库发送确认包,源端WAL日志不会被清理。链接恢复后,Dbrep会读取LSN文件夹的内容,以从断点处继续请求数据。
(5)丰富的类型支持:Dbrep提供了对数值类型、文本类型、二进制类型的支持,总计达20余种。
本次以瀚高安全版数据库作为源端库、某国产数据库作为目标库来验证Dbrep的数据同步功能。具体过程如下。
                       
4、部署架构图
源端: 部署瀚高安全版数据库
目标端: 部署某国产数据库,ODBC,OCI 接口相关库,Dbrep
4.1 数据库安装
4.1.1 安装瀚高安全版数据库
请参照相关的 《瀚高数据库安装手册》
(1)修改数据库的配置文件postgresql.conf,将监听地址修改为监听所有
    listen_addresses = '*'
    将 wal_level注释去掉并修改为逻辑模式:

      wal_level = logical
      (2)修改配置文件pg_hba.conf,增加如下行

        host  all   all   0.0.0.0/0   md5
        4.1.2 安装某国产数据库

        请参照官方安装文档。ODBC连接时需要使用 sysdba及密码,注意保留。
        4.2 安装ODBC
          #Step1 下载安装包,放到/usr/local目录下
          ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.7.tar.gz


          #Step2 安装
          cd usr/local
          tar zxvf unixODBC-2.3.7.tar.gz


          #Step3 配置、编译、安装
          cd unixODBC-2.3.7
          ./configure --prefix=/usr/local/unixODBC-2.3.7 --includedir=/usr/include --libdir=/usr/lib --bindir=/usr/bin --sysconfdir=/etc
          make&make install
          在命令行输入下列命令:odbcinst -j,测试是否安装成功,出现下面界面就表明安装成功
          4.3 FAQ
          Q:按照步骤执行,但终端提示“odbcinst: error while loading shared libraries: libodbcinst.so.2: cannot open shared object file: No such file or directory”应该怎么办?
          A:出现这个界面说明安装失败了,通常是由于库文件安装到了/lib或者是/usr/lib的文件夹下,需要进入安装libodbcinst.so.2的目录中,使用命令ldconfig,然后再次测试即可。
                                                            
          5、配置 ODBC连接目标端数据库
          5.1 配置 etc/odbc.ini
          5.2 配置 etc/odbcinst.ini
                                                      
          6、安装Oracle 相关的依赖库
          Dbrep也支持往 ORACLE 进行数据复制,所以有一些依赖包需要安装
          6.1 下载安装包
          下载的oracle-instantclient安装包,在网址栏输入下面的网址然后进入:
            https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
            按照下图选择进行下载,本次选择的是19.8版本,下载如下四个安装包,下载时提示需要注册,注册即可。本文选择将下载的文件存放在/usr/local/下。
            6.2 安装
            进入/usr/local文件夹,开始安装上述四个rpm包,依次运行以下命令:
              cd usr/localrpm -ivh oracle-instantclient19.8-basic-19.8.0.0.0-1.x86_64.rpmrpm -ivh oracle-instantclient19.8-odbc-19.8.0.0.0-1.x86_64.rpmrpm -ivh oracle-instantclient19.8-devel-19.8.0.0.0-1.x86_64.rpmrpm -ivh oracle-instantclient19.8-sqlplus-19.8.0.0.0-1.x86_64.rpm
              6.3 配置环境信息
              修改环境变量配置文件~/.bash_profile,在 export PATH 标志行前添加如下内容
                export TNS_ADMIN=/etc/oracle
                export ORACLE_HOME=/usr/lib/oracle/19.8/client64
                export LD_LIBRARY_PATH=$ORACLE_HOME/lib
                export ORCLE_SID=ORCL
                PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
                export C_INCLUDE_PATH=/usr/include/oracle/19.8/client64
                export LIBRARY_PATH=$ORACLE_HOME/lib
                export NLS_LANG=AMERICAN_AMERICA.AL32UTF
                参数解释:
                TNS_ADMIN:后跟放置tnsnames.ora的文件夹目录
                ORACLE_SID:后跟之前强调过要记住的名字
                NLS_LANG: 当前仅支持AMERICAN_AMERICA.AL32UTF8
                Note:环境变量中的版本值和安装的Driver 版本对应
                刷新一下环境变量
                  source ~/.bash_profile
                                                   
                  7、安装数据复制工具
                  7.1 安装依赖包
                  在目标端服务器上安装 bison 和 flex 依赖包。
                    yum install bison flex
                    7.2 安装Dbrep
                    将安装包上传到 /usr/local 路径下 ,安装完之后的目录是 /usr/local/Dbrep/
                      rpm -ivh Dbrep-1.0-1.el7.x86_64.rpm
                      7.3 配置环境变量
                      修改环境变量文件 ~/.bash_profile,在 export PATH 标志行前添加如下内容:
                        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/Dbrep
                        刷新一下环境变量:
                          source ~/.bash_profile
                          7.4 配置Dbrep_recvlogical.conf
                          进入/opt/ 所在文件夹,修改配置文件Dbrep_recvlogical.conf










                          至此,数据复制Dbrep的配置就完成了。
                                                               
                          8、使用数据复制Dbrep
                          8.1 源端库的相应表结构
                          Note:仅仅作为示例在此展示,具体请根据生产环境设置
                          在数据源端创建数据库
                            create database testfor;
                            进入testfor数据库, 创建表结构
                              create table table_name(xxx,xxx,xxx);
                              在数据库源端 创建 publication,记住publication name, 后续需要配置到 Dbrep_recvlogical的配置文件中
                                create publication pub_name for table table_name;
                                8.2 创建目标端相应表结构
                                在目标端,创建与上节中相对应的数据库和表结构。
                                8.3 初始化数据复制Dbrep环境
                                进入安装目录/usr/local/Dbrep,运行初始化脚本,此脚本只需运行一次
                                  ./Dbrep_init.sh
                                  8.4 运行数据复制Dbrep
                                  修改/opt/Dbrep_recvlogical.conf 配置文件内的publication name :
                                    pubnames=pub_name
                                    进入程序所在的目录/usr/local/Dbrep/,创建slot
                                      ./Dbrep_recvlogical -h PG_host_address -U user_name -d db_name -p 5866 --slot slot_name --create-slot
                                      Note: 此命令是发送请求给数据库源端,在数据库源端创建用于传输的slot。
                                      8.5 相关命令
                                      前台启动命令
                                        ./Dbrep_recvlogical -U postgres -h PG_host_address -d test -p 5866 --slot ut1 –-start
                                        后台启动命令
                                          nohup ./Dbrep_recvlogical -U postgres -h PG_host_address -d test -p 5866 --slot ut1 –-start &
                                          参数解释:
                                          -h: 数据库服务器的 IP 地址
                                          -U: 登录数据库服务器的用户名
                                          -d: 数据库服务器的数据库名
                                          -p: 后面接数据库服务器的端口号
                                          slot_name:slot的名称,可以使用不一样的名称,也可以创建多个slot,但是默认最多为4个。
                                          Note: 具体相关参数请参考程序的帮助信息( ./Dbrep_recvlogical --help)
                                           
                                          停止程序
                                          若是前台启动的程序, ctrl+c 即可退出程序;若是后台启动的程序,需找到后台进程id,然后使用kill命令退出此进程
                                          修改发布
                                          如需向发布中增加表,则可用下列语句进行修改publication。
                                            alter publication pub_ut1 add table table_name;
                                            如需将表从发布中删除,则可用下列语句(该语句不会将数据库中的表删除。)
                                              alter publication pub_ut1 drop table table_name;
                                              删除订阅
                                              要删除订阅应当先停止程序
                                                ./Dbrep_recvlogical -h PG_host_address -U user_name -d db_name -p 5866 --slot slot_name --drop-slot
                                                删除lsn目录
                                                  rm -rf /usr/local/Dbrep/lsn
                                                             
                                                  9、验证
                                                  首先按照第8节的内容,在源端库创建测试库、创建发布、创建slot等。
                                                  本次验证char/varchar/bigint/bigserial/text/time without timezone/money
                                                  9.1 瀚高数据库建表、并对外发布
                                                    create table tbl_Dbrep_other3(userid char(4),username varchar(20),col_bigint bigint,col_bigserial bigserial,col_text text,col_timewithouttz time without time zone,col_money money);
                                                    alter publication pub_test add table tbl_Dbrep_other3;
                                                    9.2 目标库同步表结构
                                                      create table tbl_Dbrep_other3(userid char(4),username varchar(20),col_bigint bigint,col_bigserial bigint,col_text text,col_timewithouttz time,col_money numeric(19,2));
                                                      9.3 瀚高数据库插入数据
                                                        insert into tbl_Dbrep_other3 values('0001','Jessca',2147483647,2147483647,'《一去二三里》 一去二三里,烟村四五家。亭台六七座,八九十枝花。',time without time zone '2021-08-19 10:00:53',12345678900000000.01);
                                                        select * from tbl_Dbrep_other3;
                                                        9.4 目标库查询
                                                          select * from tbl_Dbrep_others2;
                                                          接着测试了Update、Delete,同样可以实现数据同步。
                                                          当前支持的数据类型包括:

                                                          瀚高数据库

                                                          目标库(某国产数据库)

                                                          boolean

                                                          char

                                                          smallint

                                                          smallint

                                                          int

                                                          int

                                                          bigint

                                                          bigint

                                                          numeric

                                                          Numeric

                                                          decimal

                                                          decimal

                                                          real

                                                          real

                                                          double precision

                                                          double precision

                                                          serial

                                                          serial

                                                          bigserial

                                                          bigserial

                                                          char(n)

                                                          char(n) n<8188

                                                          varchar(n)

                                                          varchar(n) n < 8188

                                                          text

                                                          text

                                                          bytea

                                                          blob

                                                          timestamp[p] without time zone

                                                          timestamp[p] without time zone 

                                                          date

                                                          date

                                                          time[p] whthout time zone

                                                          time

                                                          interval

                                                          varchar2(45)

                                                          money

                                                          number(19,2)

                                                          bit(n)

                                                          char(n)

                                                          inet

                                                          varchar

                                                          cidr

                                                          varchar

                                                          macaddr

                                                          varchar

                                                          xml

                                                          text

                                                          json

                                                          text

                                                          uuid

                                                          varchar(36)

                                                          本次仅验证Dbrep在异构数据库间进行数据同步时对数据类型的支持,后续将详细介绍Dbrep的性能以及高可用性。

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

                                                          评论