1、实现原理:
DMHS(达梦数据实时同步软件)的基础实现原理主要涉及源端数据库、目标端数据库、源端DMHS服务以及目标端DMHS服务之间的交互和操作。具体来说,DMHS通过以下模块实现数据的实时同步:
源端DMHS服务:主要由装载模块(LOAD)、日志捕获分析模块(CPT)以及管理服务模块(MGR)组成。其中,CPT模块采用优化的日志扫描算法,快速捕获分析增量日志数据,并将分析完成后的日志数据转换为内部的消息格式,然后通过网络将消息发送至目标端DMHS服务。
目标端DMHS服务:由执行模块(EXEC)和管理服务模块(MGR)组成。当接收到源端的日志消息后,DMHS服务对消息进行处理,通过多线程并行执行的方式将同步数据应用至目标端数据库,实现数据实时同步。
管理模块(MGR):作为DMHS同步服务的启动框架,根据配置文件加载并启动相关的功能模块。
2、搭建DMHS的第一步要先开启归档和逻辑日志:
我们可以在达梦数据库的bin路径下/home/dmdba/dm/dmdbms/bin找到dm.ini的配置文件,修改其中的归档文件和逻辑日志,默认0是关闭状态,1是开启:
select owner, table_name from dba_tables where owner = 'SYSDBA' and table_name like 'DMHS%' and status = 'VALID';
若查询结果如下,则说明创建成功:
select owner, trigger_name from dba_triggers where owner = 'SYSDBA' and trigger_name like 'DMHS%' and status = 'Y';
若查询结果如下,则说明创建成功:
6、上述步骤完成后,我们就可以安装DMHS了,安装的时候我们需要注意以下地方,配错后可能会找不到对应的依赖:
7、安装完成后我们需要配置对应的配置文件,修改配置dmhs.hs文件,我们需要明白每个参数的意义,如下:
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base>
<lang>ch</lang>
<mgr_port>5345</mgr_port> #管理端口,取值范围在 1000~ 65535
<ckpt_interval>60</ckpt_interval> #检查点间隔,取值范围在 10~ 65535, 默认值 60
<siteid>1</siteid> #NET 模块投递数据时,数据来源的站点号
</base>
<cpt>
<db_type>dm7</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> #连接目标端数据库时使用的 SSL 链路安全库路径
<db_ssl_pwd></db_ssl_pwd> #连接源端数据库时使用的 SSL 链路的加密口令
<parse_thr>1</parse_thr> #日志分析线程数,取值范围在 1-16,默认值 1
<ddl_mask>op:obj</ddl_mask> <!--DDL配置项-->
<arch><!--归档清理配置项-->
<clear_interval>600</clear_interval> #归档日志清理间隔,取值范围在 60-65535,单位秒
<clear_flag>2</clear_flag> #归档日志清理选项,选配 0(不操作)、1(删除)、2(移走),默认 0
<bak_dir>/dmarch/arch_bak</bak_dir>
</arch>
<send><!-- 发送模块配置 -->
<ip>192.168.1.109</ip> #对端ip
<mgr_port>5345</mgr_port>
<data_port>5346</data_port> #需在投递到下一级的备用 DMHS NET 模块监听端口
<trigger>1</trigger><!-- 是否忽略触发器,默认为0,限定值0,1 -->
<constraint>1</constraint><!-- 是否忽略约束,默认为0,限定值0,1 -->
<identity>1</identity> #指示下一级数据入库时,自增列处理方式,0(启用)或 1(忽略),默认值为 1
<net_turns>0</net_turns> #是否启用网闸模式,0(禁用)或 1(启用)
<filter><!--过滤配置项-->
<enable><!-- 白名单,所有允许同步的表 -->
<item>SYSDBA.*</item>
</enable>
</filter>
<map><!--映射配置项-->
<item>SYSDBA.*==DMHS.*</item>
</map>
</send>
</cpt>
</dmhs>
配置要求:
1)siteid全局唯一,即DMHS同步系统涉及的所有节点的siteid必须全局唯一,不允许有重复值;
2)DDL配置项,如果不需要DDL同步,那么就配置为空,即<ddl_mask></ddl_mask>,相应地DMHS DDL触发器和辅助表也不需要创建;
3)归档清理配置项,clear_flag为1表示清除,即DMHS将同步完成的归档文件删除;为2,表示将同步完成的归档移到bak_dir目录下;为0,表示不作任何操作;
4)过滤配置项,本示例配置了白名单,即enable,也可以配置黑名单,详见DMHS用户手册。其过滤的规则是:先判断白名单,然后判断黑名单。如果存在重叠的情况,那么也是会被过滤的;
5)映射配置项,表示存在不同模式之间的表同步,例如本示例中源端的SYSDBA模式下的表映射成目的端的DMHS模式下同名的表。
8、如果是单项同步,则目的端配置文件则无发送模块(send),配置如下:
<?xml version="1.0" encoding="GB2312"?>
<dmhs>
<base>
<lang>ch</lang>
<mgr_port>5345</mgr_port>
<chk_interval>2</chk_interval> #检查时间,单位秒
<ckpt_interval>45</ckpt_interval> #检查点间隔,取值范围在 10~ 65535, 默认值 60
<siteid>2</siteid> #NET 模块投递数据时,数据来源的站点号
</base>
<recv>
<data_port>5346</data_port> #备用 DMHS NET 模块监听端口
<exec>
<check_index>0</check_index> #是否允许自动创建索引,可选 0(禁用)或 1(启用),默认值 1
<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_name></db_name>
<exec_mode>1</exec_mode>
<exec_thr>16</exec_thr> #EXEC 模块用来数据入库的工作线程数,取值范围在 1-1024,默认值为 4
<exec_sql>512</exec_sql> #EXEC 模块缓存事务 SQL 语句的内存大小,取值范围在 32-40960,单位 M,默 认值 512
<exec_trx>5000</exec_trx> #允许缓存事务的个数,取值范围在 1000-10000,默认值 5000
<exec_rows>250</exec_rows> #数据入库时允许的最大批量行数,取值范围在 1-2000,默认值 1000
<exec_policy>2</exec_policy>
<msg_col_size>8000</msg_col_size> #事务入库出错时的执行策略,可选 0、1 或 2,默认为 1
<level>0</level> #级联等级,取值为 0 或 3 或 65535,默认为 0
<affect_row>0</affect_row> #是否启用影响行数检查,可选 0(禁用)/1(启用),默认值 1
<tag> #自定义对象修改标识功能,该参数是一个功能标签,需要配置它的子项
<schema></schema> #针对性的关注某个模式下的表的变动,指定关注的模式名
<sql></sql> #自定义的更新 SQL 语句 可根据情况自行定义,如无可删除此tag
<before_commit>0</before_commit>
</tag>
</exec>
</recv>
</dmhs>
9、配置完成后,启动DMHS服务,初始装载是将源端数据库中的初始数据装载到目的端数据库,使DMHS同步的时刻源和目的端的同步表数据一致:
开启目的端服务:./dmhs_serverd start
start目的端服务:
./dmhs_serverd start
./dmhs_console
DMHS >connect
DMHS >start exec
开启源端DMHS服务:./dmhs_serverd start
初始装载:
./dmhs_serverd start
./dmhs_console
DMHS >connect
DMHS >start cpt
DMHS >COPY 0 "SCH.NAME IS NOT NULL" DICT|LSN
DMHS >copy 0 "sch.name='SYSDBA'" DICT|LSN|CREATE|INSERT|INDEX(当数据量非常大时可以选择模式同步)
exit
在dmhs目录下有对应的log日志,可进入查询log日志
10、装载完成后,则可以开启同步:
源端执行:
./dmhs_console
DMHS >start