1、DMHS架构
达梦的DMHS和Oracle的OGG原理相似,都是由CPT模块从数据库的日志中捕获变化,然后进行压缩后SEND模块发送到目的端,再在目的端EXEC模块执行相同操作的一个过程实现数据的同步,目前DMHS不仅支持达梦数据库之间的同步,也能支持常用的几个通用数据库的数据同步。
2、项目架构:
A段和B段的DMHS正常配置CPT和EXEC,C和D段的DMHS配置route模块;A的SEND 配置C,C的SEND配置A和D,D的SEND配置C和B,B的SEND配置D。
3、dmhs.hs配置:
A-192.168.216.137
<?xml version="1.0" encoding="GB2312"?><dmhs>
<base>
<lang>en</lang>
<mgr_port>5345</mgr_port>
<ckpt_interval>60</ckpt_interval>
<siteid>1</siteid>
<version>2.0</version>
</base>
<exec>
<recv>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
</recv>
<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>
<exec_thr>4</exec_thr>
<exec_sql>1024</exec_sql>
<affect_row>0</affect_row>
<enable_rowid>0</enable_rowid>
<exec_trx>5000</exec_trx>
<exec_rows>1000</exec_rows>
<case_sensitive>1</case_sensitive>
<toggle_case>0</toggle_case>
<exec_policy>0</exec_policy>
</exec>
<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>
<idle_time>10</idle_time>
<ddl_mask>op:obj:rec</ddl_mask>
<arch>
<clear_interval>600</clear_interval>
<clear_flag>0</clear_flag>
</arch>
<send>
<ip>192.168.216.138</ip>
<mgr_port>5566</mgr_port>
<data_port>5565</data_port>
<net_pack_size>256</net_pack_size>
<net_turns>0</net_turns>
<crc_check>0</crc_check>
<trigger>0</trigger>
<constraint>0</constraint>
<identity>0</identity>
<filter>
<enable>
<item>*.*</item>
</enable>
<disable/>
</filter>
<map>
<item>*.* == *.*</item>
</map>
</send>
</cpt>
</dmhs>
C-192.168.216.138
<?xml version="1.0" encoding="GB2312"?><dmhs>
<base><!-- 管理模块的基本配置 -->
<lang>ch</lang><!-- 语言选项,ch为中文,en为英文 -->
<version>2.0</version>
<mgr_port>5345</mgr_port><!-- 管理端口号,默认为5345,最小值1000,最大值65535 -->
<chk_interval>2</chk_interval><!-- 状态轮询间隔,默认为3s,最小值1s,最大值60s -->
<siteid>2</siteid><!-- 站点ID,这个ID配置时要注意,全局唯一,最小值0,最大值65535 -->
</base>
<route><!-- 消息路由可以实现N==>1==>N的功能,主要是用来跨网关,路由是不会对消息进行拆解的,实现的是消息实现源和目的的映射关系 -->
<recv>
<mgr_port>5566</mgr_port>
<data_port>5565</data_port>
</recv>
<send><!-- 发送模块配置 -->
<siteid>1</siteid><!-- 这个站点号跟源端的站点号要一致 -->
<ip>192.168.216.139</ip><!-- 目的端IP,默认127.0.0.1 -->
<mgr_port>5566</mgr_port><!-- 目的端管理端口,默认为5345,最小值1000,最大值65535 -->
<data_port>5565</data_port><!-- 目的端数据接收端口号,默认为5346,最小值1000,最大值65535 -->
</send>
<send><!-- 发送模块配置 -->
<siteid>4</siteid><!-- 这个站点号跟源端的站点号要一致 -->
<ip>192.168.216.137</ip><!-- 目的端IP,默认127.0.0.1 -->
<mgr_port>5345</mgr_port><!-- 目的端管理端口,默认为5345,最小值1000,最大值65535 -->
<data_port>5346</data_port><!-- 目的端数据接收端口号,默认为5346,最小值1000,最大值65535 -->
</send>
</route>
</dmhs>
D-192.168.216.139
<?xml version="1.0" encoding="GB2312"?><dmhs>
<base><!-- 管理模块的基本配置 -->
<lang>ch</lang><!-- 语言选项,ch为中文,en为英文 -->
<version>2.0</version>
<mgr_port>5345</mgr_port><!-- 管理端口号,默认为5345,最小值1000,最大值65535 -->
<chk_interval>2</chk_interval><!-- 状态轮询间隔,默认为3s,最小值1s,最大值60s -->
<siteid>3</siteid><!-- 站点ID,这个ID配置时要注意,全局唯一,最小值0,最大值65535 -->
</base>
<route><!-- 消息路由可以实现N==>1==>N的功能,主要是用来跨网关,路由是不会对消息进行拆解的,实现的是消息实现源和目的的映射关系 -->
<recv>
<mgr_port>5566</mgr_port>
<data_port>5565</data_port>
</recv>
<send><!-- 发送模块配置 -->
<siteid>1</siteid><!-- 这个站点号跟源端的站点号要一致 -->
<ip>192.168.216.140</ip><!-- 目的端IP,默认127.0.0.1 -->
<mgr_port>5345</mgr_port><!-- 目的端管理端口,默认为5345,最小值1000,最大值65535 -->
<data_port>5346</data_port><!-- 目的端数据接收端口号,默认为5346,最小值1000,最大值65535 -->
</send>
<send><!-- 发送模块配置 -->
<siteid>4</siteid><!-- 这个站点号跟源端的站点号要一致 -->
<ip>192.168.216.138</ip><!-- 目的端IP,默认127.0.0.1 -->
<mgr_port>5566</mgr_port><!-- 目的端管理端口,默认为5345,最小值1000,最大值65535 -->
<data_port>5565</data_port><!-- 目的端数据接收端口号,默认为5346,最小值1000,最大值65535 -->
</send>
</route>
</dmhs>
B-192.168.216.140
<?xml version="1.0" encoding="GB2312"?><dmhs>
<base>
<lang>en</lang>
<mgr_port>5345</mgr_port>
<ckpt_interval>60</ckpt_interval>
<siteid>4</siteid>
<version>2.0</version>
</base>
<exec>
<recv>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
</recv>
<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>
<exec_thr>4</exec_thr>
<exec_sql>1024</exec_sql>
<affect_row>0</affect_row>
<enable_rowid>0</enable_rowid>
<exec_trx>5000</exec_trx>
<exec_rows>1000</exec_rows>
<case_sensitive>1</case_sensitive>
<toggle_case>0</toggle_case>
<exec_policy>0</exec_policy>
</exec>
<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>
<idle_time>10</idle_time>
<ddl_mask>op:obj:rec</ddl_mask>
<arch>
<clear_interval>600</clear_interval>
<clear_flag>0</clear_flag>
</arch>
<send>
<ip>192.168.216.139</ip>
<mgr_port>5566</mgr_port>
<data_port>5565</data_port>
<net_pack_size>256</net_pack_size>
<net_turns>0</net_turns>
<crc_check>0</crc_check>
<trigger>0</trigger>
<constraint>0</constraint>
<identity>0</identity>
<filter>
<enable>
<item>*.*</item>
</enable>
<disable/>
</filter>
<map>
<item>*.* == *.*</item>
</map>
</send>
</cpt>
</dmhs>
说明:
上述dmhs.hs中A的siteid是1,它向C投递包含siteid为1的日志,C再向D投递siteid为1的日志,最后D向B投递siteid为1的日志并执行,反之亦然,从下面的C的dmhs.hs片段配置中看recv指的是转发路由自身接收数据使用的端口,所以A的dmhs.hs中SEND发送的端口应该就是这里C的recv的端口,5566和5565。(下面端口颜色对应相同颜色)
A
<send> <ip>192.168.216.138</ip>
<mgr_port>5566</mgr_port>
<data_port>5565</data_port>
另外1指的是把siteid=1也就是A的数据投递到D上,所以下方SEND中的端口应该是D的recv端口,5566和5565。
C
<recv><mgr_port>5566</mgr_port>
<data_port>5565</data_port>
</recv>
<send><!-- 发送模块配置 -->
<siteid>1</siteid><!-- 这个站点号跟源端的站点号要一致 -->
<ip>192.168.216.139</ip><!-- 目的端IP,默认127.0.0.1 -->
<mgr_port>5566</mgr_port><!-- 目的端管理端口,默认为5345,最小值1000,最大值65535 -->
<data_port>5565</data_port><!-- 目的端数据接收端口号,默认为5346,最小值1000,最大值65535 -->
</send>
D再把siteid=1的数据投递到B上执行,所以D上1下方SEND中的端口号应该就是B上的exec模块的端口5345和5346。
D
<recv><mgr_port>5566</mgr_port>
<data_port>5565</data_port>
</recv>
<send><!-- 发送模块配置 -->
<siteid>1</siteid><!-- 这个站点号跟源端的站点号要一致 -->
<ip>192.168.216.140</ip><!-- 目的端IP,默认127.0.0.1 -->
<mgr_port>5345</mgr_port><!-- 目的端管理端口,默认为5345,最小值1000,最大值65535 -->
<data_port>5346</data_port><!-- 目的端数据接收端口号,默认为5346,最小值1000,最大值65535 -->
</send>
B
<exec><recv>
<mgr_port>5345</mgr_port>
<data_port>5346</data_port>
</recv>
反向SITEID=4的时候一样的原理。
二、启动DMHS
启动每个节点的dmhs_server
1、ABCD正常安装DMHS;
2、CD的console执行:
connect
start recv
3、AB的console执行:
connect
start exec
clear exec lsn
copy 0 "sch.name is not null" dict
start cpt