DMHS原理
达梦数据实时同步软件 DMHS 是达梦推出的新一代支持异构环境的高性能、高可 靠和高可扩展的数据库实时同步系统。
优点
- 高可扩展性:根据需求灵活配置(一对一、一对多、多对一、多对多),满足用户的各种复杂数据同步需求。
- 高可用性:采用基于日志的结构化数据同步技术,实时数据同步不依赖主机上 源数据库的触发器或者规则,对主机源数据库系统几乎无影响。主机故障时,可快速切换至备机,及时接管业务。
- 实时同步:并行处理,能够及时读取源库日志,以较低的资 源占用实现大批量的数据实时同步。
- 高可靠性:以源数据库的事务为单位,保障备机数据库与主机数据库的事务级完整性和一致性。
DMHS组成
DMHS三大主要模块:日志分析(CPT)、数据入库(EXEC)和消息发 送(NET)。这三个模块统一由管理模块(MGR)进行调度执行。
- CPT
对源数据库日志进行解析,提取数据的变化如插入(INSERT)、 删除(DELETE)、修改(UPDATE)和对像操作(DDL)等信息,包装后投递给消 息发送(NET)模块。 - NET
• NET 消息发送子模块:对CPT投递的信息进行分发,分发前可以对操作进行过滤,或者对表进行过滤和映射,还可以对消息中的列进行映射(如改名、剔除和函数计算)。经过处理的消息通过网络(TCP/IP)发送给下一级NET,或保存在本地。
• NET 消息接收子模块:通过网络传输的消息, NET 消息接收子模块通 过网络(TCP/IP)接收并发送给 EXEC 模块。上一级NET模块保存在本地的文件,NET 消息接收子模块读取本 地文件并发送给 EXEC 模块,或通过 FTP 服务器下载数据,并发送给 EXEC 模块。 - EXEC
EXEC 模块接收到 NET 接受子模块发来的消息,把这些消息按事务分类,如果某个事 务上收到了提交消息则构造相应的 SQL,使用 ODBC 驱动接口对这些数据进行入库;如 果某个事务在源端回滚,则直接丢弃不执行。
- 捕获器:数据实时同步系统中负责读取、解析源端数据库管理系统的归档日志,并发送解析后的 数据。捕获器将源端数据库日志读取解析后发送出去,它必须与源端数据库在同一台机器上。 捕获器由 MGR 模块、CPT 模块、NET 发送子模块组成,NET 发送子模块不能单独存在,必须由 CPT 模块调用。
- 执行器: 执行端是数据实时同步服务系统中数据入库(目标端数据库)的执行端。执行器将接收到的数据入库执行,它可以与目标端数据库处于不同机器。执行器由 MGR 模块、EXEC 模块、NET 接收子模块组成,NET 接收子模块不能单独存在,必须由 EXEC 模块调用。
- 路由器:数据实时同步系统中负责传输数据在网络中的路由。 路由器一般配置在第三台机器上,对捕获器中 CPT 模块和执行器中的 EXEC 模块进行 映射,从而实现跨网关同步。路由器由 MGR 模块、NET 接收子模块、NET 发送子模块组成,NET 接收子模块和 NET 发送子模块由 MGR 模块调度,从而实现路由功能。
- 转发器:数据实时同步系统中负责传输数据的过滤及转发。
调度管理MGR
MGR根据配置文件加载启动捕获器功能、执行器功能、 转发器功能或路由功能。当 MGR 启动捕获器功能时,MGR 会调度 CPT 模块和 NET 模块 (发送子模块);当启动执行器功能时,会调度 NET 模块(接收子模块)和 EXEC 模块; 当启动转发器或路由器功能时,会调度 NET 模块(接收子模块和发送子模块)。
配置参数解析:dmhs.hs(bin目录下配置),启用相关模块就解析相关配置
CPT
CPT 模块在启动时,会利用 NET 模块,向对端发送获取起始 LSN 的命令。CPT 模块找 到起始 LSN 对应的交易日志位置,从该位置开始读取交易日志进行分析。起始 LSN 表示该 LSN 之前的所有事务都已经同步到目标端。随着 DMHS 同步的进行,起始 LSN 会向后推移。
CPT 模块在抽取增量数据时,并不能根据交易日志,还原源端数据库的 SQL 操作,但 可以实现源端数据库 SQL 操作的同等操作。对于 DML 操作,CPT 模块以数据行为单位, 对交易日志进行解析;对于 DDL,CPT 模块以单个 DDL 动作为单位,对交易日志进行解析。
离线字典是 CPT 模块进行交易日志分析的基础,也是实现离线分析的基础,当一个表 的离线字典不存在时,源数据库中该表的所有操作都会被过滤掉。
NET
NET 模块是各个功能模块之间连接通信、信息交换与传输的工具,包括以下功能:
- 表操作的过滤:同步过程中,NET 模块会根据配置,对同步的数据进行判断,如 果不满足黑名单条件且满足白名单条件,则将消息发送到目标端,否则,直接丢弃。
- 列值转换及过滤:同步过程中,当需要对表数据进行转换,NET 模块会根据原始 数据,计算转换后的数据,并对消息数据重新填充;当需要对表中特定数据进行过滤/筛选 时,NET 模块会对原始数据进行判断,是否需要进行传输。
- 消息的本地存储:NET 模块可将接收到的 DMHS 消息进行本地存储,本功能在网 络环境不稳定的环境中,可最大限度的保证增量数据不丢失。
- 消息的本地读取:NET 模块可从本地存储中读取 DMHS 消息,发送到目标端。
- 消息的 FTP 远程读取:NET 模块可从远程 FTP 服务器中读取 DMHS 消息,发送到 目标端。
- 消息的发送及接收:DMHS 各站点之间数据的传递都是使用 NET 模块完成的。
EXEC
DMHS在数据同步时,源端不同数据库的交易日志经过 CPT 的解析,封装成统一的数 据格式,经过 NET 模块一级级的投递,最后投递到 EXEC 模块进行入库处理,当 EXEC 模 块把接收到的事务入库以后,该事务的同步流程才算正式完成。EXEC 模块通过 NET 的 RECV 模块接收到源端的数据以后,需要对接收到的数据提取进行事务归类,归类过程中还 会涉及到大事务的缓存,部分回滚的处理,ORP 操作的转换,组织大对像数据等复杂的处 理 。 在明确事务收到提交操作以后,再把提交的事务交由执行线程进行入库处理。
为了保证事务的完整性,EXEC 模块在入库事务时默认的情况下不会拆分事务,造成执 行线程之间会出现执行顺序上的依赖关系。当同步环境对事务的完整性没有严格要求时,便 可以启用事务分裂功能(trx_split 参数配置为 1),把一个事务按表拆分成 N 个小事务。执 行线程在入库时,会收集相同表操作的小事务并合并成大事务后再执行,这样不同执行线程 之间操作的表互不影响,可以有效的提升执行线程入库的并行度,达到提升同步性能的目的。 只是在这种同步模式下,目标端数据库中的数据在单个时间节点上和源端数据表的数据分布 是不同的,待所有事务同步完成以后,两边数据库的数据最终会保持一致。
DMHS故障排查
-
CPT模块或EXEC模块启动失败时,检查是否将数据库bin目录添加到LD_LIBRARY_PATH环境变量中
-
源端执行start cpt时无法获取LSN:
a. 检查源端和目的端网络是否连通。
b. 检查dmhs.hs中send配置的目的端ip或端口是否错误。
c. 目的端是否执行start exec,EXEC模块是否成功加载。 -
LSN定位失败,一般是源端数据库的归档文件被误删造成的,执行端 DMHS_TRXID_TABLE 中 TID 为 0 的记录中 SEQID 的值修改为源端对应归档文件的最小 LSN,重启目标端和源端的 DMHS,同 步会从源端第一个归档开始重新同步。
-
CPT 启动无响应 出现这种问题的可能性有很多,下面几种最常见:
a. 目标端中存在大量待执行的事务,需要等它们执行完。
b. 目标端的 DMHS_TRXID_TABLE 中存在大量的记录。
c. 源端数据库存在大量的归档文件,CPT 启动会收集这些归档。
d. 源端的归档或在线单个日志文件过大,CPT 定位时会扫描定位到的日志文件。
e. 归档文件不连续,当出现某个归档文 件丢失的情况下,CPT 在定位 LSN 或是解析日志过程中就会被阻塞。 -
同步阻塞时:
a. 检查是否是事务阻塞,查询相应的锁等待信息确认该问题。
b. 检查EXEC模块线程状态,判断入库效率是否低下,具体分析造成效率低下的原因。 -
DDL 未同步时,检查源端是否执行了创建触发器的脚本,首先要检查源端数据库的辅助表 DMHS_DDL_SQL 是否记录了事件触发器捕获到的 DDL SQL,如果没有,则可能是数据库 层面禁用了事件触发器。
-
RLOG_APPEND_LOGIC是静态参数,源端开启修改日志,修改参数后需要重启数据库服务。未重启会卡在加载模块那一步