-
DMDRS介绍
达梦数据实时同步软件(以下简称 DMDRS)是支持异构环境的高性能、高可靠、高可扩展数据库实时同步复制系统。该产品采用基于日志的结构化数据复制技术,不依赖主机上源数据库的触发器或者规则,对主机源数据库系统几乎无影响,能以极少的系统开销实现秒级数据实时同步复制。
DMDRS基于成熟的关系数据模型和标准接口,支持多种软硬件平台,能够灵活的配置出一对一、一对多、多对一、多对多以及级联等多种形式的复制拓扑结构,可以广泛应用于应急系统、容灾备份、负载均衡、数据移植、联机维护、订阅分发、多业务中心等业务领域。
DMDRS的组成原理框图中包含源端数据库、目标端数据库、源端DMDRS服务以及目标端 DMDRS 服务,其中源端DMDRS服务主要由装载模块(LOAD)、日志捕获分析模块(CPT)、传输模块(NET)以及管理服务模块(MGR)组成;
目标端DMDRS服务则由执行模块(EXEC)和管理服务模块(MGR)组成。
在源端DMDRS的CPT模块采用优化的日志扫描算法实现增量日志数据的快速捕获分析,并将分析完成后的日志数据转换为内部的消息格式,然后通过网络将消息发送至目标端DMDRS服务;
在目标端DMDRS服务接收到源端的日志消息后,对消息进行处理,通过多线程并行执行的方式将同步数据应用至目标端数据库,实现数据实时同步。
DMDRS 同步服务主要包括四个模块,分别是捕获模块(CPT)、装载模块(LOAD)、传输模块(NET)以及执行模块(EXEC),这些模块统一由管理模块(MGR)进行管理执行。
管理模块(MGR):MGR模块可以解析配置参数,根据配置参数启动DMDRS的捕获器功能、执行器功能、转发器功能或路由功能。当MGR启动捕获器功能时,MGR会调度CPT模块和NET模块(发送子模块);当启动执行器功能时,会调度NET模块(接收子模块)和EXEC模块;当启动转发器或路由器功能时,会调度NET模块(接收子模块和发送子模块)。
捕获模块(CPT): 对源数据库增量日志进行捕获并完成解析,结合数据字典信息提取其中数据的变化如插入(INSERT)、删除(DELETE)、修改(UPDATE)和对象操作(DDL),然后将这些操作及数据转换为内部的消息格式投递给网络(NET)模块。
装载模块(LOAD):DMDRS 在进行增量数据同步之前,需完成同步表的字典装载和表数据的初始装载。表字典装载将所有同步表的数据字典信息从源库中抽取出来,保存为本地的数据字典文件,用于数据同步过程中提供准确表定义信息。数据初始装载用于将源端数据库的初始数据同步至目标数据库,使得源库和目标库的初始数据保持一致。
传输模块(NET): 传输模块NET应用于捕获器CPT、路由器ROUTE、转发器 TRANSFER、执行器 EXEC,分为接收子模块(RECV)与发送子模块(SEND),在同步中承担节点之间数据的收发任务。
1) 日志捕获 CPT 模块需要通过 NET 模块来发送数据。
2) EXEC 模块则需要通过 NET 模块接收数据。
3) ROUTE 通过 NET 模块进行消息转发。
4) TRANSFER 通过 NET 模块进行消息转发。
同步链路中多对一、一对多和多对多的数据传输都是通过 NET 模块来实现的。RECV子模块与 SEND 子模块在 DMDRS 配置文件中的位置如下所示:
执行模块(EXEC) EXEC 模块主要的功能是对 CPT 捕获的增量数据进行入库,它目前采用符合 SQL92 标准的 SQL 语句,通过 ODBC 接口和目标端数据库交互(在初始化装载时如果选择快装功能,它需要加载快装模块,快装模块使用了 OCI 接口),所以它可以部署在能够和目标端数据库连通的任意一个节点上。在整个同步链路中,EXEC 模块对整个同步的性能起着决定性的作用,需要根据相应的同步场景配置好 EXEC 模块参数,方可达到最优的同步性能。
节点 | 操作系统 | IP地址 | 数据库类型 |
源端 | 麒麟v10SP3 | 84.0.191.2 | DM8单机 |
目标端 | 麒麟v10SP3 | 84.0.191.3 | DM8单机 |
#获取系统位数
# getconf LONG_BIT
64
#查询系统内核
# uname -a
Linux dm8db01 4.19.90-52.22.v2207.ky10.x86_64 #1 SMP Tue Mar 14 12:19:10 CST 2023 x86_64 x86_64 x86_64 GNU/Linux
#检查内存
为了保证 DMDRS 的正确安装和运行,要尽量保证操作系统至少 1GB 的可用内存(RAM)。如果可用内存过少,可能导致 DMDRS 安装或启动失败.
# grep MemTotal /proc/meminfo
MemTotal: 15077112 kB
#获取交换分区大小
# grep SwapTotal /proc/meminfo
SwapTotal: 0 kB
#获取内存使用详情
# free -g
total used free shared buff/cache available
Mem: 15 1 10 0 3 13
Swap: 0 0 0
检查存储空间
# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 7.2G 0 7.2G 0% /dev
tmpfs 7.2G 0 7.2G 0% /dev/shm
tmpfs 7.2G 9.2M 7.2G 1% /run
tmpfs 7.2G 0 7.2G 0% /sys/fs/cgroup
/dev/mapper/klas-root 52G 21G 32G 39% /
tmpfs 7.2G 0 7.2G 0% /tmp
/dev/sda1 295M 155M 141M 53% /boot
tmpfs 1.5G 0 1.5G 0% /run/user/0
检查临时空间
# df -h /tmp
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/h3linux-root 292G 158G 135G 55% /
-
-
-
DMDRS安装
-
-
源端和目标端都要安装DMDRS,上传DMDRS的安装包到Linux,使用dmdba用户进行安装包:DMDRS_V4.3.22_dm8_rev141932_rh6_64_20231016.bin
# su - dmdba
$ chmod +x DMDRS_V4.3.22_dm8_rev141932_rh6_64_20231016.bin
$ export DISPLAY=84.0.191.1:0.0
$ ./DMDRS_V4.3.22_dm8_rev141932_rh6_64_20231016.bin
通过服务查看器 hsservice 查看已安装的服务
$ /home/dmdba/dmhs/tool/hsservice
全部在root用户下操作
# tar -zxvf unixODBC-2.3.0.tar.gz
# cd /soft/odbc/unixODBC-2.3.0/
# ./configure
# make && make install
-
-
-
配置 odbc.ini
-
-
配置 odbc.ini 数据源信息和 odbcinst.ini 驱动信息
# vi /usr/local/etc/odbc.ini
[DM8]
Description = DM ODBC DSN
Driver = DM8 ODBC DRIVER
SERVER = localhost
UID = SYSDBA
PWD = SYSDBA
TCP_PORT = 5236
-
-
-
配置 odbcinst.ini
-
-
# vi /usr/local/etc/odbcinst.ini
[DM8 ODBC DRIVER]
Description = ODBC DRIVER FOR DM8
Driver = /dm8/bin/libdodbc.so
注:这里根据实际安装路径填写,要不然找不到libdodbc.so
使用dmdba用户执行命令
# su – dmdba
$ isql dm8 -v
或者
$ isql dm8
$ mkdir -p /dm8/data/DAMENG/arch
$ disql SYSDBA/SYSDBA@127.0.0.1:5236
SQL> alter database mount;//切换数据库到配置状态
SQL> alter database add ARCHIVELOG 'type=local,dest=/dm8/data/DAMENG/arch,file_size=1024,space_limit=0';
SQL> alter database ARCHIVELOG;
SQL> alter database open;
SQL> select arch_mode from v$database;
LINEID ARCH_MODE
---------- ---------
Y
SELECT ARCH_DEST, ARCH_FILE_SIZE FROM SYS.V$DM_ARCH_INI WHERE ARCH_TYPE='LOCAL'
AND ARCH_IS_VALID='Y';
行号 ARCH_DEST ARCH_FILE_SIZE
---------- --------------------- --------------
1 /dm8/data/DAMENG/arch 1024
vi /dm8/data/DAMENG/dm.ini
ARCH_INI = 1
RLOG_APPEND_LOGIC = 1
SQL> SELECT PARA_VALUE FROM SYS.V$DM_INI WHERE PARA_NAME = 'RLOG_APPEND_LOGIC';
行号 PARA_VALUE
---------- ----------
- 1
检查在线日志
SQL> SELECT PATH FROM SYS.V$RLOGFILE;
行号 PATH
---------- -----------------------------
1 /dm8/data/DAMENG/DAMENG01.log
2 /dm8/data/DAMENG/DAMENG02.log
检查 FAST_COMMIT 参数是否为 0
SQL> select PARA_NAME,para_value from v$dm_ini where para_name = 'FAST_COMMIT';
行号 PARA_NAME PARA_VALUE
---------- ----------- ----------
1 FAST_COMMIT 0
-
-
配置DDL辅助表和触发器
-
方式一(执行ddl_sql_dm8.sql)
-
-
如果要求 DDL 同步,那么需要创建DDL触发器和辅助表,使用SYSDBA连接登录数据库执行DMDRS安装目录下script子目录的“ddl_sql_dm8.sql”脚本。
$ disql SYSDBA/SYSDBA@127.0.0.1:5236
SQL> start /home/dmdba/DMHS/scripts/ddl_sql_dm8.sql
执行完成后,使用以下SQL语句查询辅助表是否创建成功
select owner, table_name from dba_tables where owner = 'SYSDBA' and table_name like 'DMDRS%' and status = 'VALID';
行号 OWNER TABLE_NAME
---------- ----------- ----------------
1 SYSDBA DMDRS_DDL_COL
2 SYSDBA DMDRS_DDL_SQL
3 SYSDBA DMDRS_DDL_CONS
4 SYSDBA DMDRS_DDL_IDX
5 SYSDBA DMDRS_DDL_RENAME
6 SYSDBA DMDRS_DDL_SEQ
7 SYSDBA DMDRS_DDL_PART
8 SYSDBA DMDRS_DDL_COMMENT
9 SYSDBA DMDRS_DDL_LOG
执行以下SQL语句查询触发器是否创建成功:
select owner, trigger_name from dba_triggers where owner = 'SYSDBA' and trigger_name like 'DMDRS%' and status = 'Y';
行号 OWNER TRIGGER_NAME
---------- ------ -----------------------
1 SYSDBA DMDRS_DDL_TRIGGER_AFTER
2 SYSDBA DMDRS_DDL_TRIGGER_BEFORE
3 SYSDBA DMDRS_DDL_TRIGGER_GRANT
4 SYSDBA DMDRS_DDL_TRIGGER_REVOKE
另外一种方式同步 DDL:系统表附加日志的方式同步 DDL,该方式同步 DDL 时,只能同步常规对象,如:table、index、constraint、trigger、procedure、function、view、sequence;对应的操作类型:create、drop、alter、truncate。同时,不支持分区表。系统表附加日志方式同步 DDL 的配置方法为:将 DM8 数据库的配置文件“dm.ini”中的“RLOG_APPEND_SYSTAB_LOGIC”设置为 1,再重启数据库实例即可。
$ vi /dm8/data/DAMENG/dm.ini
RLOG_APPEND_SYSTAB_LOGIC = 1
$ ./DmServiceDMSERVER restart
Stopping DmServiceDMSERVER: [ OK ]
Starting DmServiceDMSERVER: [ OK ]
在DMDRS安装目录下的bin子目录,新建dmhs.hs配置文件
$ cd /home/dmdba/dmhs/bin
$ vi dmhs.hs
<?xml version="1.0" encoding="GB2312"?>
<DMDRS>
<base> <!-- 管理模块的基本配置 -->
<lang>en</lang> <!-- 语言选项,ch 为中文,en 为英文 -->
<mgr_port>5345</mgr_port> <!-- 管理端口号,默认为5345-->
<ckpt_interval>60</ckpt_interval> <!-- 检查点间隔,默认60 -->
<siteid>2</siteid> <!-- 站点ID,这个ID配置时要注意,全局唯一,最小值0,最大值65535 -->
<version>2.0</version>
</base>
<exec> <!-- 执行模块的基本配置 -->
<recv>
<data_port>5346</data_port> <!-- 当数据传递采用网络直连时,需要配置该参数,表明同步数据从该端口号获取。 -->
</recv>
<db_type>dm8</db_type> <!-- 目标端数据库类型 -->
<db_server>84.0.191.3</db_server> <!-- 目标端IP即当前IP -->
<db_user>SYSDBA</db_user> <!-- 目标端数据库用户 -->
<db_pwd>SYSDBA2023</db_pwd> <!-- 用户的密码 -->
<db_port>5236</db_port> <!-- 目标端数据库端口 -->
<db_name>CUGDB</db_name> <!-- 默认数据库名,默认为空串(只针对dm6有用)-->
<char_code>PG_GB18030</char_code>
<exec_thr>4</exec_thr> <!-- 执行线程个数,只有当 exec_mode 为 1 时才会生效!默认为1 -->
<exec_sql>1024</exec_sql> <!-- SQL 缓存大小,默认为 512M -->
<exec_trx> 5000 </exec_trx> <!-- 事务缓存个数,默认为 5000 -->
<exec_rows>1000</exec_rows> <!-- 批量绑定行数,默认为 250 -->
</exec>
</DMDRS>
$/home/dmdba/dmhs/bin/dmhs_server dmhs.hs
start exec
或者
控制台DMDRS_console 控制台管理工具启动
$ /home/dmdba/dmhs/tool/DMDRS_console
DMDRS console tool: V4.3.22-Build(2023.10.13-141932trunc)_64_2310
Copyright (c) 2020, DMDRS. All rights reserved.
Type ? or "help" for help, type "quit" to quit console.
Connected to DMDRS: 127.0.0.1:5345
execute success
Dameng HS Server V4.3.22-Build(2023.10.13-141932trunc)_64_2310
DMDRS> start exec
execute success
在DMDRS安装目录下的bin子目录,新建Dmhs.hs配置文件
$ vi /home/dmdba/dmhs/bin/dmhs.hs
<?xml version="1.0" encoding="GB2312"?>
<DMDRS>
<base>
<lang>ch</lang>
<mgr_port>5345</mgr_port>
<ckpt_interval>60</ckpt_interval>
<siteid>1</siteid>
<version>2.0</version>
</base>
<cpt>
<db_type>dm8</db_type>
<db_server>127.0.0.1</db_server>
<db_user>SYSDBA</db_user>
<db_pwd>SYSDBA</db_pwd>
<db_port>5236</db_port>
<db_ssl_path></db_ssl_path>
<db_ssl_pwd></db_ssl_pwd>
<parse_thr>1</parse_thr>
<ddl_mask>op:obj:TABLESPACE </ddl_mask> <!--DDL配置项,如果不需要DDL同步,配置为空-->
<arch><!--归档清理配置项-->
<clear_interval>600</clear_interval>
<clear_flag>0</clear_flag>
</arch>
<send><!-- 发送模块配置 -->
<ip>84.0.191.2</ip><!—执行端 IP-->
<mgr_port>5345</mgr_port><!—执行端 mgr_port -->
<data_port>5346</data_port> <!—执行端 data_port -->
<trigger>1</trigger><!-- 是否忽略触发器,默认为 0,限定值 0,1 -->
<constraint>1</constraint><!-- 是否忽略约束,默认为 0,限定值 0,1 -->
<identity>1</identity>
<net_turns>0</net_turns>
<filter><!--过滤配置项-->
<enable><!-- 白名单,所有允许同步的表 -->
<item>OMP.*</item>
</enable>
</filter>
<map><!--映射配置项-->
<item>OMP.*==OMP.*</item><!--*.*是抽取整个库-->
</map>
</send>
</cpt>
</DMDRS>
配置说明:
1) siteid全局唯一,即 DMDRS 同步系统涉及的所有节点的 siteid 必须全局唯一,不允许有重复值。
2) DDL配置项 , 如果不需要DDL同步 , 那么就配置为空 , 即<ddl_mask></ddl_mask>,相应地DMDRS DDL触发器和辅助表也不需要创建。
3) 归档清理配置项,clear_flag为1表示清除,即DMDRS将同步完成的归档文件删除;为 2,表示将同步完成的归档移到bak_dir目录下;为 0,表示不作任何操作。
4) 过滤配置项,本示例配置了白名单,即 enable,也可以配置黑名单,详见 DMDRS
用户手册。其过滤的规则是:先判断白名单,然后判断黑名单。如果存在重叠的情况,那么也是会被过滤的。
5) 映射配置项,表示存在不同模式之间的表同步,例如本示例中源端的 SYSDBA 模式下的表映射成目的端的 DMDRS 模式下同名的表。
$/home/dmdba/dmhs/bin/dmhs_server dmhs.hs
clear exec lsn #为了初始化日志的起始位置。
初始装载是将源端数据库中的初始数据装载到目的端数据库,使 DMDRS 同步的时刻源和目的端的同步表数据一致。装载前源端DMDRS服务和目的端DMDRS服务都需要开启。
初始装载:
$/home/dmdba/dmhs/tool/dmhs_console
DMDRS >copy 0 "sch.name='OMP'" DICT|LSN|CREATE|INSERT|INDEX
DMDRS_server 控制台启动(本地)
start cpt
显示如上界面表示启动成功
或者
控制台DMDRS_console 控制台管理工具启动
[dmdba@dm8db01 tool]$ /home/dmdba/DMHS/tool/DMDRS_console
DMDRS console tool: V4.3.22-Build(2023.10.13-141932trunc)_64_2310
Copyright (c) 2020, DMDRS. All rights reserved.
Type ? or "help" for help, type "quit" to quit console.
Connected to DMDRS: 127.0.0.1:5345
execute success
Dameng HS Server V4.3.22-Build(2023.10.13-141932trunc)_64_2310
DMDRS> start cpt
execute success
DM到DM的DMDRS部署完成!
结论:源端和目标端表名称及表数量一致。
结论:源端和目标端存量数据表行数一致。
begin
for i in 101000..102000 loop
insert into omp.year_2001 values(i, 'cisco-'||i,'3306','10000','router-'||i,to_date('2021-06-20 18:31:34','YYYY-MM-DD HH24:MI:SS'));
end loop;
commit;
end;
/
结论:源端和目标端表新增数据行数一致。
create table omp.year_6688(
ID number(10) primary key not null,
name varchar(30),
port VARCHAR(255),
speed VARCHAR(255),
type VARCHAR(255),
create_time date
);
begin
for i in 1..5000 loop
insert into omp.year_6688 values(i, 'cisco-'||i,'3306','10000','router-'||i,to_date('2021-06-20 18:31:34','YYYY-MM-DD HH24:MI:SS'));
end loop;
commit;
end;
/
结论:源端和目标端新增表及表行数一致。
修改源端配置文件
$ vi /home/dmdba/dmhs/bin/dmhs.hs
<map><!--映射配置项-->
<item>*.*==*.*</item><!--*.*是抽取整个库-->
</map>
$ vi /home/dmdba/dmhs/bin/dmhs.hs
<map><!--映射配置项-->
<item>FMS.*==FMS.*</item><!—用户名.*-->
</map>
$ vi /home/dmdba/dmhs/bin/dmhs.hs
<map><!--映射配置项-->
<item>DWD.YEAR_2001==DWD.YEAR_2001</item><!—用户.表名-->
<item>DWD.YEAR_2002==DWD.YEAR_2002</item><!—用户.表名-->
<item>DWD.YEAR_2003==DWD.YEAR_2003</item><!—用户.表名-->
</map>
$ vi /home/dmdba/dmhs/bin/dmhs.hs
<map><!--映射配置项-->
<item>TS.OMPDB==TS.FMSDB</item><!--源端表空间OMPDB映射到目的端FMSDB表空间-->
</map>