一、前言
近期遇到用户四台机器,两两相通,不存在三台之间互相联通的情况,并且数据只能在首尾节点进行同步,中间两个节点只作为转发器的作用,由此引申本次利用dmhs去同步两台达梦之间的数据需求。
架构:
二、具体架构步骤
2.1 首先介绍DMHS:
达梦的DMHS和oracl的OGG原理相似,都是由CPT模块从数据库的日志中捕获变化,然后进行压缩后SEND模块发送到目的端,再在目的端EXEC模块执行相同操作的一个过程实现数据的同步,目前DMHS不仅支持达梦之间的同步,也能支持常用的几个通用数据库的数据同步。
2.2 该项目具体的思路:
A段和B段的DMHS正常配置cpt和exec,C和D段的dmhs配置route模块;A的send 配置C,C的send 配置A和D,D的send配置C和B,B的send配置D,从而实现AB之间数据的双向同步,由CD进行消息的转发;
2.3 dmhs.hs配置(dmhs.hs为实现dmhs同步功能的具体模块参数配置文件)
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>2</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>2</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>
2.4 启动服务
启动每个节点的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
下面就可以愉快的测试在A上插入数据B上是否能接受到数据啦。
三、结语
DMHS作为强大的同步工具,支持一对一,一对多,多对一,单向,双向,线型,环形同步,日常中能满足我们几乎大部分的同步需求。