DMHS双向同步

 本次模拟DMHS同一进程双向同步部署验证及同步测试。

1.环境准备

1.1软件及系统版本

    数据库: V7 安全 05117834104-20220901-168542-20012
    DMHS: V4.3.12-Build(2023.06.07-132175trunc)_64_2306_sp1
    DMHS源端系统: NKylin V6.0 2.6.32-220.el6.x86_64
    DMHS目的端系统: 银河麒麟V10 4.19.90-24.4.v2101.ky10.x86_64

1.2 源端主机+目的端主机

    IP      数据库      端口
    源端主机:172.26.8.211 5236
    目的主机:172.26.8.89 5236

1.3系统配置及数据库部署

    注意操作系统需调整关闭防火墙及关闭自启、关闭SELINUX、创建数据库用户及组、开启CORE功能、文件最大打开数、IO调度算法、环境变量、数据库部署及初始化实例等,DM云适配中心有很多详细案例,这里不做过多赘述。

2. 源端数据库配置

2.1 开启源端归档

ALTER DATABASE MOUNT;
ALTER DATABASE ADD ARCHIVELOG /dbdata/xha2/dmarch,TYPE=local,FILE_SIZE=256,SPACE_LIMIT= 4096';
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

1.jpg

2.2 开启逻辑日志

SQL> SELECT PARA_VALUE FROM SYS.V$DM_INI WHERE PARA_NAME = 'RLOG_APPEND_LOGIC';
行号     PARA_VALUE
---------- ----------
1          0
SQL> select * from v$dm_ini where para_name like '%RLOG_APPEND_LOGIC';
行号     PARA_NAME         PARA_VALUE MIN_VALUE MAX_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION                                 PARA_TYPE
---------- ----------------- ---------- --------- --------- ------- ---------- ---------- ------------------------------------------- ---------
1          RLOG_APPEND_LOGIC  0          0         2         N       1          1          Whether to write logic records in redo logs SYS
    注意:逻辑日志参数PARA_TYPE列如果是SYS类型,可通过系统函数动态修改,如果是IN FILE类型需修改配置文件后重启数据库服务,这里我们可以动态修改。
SQL> call sp_set_para_value(1,'RLOG_APPEND_LOGIC',1);
DMSQL 过程已成功完成
已用时间: 22.649(毫秒). 执行号:11.
SQL> select * from v$dm_ini where para_name like '%RLOG_APPEND_LOGIC';
行号     PARA_NAME         PARA_VALUE MIN_VALUE MAX_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION                                 PARA_TYPE
---------- ----------------- ---------- --------- --------- ------- ---------- ---------- ------------------------------------------- ---------
1          RLOG_APPEND_LOGIC 1          0         2         N       1          1          Whether to write logic records in redo logs SYS
    注意:分别开启两侧数据库逻辑日志;此处列举一个;

2.3 检查在线日志

SQL> SELECT PATH FROM SYS.V$RLOGFILE;
行号     PATH
---------- -------------------------------------
1          /dbdata/xha2/data/DAMENG/DAMENG01.log
2          /dbdata/xha2/data/DAMENG/DAMENG02.log
已用时间: 1.262(毫秒). 执行号:13.
    注意:分别检测两侧数据库在线日志;此处列举一个;

2.4 源端、目的端DMHS部署

[dmdba@NKylinV6/opt]$./V4.3.12_dm7_132175trunc_kylin3.0_64_veri_20230607_sp3.bin -i

2.jpg

3 .配置目标和源端及启动DMHS

3.1 修改dmhs_serverd

    修目标端DMHS启动脚本:
[dmdba@8-rwc89-node1]$vim dmhs_serverd

prog=dmhs_server_b2a2
prog_old=dmhs_server_b2a2
export DMHS_HOME=/dbdata/xhb2/dmhs_sx_b2toa2
prog_path=$DMHS_HOME
path=/dbdata/xhb2/dmhs_sx_b2toa2/dmhs.hs

    修改源端DMHS启动脚本:
[dmdba@NKylin V6 /dbdata/xha2/dmhs_sx_a2tob2]$ vim dmhs_serverd

dmhs_serverd
prog=dmhs_server_a2b2
prog_old=dmhs_server_a2b2
export DMHS_HOME=/dbdata/xha2/dmhs_sx_a2tob2
prog_path=$DMHS_HOME
path=/dbdata/xha2/dmhs_sx_a2tob2/dmhs.hs

3.2 编辑dmhs.hs配置文件

    修改目的端DMHS配置文件:
[dmdba@8-rwc89-node1 /dbdata/xhb2/dmhs_b2toa2]$vim dmhs.hs

