在数据库系统的日常运维中,数据同步是一项高频需求——无论是构建容灾备份系统、实现读写分离,还是在系统升级迁移过程中保持业务不中断,都离不开高效、可靠的数据同步工具。达梦数据实时同步软件(DMDRS)正是为此而生的一款企业级产品。
本文将从DMDRS的基本原理出发,逐步深入到部署配置、同步场景和性能调优,帮助读者建立从理论到实践的完整认知。
达梦数据实时同步软件(DMDRS)是达梦数据库官方推出的数据复制工具,支持同构及异构数据库之间的数据实时同步。它采用基于日志的结构化数据复制技术,不依赖源数据库的触发器或规则,对源数据库系统几乎无影响,能以极少的系统开销实现秒级甚至亚秒级的数据实时同步。
DMDRS支持多种复制拓扑结构,包括一对一、双向、一对多、多对一、级联以及环形同步等,可广泛应用于应急系统、容灾备份、负载均衡、数据迁移、联机维护、订阅分发、多业务中心等业务场景。
与传统的DTS迁移工具不同,DTS通常要求在迁移过程中停机以防止数据不一致,而DMDRS通过全量装载与增量同步的组合,能够在不需要长时间停机的情况下完成数据迁移。
DMDRS的核心工作原理可以概括为一句话:源库产生日志,DMDRS解析日志,目标端执行日志。
具体来说,源数据库的每一次数据变更都会产生对应的重做日志(Redo Log),每条日志记录都有一个唯一的LSN(Log Sequence Number)。源端DMDRS从指定的起始LSN开始,持续捕获并解析增量日志,将解析出的INSERT、UPDATE、DELETE以及DDL操作转换为内部消息格式,通过网络发送至目标端;目标端DMDRS接收消息后,在目标数据库中执行相应操作,从而实现数据同步。
为了实现这一流程,DMDRS采用了模块化设计,主要包含以下核心模块:
| 模块 | 全称 | 核心职责 |
|---|---|---|
| MGR | Manager管理模块 | 解析配置参数,加载和维护其他模块,提供客户端监听与控制命令执行 |
| CPT | 捕获模块 | 对源数据库增量日志进行捕获与解析,结合数据字典提取数据变化,转换为内部消息格式 |
| LOAD | 装载模块 | 完成同步表的字典装载和全量数据的初始装载 |
| NET | 传输模块 | 承担节点之间数据的收发任务,分为接收子模块(RECV)与发送子模块(SEND) |
| EXEC | 执行模块 | 接收CPT模块发送的增量数据,在目标数据库中进行应用 |
这些模块统一由MGR管理,通过灵活配置不同的模块组合,DMDRS可以实现数据迁移、数据同步、数据分发和数据转换等多种功能。
在部署DMDRS之前,源数据库和目标数据库需要进行一些必要的配置。
DMDRS依赖数据库的归档日志来捕获数据变更,因此需要确保归档功能已开启。在dm.ini中设置ARCH_INI = 1,并配置dmarch.ini文件指定归档路径。
RLOG_APPEND_LOGIC参数控制逻辑日志中记录的信息量,其取值含义如下:
一般情况下设置为1即可满足多数同步需求。
需要在源库和目标库分别创建DMDRS专用的数据库用户,并授予必要的权限。源端至少需要SELECT权限(以及对待同步表的查询权限),目标端则需要INSERT、UPDATE、DELETE等写入权限。
如果应用场景需要同步DDL操作(如CREATE TABLE、ALTER TABLE等),需要在源库执行DDL辅助脚本。DMDRS支持触发器方式和系统表方式两种配置,单库或DSC场景推荐使用触发器方式。
一对一单向同步是DMDRS最基础也是最常用的同步模式——将源数据库的数据通过DMDRS单向同步到目标数据库,广泛应用于实时备份、报表服务和双业务中心等场景。
一对一单向同步的部署通常包含以下步骤:
drs.xml(或exec.xml)配置文件,填写源库、目标库及同步参数在一对一单向同步的配置中,有几个参数需要特别关注:
mgr_port :Manager管理模块的监听端口号,用于DMDRS服务的客户端连接和模块间通信。
siteid :服务站点号,必须保证全局唯一。DMDRS需要根据siteid在数据库中创建辅助表来记录同步状态,如果不同链路的siteid重复,会造成数据复制的混乱。一个DMDRS服务对应一个siteid,在多链路场景下尤其需要注意规划。
login :配置源数据库和目标数据库的连接信息,包括IP、端口、用户名、密码等。
group :表分组信息。可以将不同表配置到不同的分组中,每个分组可以使用独立的优化参数。分组id=0的为默认分组。
send :配置日志解析后发送到哪个目标DMDRS服务,以及过滤和映射规则。
在实际同步中,性能瓶颈往往出现在目标端的入库阶段。通过合理配置目标端的分组参数,可以显著提升同步效率。
exec_policy :控制事务能否拆分并发执行。当设置为0时,允许事务以表为单位进行拆分,然后多线程并发执行,从而大幅提升入库吞吐量。
无主键/唯一索引表的处理:如果同步的表不存在主键或唯一索引,UPDATE和DELETE操作的性能可能相对较差。针对这种情况,可以采取以下两种策略:
在同步过程中,可能出现两类错误:一是数据不一致(如UPDATE的行在目标端不存在),二是执行顺序错误(如INSERT之前UPDATE就先执行了)。DMDRS提供了三种错误处理策略:
error_policy(0) :报错并保存出错的操作,DMDRS服务主动core。需要人工分析出错原因、修复数据后再恢复同步error_policy(1) :报错并保存出错的操作,然后跳过该操作继续同步。后续可以根据操作信息手动修复或使用对比工具进行修复error_policy(2) :智能错误合并。如果有主键/唯一索引,采用错误合并方式重新执行且不报错——INSERT违反唯一约束时转换为UPDATE,UPDATE更新不到行时转换为INSERT,DELETE不到行时忽略DMDRS的一个核心能力是支持动态装载——在同步过程中允许装载或重装表,而无需停止源端DMDRS服务。
源端DMDRS的日志解析是基于表字典的——只有存在字典的表才会被解析并同步到目标端。装载表的时候,会同时添加表字典信息。
源端DMDRS的装载和日志解析是相对独立的两个功能。一旦源端DMDRS处于start状态(即正在解析日志),只要添加了表字典,就能立即解析到该表的操作并发送至目标端。
在配置装载任务时,可以通过装载掩码(Load Mask)来控制装载行为:
GROUP :对于规模较大的表,使用group掩码将表按照ROWID范围进行分组,多线程并行装载同一张表,显著提升装载性能。
FLASHBACK :如果源端表存在业务访问,使用加S锁的方式装载可能无法成功,此时可以使用闪回方式进行装载,避免阻塞业务。
FAST :使用快速装载功能,目标端DMDRS采用DPI的FLDR系列接口或OCI的DIRPATH系列接口进行入库,大幅提升装载速度。
ROWID :使用ROWID映射功能,需要在目标端进行相应配置。
装载开始时,源端会通知目标端DMDRS。如果在装载期间收到了装载表的增量操作,目标端会先将其缓存起来而不入库,等到装载完成后再恢复入库。表在装载期间及装载之前产生的日志操作,在目标端入库前会进行过滤筛选,从而保证最终数据的一致性。
这种设计使得全量装载和增量同步可以无缝衔接,在业务不中断的前提下完成数据的完整同步。
一般情况下,DMDRS的同步性能瓶颈在目标端DMDRS的入库阶段。DMDRS提供了THR命令来查看目标端工作线程的状态。
通过分析工作线程状态,可以定位入库性能瓶颈所在。
如果发现某个线程长时间处于执行状态可以这样检查:
基于工作线程状态的分析结果,可以从以下几个方向进行调优:
DMDRS作为达梦数据库官方配套的数据复制工具,通过基于日志的结构化数据复制技术和模块化的架构设计,实现了对源库几乎无侵入的高效数据同步。从原理上看,它遵循“日志捕获 → 消息传输 → 目标执行”的基本链路;从部署上看,它支持一对一、双向、一对多、多对一、级联、环形等多种拓扑结构;从调优上看,它提供了分组并发、错误策略、装载掩码等一系列精细化控制手段。
无论是在线迁移、实时备份、读写分离,还是多业务中心的数据分发,DMDRS都能提供一套可靠且高效的解决方案。理解其工作原理和关键参数,是保障数据同步链路稳定运行的基础。
https://eco.dameng.com
文章
阅读量
获赞
