暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【干货攻略】DMHS路由功能体验

达梦E学 2021-07-23
914



近期遇到用户四台机器,两两相通,不存在三台之间互相联通的情况,并且数据只能在首尾节点进行同步,中间两个节点只作为转发器的作用,由此引申本次利用DMHS去同步两台达梦数据库之间的数据需求。

 ✦ 一、DMHS介绍及相关操作 ✦ 

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.hsAsiteid1,它向C投递包含siteid1的日志,C再向D投递siteid1的日志,最后DB投递siteid1的日志并执行,反之亦然,从下面的Cdmhs.hs片段配置中看recv指的是转发路由自身接收数据使用的端口,所以Admhs.hsSEND发送的端口应该就是这里Crecv的端口,55665565(下面端口颜色对应相同颜色)
          A
            <send>
            <ip>192.168.216.138</ip>
            <mgr_port>5566</mgr_port>
            <data_port>5565</data_port>
            另外1指的是把siteid=1也就是A的数据投递到D上,所以下方SEND中的端口应该是Drecv端口,55665565
            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上执行,所以D1下方SEND中的端口号应该就是B上的exec模块的端口53455346。
              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
                  1ABCD正常安装DMHS;
                  2CDconsole执行:
                  connect
                  start recv
                  3ABconsole执行:
                  connect
                  start exec
                  clear exec lsn
                  copy 0 "sch.name is not null" dict
                  start cpt
                  好,以上是本次分享内容,希望能给大家带来帮助。
                  PS:本文经原作者同意后在本平台分享,版权属于原作者所有,如需转载请与原作者联系。



                   
                   

                  往期回顾

                  干货 |  Python封装达梦数据库操作

                  总结 |  2021年达梦技术干货攻略总结,请查收!

                  开班DCM开班在即,8月份速成达梦认证大师

                  重磅 | 这个数据库再获市场占有率第一


                   >>>>>>>>>>>> THE END <<<<<<<<<<<<

                  内容丨王辉
                  编辑丨三横一竖
                  校对丨林夕
                  文章转载自达梦E学,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论