<?xml version="1.0" encoding="GB2312"?>
<dmhs>
   <base>
        <lang>ch</lang>
        <mgr_port>7345</mgr_port>
        <chk_interval>3</chk_interval>
        <ckpt_interval>60</ckpt_interval>
        <siteid>18</siteid>
   </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>
        <idle_time>300</idle_time>
        <dict_dir>/dbdata/xhb2/dmhs_dict_b2toa2</dict_dir>
        <ddl_mask>obj:op</ddl_mask>
        <parse_thr>1</parse_thr>
        <parse_policy>8</parse_policy>
        <arch>
        <clear_interval>600</clear_interval>
              <clear_flag>0</clear_flag>
              <bak_dir></bak_dir>
        </arch>
        <send>
              <ip>172.26.8.211</ip>
              <mgr_port>8345</mgr_port>
              <data_port>8346</data_port>
              <trigger>1</trigger>
              <constraint>1</constraint>
              <identity>1</identity>
              <net_turns>0</net_turns>
              <filter>
                      <enable>
                              <item>DMDBA.T3_SX</item>
                              <item>DMDBA.T4_SX</item>
                         <item>SYSDBA.DMHS_TRXID_TABLE</item>
                      </enable>
                        <disable>
                        <item>SYSJOB.*</item>
                      </disable>
              </filter>
              <map>
                      <item></item>
              </map>
        </send>
      </cpt>
        <recv>
        <data_port>7346</data_port>
        <exec>
            <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_mode>0</exec_mode>
            <exec_thr>4</exec_thr>
            <exec_sql>1024</exec_sql>
            <exec_trx>5000</exec_trx>
            <exec_rows>250</exec_rows>
            <case_sensitive>1</case_sensitive>
            <toggle_case>0</toggle_case>
            <exec_policy>0</exec_policy>
            <COMMIT_policy>1</COMMIT_policy>
            <enable_merge>1</enable_merge>
        <level>65535</level>
        </exec>
    </recv>
</dmhs>

    修改源端DMHS文件:

<?xml version="1.0" encoding="GB2312"?>
<dmhs>
   <base>
        <lang>ch</lang>
        <mgr_port>8345</mgr_port>
        <chk_interval>3</chk_interval>
        <ckpt_interval>60</ckpt_interval>
	<siteid>16</siteid>
   </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> 
	<idle_time>300</idle_time>
	<dict_dir>/dbdata/xha2/dmhs_dict_a2tob2</dict_dir> 
	<ddl_mask>obj:op</ddl_mask> 
	<parse_thr>1</parse_thr> 
	<parse_policy>8</parse_policy>
	<arch>
        <clear_interval>600</clear_interval> 
	      <clear_flag>0</clear_flag> 
	      <bak_dir></bak_dir> 
	</arch>	
	<send> 
	      <ip>172.26.8.89</ip> 
	      <mgr_port>7345</mgr_port> 
	      <data_port>7346</data_port> 
	      <trigger>1</trigger>
	      <constraint>1</constraint>
	      <identity>1</identity>
	      <net_turns>0</net_turns>
	      <filter>
		      <enable>
			      <item>DMDBA.T3_SX</item>
			      <item>DMDBA.T4_SX</item>
			 <item>SYSDBA.DMHS_TRXID_TABLE</item>
		      </enable>
			<disable>
			<item>SYSJOB.*</item>
		      </disable>
	      </filter>
	      <map>
		      <item></item>
	      </map>
        </send>
      </cpt>
      <recv>
        <data_port>8346</data_port>
        <exec>
            <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_mode>0</exec_mode>
            <exec_thr>4</exec_thr>
            <exec_sql>1024</exec_sql>
            <exec_trx>5000</exec_trx>
            <exec_rows>250</exec_rows>
            <case_sensitive>1</case_sensitive>
            <toggle_case>0</toggle_case>
            <exec_policy>0</exec_policy>
            <COMMIT_policy>1</COMMIT_policy>
	<level>65535</level>
            <enable_merge>1</enable_merge>
        </exec>
    </recv>
</dmhs>

    注意:同一进程的双向同步,目的端和源里既要配置cpt模块,还要配置exec模块,配完请核对参数的正确性。新建字典存目录,如果数据库是HA架构的话,需将字典目录创建在存储分区上。

3.3 启动DMHS服务

    双向同步中,装载字典前,一定要先将两端的执行器启动,创建好执行端的辅助表后再装载字典。
    启动执行端服务,此处一定要用exec和cpt分别启动,不能用start命令,start命令后不跟cpt或exec会根据配置文件同时启动cpt和exec。

源端启动:
[dmdba@NKylin V6 /dbdata/xha2/dmhs_sx_a2tob2]$./dmhs_console 
DMHS console tool: V4.3.12-Build(2023.06.07-132175trunc)_64_2306_sp1
Copyright (c) 2020, DMHS. All rights reserved.
Type ? or "help" for help, type "quit" to quit console.
连接到DMHS:127.0.0.1:8345
执行成功
Dameng HS Server V4.3.12-Build(2023.06.07-132175trunc)_64_2306_sp1
DMHS> state
MGR: do not run any module 
执行成功
DMHS> start exec
执行成功
DMHS>

目的端启动:
[dmdba@8-rwc89-node1 /dbdata/xhb2/dmhs_sx_b2toa2]$./dmhs_console 
DMHS console tool: V4.3.12-Build(2023.06.07-132175trunc)_64_2306_sp1
Copyright (c) 2020, DMHS. All rights reserved.
Type ? or "help" for help, type "quit" to quit console.
连接到DMHS:127.0.0.1:7345
执行成功
Dameng HS Server V4.3.12-Build(2023.06.07-132175trunc)_64_2306_sp1
DMHS> state
MGR: do not run any module 
执行成功
DMHS> start exec
执行成功
DMHS>

3.4 装载字典

    如下举例测试环境里2表数据以源端基准起始数据COPY(也可能相关表从两侧当前数据开始双向同步,根据实际需求选择COPY方式)。
源端COPY操作:

DMHS>COPY 0 "SCH.NAME='DMDBA' AND TAB.NAME IN ('T3_SX','T4_SX')" DICT|LSN|TRUNCATE|INSERT|THREAD|2|REG
CSL[WARN]: 检测到TRUNCATE掩码,该掩码会清空目标表数据(多对一架构时含其他站点数据)!请确认是否继续?(Y/N)
Y
CSL[WARN]: 检测到LSN掩码,该掩码会忽略日志中小于当前LSN的所有操作,请确认是否继续?(Y/N)
Y
copy mask is : |TRUNCATE|INSERT|THREAD|TABLE|DICT|REG|LSN|PARTITION|OBJID|REP
执行完成,请查看执行模块日志,检查数据装载是否成功
DMHS>

目的端操作:

DMHS> COPY 0 "SCH.NAME='DMDBA' AND TAB.NAME IN ('T3_SX','T4_SX')" DICT|LSN|THREAD|2
CSL[WARN]: 检测到LSN掩码,该掩码会忽略日志中小于当前LSN的所有操作,请确认是否继续?(Y/N)
Y
copy mask is : |THREAD|DICT|LSN|PARTITION|REP
Y
执行完成,请查看执行模块日志,检查数据装载是否成功
DMHS>

    注意:数据表的COPY是需在一侧进行,另一侧只是进行同步表字典同步;而且DMHS源端和目的端辅助表不做相关操作,DMHS内部机制全局共用自动同步。在搭建了双向同步或是成环的同步环境中装载数据,必须使用REG掩码。在对端事务表中登记装载的事务,否则数据会回流回来。具体解释见DMHS手册。

3.5 启动CPT模块

&ensp;&ensp;&ensp;&ensp;分别启动两侧CPT模块, xha2侧:
[dmdba@NKylin V6 /dbdata/xha2/dmhs_sx_a2tob2]$./dmhs_console
DMHS> start cpt
执行成功
DMHS> state
MGR: Capture Execute 
TYPE    VID SITEID EXEC/CPT IP PORT DBNAME 
------- --- ------ ----------- ---- ------ 
Capture 0   16     172.26.8.89 7345        
Execute 0   18     172.26.8.89 7345        
执行成功
DMHS>
DMHS日志显示:

&ensp;&ensp;&ensp;&ensp;分别启动两侧CPT模块, xhb2侧:
[dmdba@8-rwc89-node1 /dbdata/xhb2/dmhs_sx_b2toa2]$./dmhs_console
DMHS> start cpt
执行成功
DMHS> state
MGR: Capture Execute 
TYPE    VID SITEID EXEC/CPT IP  PORT DBNAME 
------- --- ------ ------------ ---- ------ 
Capture 0   18     172.26.8.211 8345        
Execute 0   16     172.26.8.211 8345        
执行成功

    如下为正常运行后两侧的DMHS日志:

3.jpg

3.6 DMHS_TRXID_TABLE辅助表和LEVEL参数

    DMHS_TRXID_TABLE为DMHS目的端辅助表,该表记录了源端事务日志中的事务入库信息,单向同步的时候只存在执行端目的端,双向的时候两侧都存在该表,参数详细解见DMHS手册。
    双向同步中事务过滤要如何理解,如双向同步中,数据库 A 的增量数据会同步到数据库 B,数据库 B 的增量操作会同步到数据库 A。为避免同一个事务在数据库 A、B 上重复执行,进入死循环状态,DMHS 必须对接收到的增量数据进行判断,对未执行过的事务,执行模块将增量数据入库;对已经执行过的事务,执行模块将增量数据丢弃。DMHS根据数据操作类型的不同,使用不同的方法判断事务是否已经执行。如果增量数据为 DML 操作,DMHS 在数据入库时,会对该事务打个标记,当此事务传回源端 DMHS时,DMHS 会根据事务标记,过滤该事务。如果增量数据为 DDL 操作时,DMHS 在数据入库时,会对该 DDL 操作打个标记,当此DDL传回源端时,DMHS会根据DDL标记,过滤该事务。
    注意:双向同步不能过滤 DMHS_TRXID_TABLE 表的操作,否则事务会死循环。了解到双向不能过滤,要同步,是HS内部机制去处理。单向的时候不同步辅助表,辅助表只有在目的端有。
    Level为DMHS参数之一,含义:级联等级,取值为 0 或 65535,默认为 0。
说明:该参数配置在执行端,用于表示同步拓扑架构的级联等级。取值说明如下:
0:对于同步拓扑架构为单向或双向同步时,执行端配置该参数为 0。
65535:对于同步拓扑架构为三节点及以上环形结构,每一个执行端需配置该参数为65535。另外需要注意 siteid 配置不能大于等于 64。
    双向同步配置中,需注意,DMHS A及 DMHS B执行模块参数level手册建议配置为 0。实际环境也可以配置成65535,让DMHS自己判断并识别。

4. 双向同步验证

    1.双向在xha2侧进行增删改查均可同步到xhb2侧,具体如下图:
 

4.jpg


    2.双向在xhb2侧进行增删改查均可同步到xha2侧,具体如下图:
 

5.jpg


    3.两侧同时操作时,如同时插入相同数据时两侧HS日志提示违反表的唯一性约束,当前入库的同时对端的语句回流过来就会报错,如下图:
 

6.jpg


    4.双向同步系统中,切忌”应避免同时对2个源端数据库同一表同一行数据进行修改操作。”此种操作不会导致HS和数据库运行异常,只会导致2个源端的同一表的数据不一致;处理时要根据实际情况判断处理。因测试环境无法验证同时处理同一条数据,此处不做过多赘述。

5. 遇到问题及处理

问题1:
MGR[ERROR]: 库文件 libdmhs_exec.so 未找到, 出错: 0, libdmoci.so: cannot open shared object file: No such file or directory
MGR[ERROR]: 日志执行启动失败
处理:
    DMHS目的端启动执行模块报错,建议使用数据库同版本的libdmoci.so,不建议使用DMHS自带文件。
问题2:
MGR[ERROR]: lib libdmhs_exec.so can not found,error code0
MGR[ERROR]: log exec start fail
处理:
    ldd libdmhs_exec.so查看,libdmoci.so => not found,搜索只有DMHS相关路径下有libdmoci.so文件拷贝/lib64或配置DMHS环境变量lib库路径
export DMHS_HOME=/home/dmdba/dm/dmhs
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/dmdba/dm/dmhs/bin

问题3:
EXE[INFO]: 站点号:16, 表(DMDBA.T3_SX)起始LSN:44199025
EXE[ERROR]: SITEID:16 DMDBA.T3_SX(UPDATE):影响行数(0)与预期的行数(1)不一致!SEQID:44199678 TRXID:13489 OP_ID:25
EXE[ERROR]: SITEID:16 DMDBA.T3_SX(UPDATE) 同步失败,里面填充的行数为 1 SEQID:44199678 TRXID:13489 OP_ID:25
EXE[ERROR]: 保存出错的事务,SITEID:16 SEQID:44199678 TRXID:13489 OP_ID:25(DMDBA.T3_SX)
处理:
    双向A2或B2侧delete/update数据,对应侧的双向的hs日志会有如上提示;另一侧刷新checkpoint;分别下级级联侧也是正常刷新checkpoint检查点;经前台启用定位报错日志提示"表SYSDBA.DMHS_TRXID_TABLE的同步被过滤规则启用";了解到过滤规则现有版本把事务表过滤加进去了,临时绕过处理就是把辅助表加到白名单里,重启DMHS后就正常了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值