DB2-Q复制(Q Replication)简叙及安装使用

7 篇文章 0 订阅

DB2:Q Replication Q复制

它通过读取源数据库的日志记录来捕获数据变化,并将数据变化以数据库事务为单位通过 MQ 消息队列发送到目标服务器,最后在目标服务器将事务还原出来并提交至目标数据库。应用在数据库大压力逻辑复制场景、主备复制等场景。
Q 复制是 IBM 于 2004 年起推出的一种高性能的数据库间异步数据复制技术,主要支持 DB2 数据库,也支持 Oracle 数据库。这个特性DB2 AESE许可可以开启。

Q Replication

介绍

DB2 有两种在表与表之间复制数据的技术:SQL 复制和 Q 复制。他们各有其适合的应用领域及特点。
1.SQL 复制是其中发展比较成熟的一种技术,再加上它不需要其它软件的配合,可以支持不同类型的数据库与 DB2 之间的数据同步,因此适用的范围比较广。
2.与之相比,Q 复制在性能上优势比较明显, Q 复制的数据传输技术借助于 IBM 队列机制,从而提高了数据的传输效率和可靠性,可以达到每秒复制几千个表、几十万行数据 , 在几千英里的距离下端到端的延迟不到 1 秒(从源端 DB2 commit 到目标端 DB2 commit )。

Q复制
Q复制是一种高吞吐量、低延迟的复制方法。Q复制具有以下几个优点:
1、低延迟:一旦提交了对源表进行的修改,并从日志中读取到这些修改,这些变化就立即发送出去。
2、高吞吐量:Q Capture程序始终可以跟踪在源表发生的快速变化,并且Q Apply程序使用多线程,使得它能够及时跟踪通信通道中的消息。可以配置多个asnqcap(多个schema),多个asnqapply(多个schema,每个asnqapply也有多个agent并行跑,asnqapply能够保证tranx在多个agent并行跑时的order)。
3、低网络流量:消息使用一种压缩格式在队列中传送,而且在发送数据的选项中允许选择传送最少量的数据。
4、异步性:消息队列使得Q Apply程序可以不连接源数据库或者源子系统就可以接收事务,理论上对生产没有性能影响。如果Q Capture程序或者Q Apply程序停止,需要进行处理的消息在程序准备好之后,将仍然存在于队列中。由于compact message消息是永久存储在队列里,所以源表和目标表即使在系统或设备故障的情况下仍可以保持同步。

总体上来说,可以把 DB2 复制服务系统分为以下四个组件:

1.DB2 复制中心 (Replication Center)。
2.Q Capture 程序:Q Capture 程序将读取恢复日志以获取已更改的源数据,并将更改写入 IBM® MQ 队列。对于经典复制源服务器,经典捕获组件将读取更改,并将这些更改写入 MQ 队列。
3.Q Apply 程序:Q Apply 程序从队列中检索捕获的更改并将这些更改写入目标。
4.WebSphere MQ消息队列。

参考:SQL Replication

DB2 远程 SQL 复制就是通过 Capture 程序提取出对数据源表的修改 , 并把它保存在 CD 表中 , 再由 Apply 程序读取这些修改,进而应用到目标数据表以完成数据复制。
总体上来说,可以把 DB2 复制服务系统分为以下四个组件:

DB2 复制中心 (Replication Center)
Capture 程序(有时需要 triggers)
Apply 程序
监视器程序

SQL Replication

复制类型

Unidirectional单向

在单向复制中,对源进行的更改将复制到目标。目标表通常由只读应用程序独占使用。您可以从源复制所有行和列,也可以选择复制列和行的子集。不会执行从目标到源的复制。

您可以将一个源复制到一个目标,将一个源复制到多个目标,也可以将多个源复制到一个目标或将多个源复制到多个目标。对于每个源及其对应目标,都存在一个 Q 预订。如果 Q 预订的目标在逻辑上相关,那么这些 Q 预订应该使用同一个复制队列映射;通过以这种方式来组合 Q 预订,可以确保应用到目标的数据与源服务器上的原始事务一致。

在每个源服务器上,您应至少创建一组 Q Capture 控制表。在每个目标服务器上,您应至少创建一组 Q Apply 控制表。

对于单向复制中的 Q 预订,您可以让 Q Apply 程序调用一个存储过程并将源数据以输入参数的形式传递至该存储过程。源列映射至存储过程中的参数,而不是映射至目标列。通过将源列直接映射至存储过程中的参数,您将不必解析入局数据,并且具有一个简单明了的编程模型。Q Apply 程序对每个行操作调用一个存储过程,而不是将行插入表中。该存储过程负责使源数据到达其最终目标。

单向复制

Bidirectional双向

在双向复制中,复制在两个服务器上的表之间进行。一个服务器上涉及复制的表在结构上与另一个服务器上的相应表完全相同。两个相应表具有相同的列数、相同的列名和兼容的数据类型,不过它们可以具有不同的模式和名称。您可以选择复制列的子集。对任一服务器上的表进行的更改会复制到另一个服务器上的相应表中。

在一个服务器上的应用程序对某个表进行更改的同时,另一个服务器上的应用程序也可以对相应表进行更改。如果在相应表之间复制的数据中发生冲突,那么您可以选择这两个表中的哪个表优先。可以通过将旧值与当前值进行比较来发现冲突。此检测方法也许并不能发现数据中的所有冲突,但它需要的开销相对于其他方法来说较少。

对于每对相应表,都存在两个 Q 预订。例如,如果您正在服务器 Red 上的 Table_One 和服务器 Blue 上的 Table_Two 之间复制,那么存在以下两个 Q 预订:
一个从 Table_One 复制到 Table_Two 的 Q 预订
一个从 Table_Two 复制到 Table_One 的 Q 预订
创建 Q 预订时,如果希望自动执行初始装入,那么可以选择哪个表包含您要开始装入的数据。在此示例中,如果指定 Table_One 包含您要开始装入的数据,那么 Table_Two 将从 Table_One 装入这些数据。
两个服务器上都运行了一个 Q Capture 程序和一个 Q Apply 程序。每个服务器上的 Q Capture 程序和 Q Apply 程序都具有匹配的模式。例如:
如果一个服务器上的 Q Capture 程序的模式是 Green,那么该服务器上的 Q Apply 程序的模式也是 Green。
如果另一个服务器上的 Q Capture 程序的模式是 Yellow,那么该服务器上的 Q Apply 程序的模式也是 Yellow。
两节点的双向

Peer-to-peer点对点或者对等

在对等复制中,复制在两个或更多服务器上的表之间进行。一个服务器上涉及复制的表在结构上与其他服务器上的相应表完全相同。所有相应表具有相同的列数、相同的列名和兼容的数据类型,不过它们可以具有不同的模式和名称。您可以选择复制列的子集。对任何服务器上的表进行的更改会复制到其他服务器上的相应表中。

在一个服务器上的应用程序对某个表进行更改的同时,其他服务器上的应用程序也可以对相应表进行更改。将借助于版本列和创建 Q 预订时添加到表的触发器来检测并解决冲突。可以通过对等复制进行汇合,这意味着如果对被复制表的更改已停止并且传播了所有更改,那么相应表将完全相同。

对于每对相应表,都存在两个 Q 预订。例如,如果您正在服务器 Red 上的 Table_One、服务器 Blue 上的 Table_Two 和服务器 Green 上的 Table_Three 之间复制,那么存在三对相应表:
Table_One 和 Table_Two
Table_Two 和 Table_Three
Table_One 和 Table_Three
对于这些对中的每一对,都存在两个 Q 预订。例如,在 Table_One 和 Table_Two 之间,存在以下两个 Q 预订:
一个从 Table_One 复制到 Table_Two 的 Q 预订
一个从 Table_Two 复制到 Table_One 的 Q 预订
每个服务器上都运行了一个 Q Capture 程序和一个 Q Apply 程序。每个服务器上的 Q Capture 程序和 Q Apply 程序都具有匹配的模式。例如,如果您正在两个服务器之间复制:
如果一个服务器上的 Q Capture 程序的模式是 Blue,那么同一个服务器上的 Q Apply 程序的模式也是 Blue。
如果另一个服务器上的 Q Capture 程序的模式是 Red,那么同一个服务器上的 Q Apply 程序的模式也是 Red。
下图显示一个数据表在两节点中对等复制
两节点的点对点
下图显示一个数据表在三节点中对等复制
三节点的点对点

Event publishing事件发布

事件发布捕获对源表所作的更改并将已落实的事务性数据转换为 XML 格式或定界格式的消息。每条消息可以包含整个事务,也可以仅包含一个行级别更改。这些消息放置在 IBM® MQ 消息队列中,由消息代理或其他应用程序读取。可以发布源表中列和行的子集,以便只发布所需要的数据。

您可以将事件发布用于各种需要已发布的数据的目的,包括填充中央信息代理和 Web 应用程序以及根据对源表的更新、插入或删除情况来触发操作。
事件发布环境

使用场景

通过 Q 复制技术实现 DB2 数据库系统的高可用性和双活。

传统1对1数据复制场景
传统1对1数据复制

1对n数据复制场景
1对n场景

active/active双活场景
active/active场景

配置

Q 复制配置可以使用命令行asnclp相关系列,或者db2rc复制中心图形界面

注意

1.机器之间时间必须同步,生产环境配置时钟同步服务;
2.建议操作系统版本、DB2数据库版本、MQ版本等保持一致;
3.建议db2数据库用户、MQ用户名称标识等保持一致;

软件版本

基于DB2 11.1,以及MQ 9.0。

机器信息

源数据库		source	192.168.0.11	
目标数据库	target	192.168.0.12
操作机		opr		192.168.1.22

MQ配置

建议source及target用户组及用户一致,便于后期管理维护

groupadd -g 1003 mqm
useradd -m -d /home/mqm -g mqm -u 1003 mqm

源端MQ配置

1、在source建立SRC_QM队列管理器以及内部MQ对象

crtmqm SRC_QM

strmqm SRC_QM


2、准备MQ对象定义文本mqsc_srcqm.ini

vi mqsc_srcqm.ini
DEFINE QLOCAL ('ADMINQ') DEFPSIST(YES)

DEFINE QLOCAL ('RESTARTQ') DEFPSIST(YES)

DEFINE QLOCAL('TGT_QM') USAGE(XMITQ) DEFPSIST(YES)

DEFINE QREMOTE('SENDQ') RNAME('RECVQ') RQMNAME('TGT_QM') XMITQ('TGT_QM') DEFPSIST(YES)

DEFINE QMODEL('IBMQREP.SPILL.MODELQ') DEFSOPT(SHARED) MAXDEPTH(500000) MSG
DLVSQ(FIFO) DEFTYPE(PERMDYN) MAXMSGL(4914304)

REFRESH SECURITY

DEFINE CHL('SRC_QM.TO.TGT_QM') CHLTYPE(SDR) TRPTYPE(TCP) CONNAME ('192.168.0.12(14002)') XMITQ('TGT_QM') DISCINT(0)

DEFINE CHL('TGT_QM.TO.SRC_QM') CHLTYPE(RCVR) TRPTYPE(TCP)

START CHANNEL(SRC_QM.TO.TGT_QM)


DEFINE LISTENER(SRC_QM_LSN) TRPTYPE(TCP) PORT(14001) CONTROL(QMGR) 

START LISTENER(SRC_QM_LSN) 

3、执行MQ对象定义文本

runmqsc < "mqsc_srcqm.ini" > "mqsc_srcqm.out"

target端MQ配置

1、在target建立TGT_QM队列管理器

crtmqm TGT_QM
strmqm TGT_QM

2、准备MQ对象定义文本mqsc_tgtqm.ini

vi mqsc_tgtqm.ini

DEFINE QLOCAL('RECVQ') DEFPSIST(YES)

DEFINE QLOCAL('SRC_QM') USAGE(XMITQ) DEFPSIST(YES)

DEFINE QREMOTE('ADMINQ') RNAME('ADMINQ') RQMNAME('SRC_QM') XMITQ('SRC_QM') DEFPSIST(YES)

DEFINE QMODEL('IBMQREP.SPILL.MODELQ') DEFSOPT(SHARED) MAXDEPTH(500000) MSG
DLVSQ(FIFO) DEFTYPE(PERMDYN) MAXMSGL(4914304)

REFRESH SECURITY

DEFINE CHL ('TGT_QM.TO.SRC_QM') CHLTYPE(SDR) TRPTYPE(TCP) CONNAME('192.168.0.11(14001)') XMITQ('SRC_QM') DISCINT(0)

DEFINE CHL ('SRC_QM.TO.TGT_QM') CHLTYPE(RCVR) TRPTYPE(TCP)

DEFINE LISTENER(TGT_QM_LSN) TRPTYPE(TCP) PORT(14002) CONTROL(QMGR) 

START LISTENER(TGT_QM_LSN) 

3、执行MQ对象定义文本

runmqsc < "mqsc_tgtqm.ini" > "mqsc_tgtqm.out"

可选:ASNCLP自动创建MQ定义脚本

由于 ASNCLP 命令行程序可自动生成使用 CREATE MQ SCRIPT 命令创建的缺省 WebSphere MQ 对象定义文件,包括创建QM、QUEUE、CHANNEL等对象定义。此功能是V9.7 FP4 中的新增内容。
1、先准备好asnclp定义文件asn_create_mq_object.asn,如下

vi asn_create_mq_object.asn
##################################################
ASNCLP SESSION SET TO Q REPLICATION;
#CREATE MQ SCRIPT RUN NOW
CREATE MQ SCRIPT
CONFIG TYPE U
MQSERVER 1 NAME SOURCE MQHOST "192.168.0.11" MQPORT "14001" QMANAGER "SRC_QM",
MQSERVER 2 NAME TARGET MQHOST "192.168.0.12"  MQPORT "14002" QMANAGER "TGT_QM";
QUIT;
##################################################

2、在source或者target执行

asnclp -f asn_create_mq_object.asn

3、在目录中会产生如下文件,包括sorce及target上MQ定义文件

qrepl.source.mq_windows.bat
qrepl.source.mq_aixlinux.sh
qrepl.target.mq_windows.bat
qrepl.target.mq_aixlinux.sh
qreplmsg.log

4、在sorce下执行qrepl.source.mq_aixlinux.sh文件
注意:建议先检查下文件内容

sh qrepl.source.mq_aixlinux.sh

5、在target下执行qrepl.target.mq_aixlinux.sh文件
注意:建议先检查下文件内容

sh qrepl.target.mq_aixlinux.sh

MQ状态及消息测试

1、source及target 上检查runmqlsr是否启动

ps -ef |grep runmqlsr 

2、source及target 上检查通道是否启动

echo "dis chs(*) " |runmqsc SRC_QM
echo "dis chs(*) " |runmqsc TGT_QM

3、如果没有启动,手动启动通道后,再用dis chs命令重新检查通道状态

echo "start chl(SRC_QM.TO.TGT_QM) " |runmqsc SRC_QM
echo "start chl(TGT_QM.TO.SRC_QM) " |runmqsc TGT_QM

4、如果依然没有启动,尝试重启队列管理器后,再手动启动通道试下

endmqm SRC_QM
endmqm TGT_QM
strmqm SRC_QM
strmqm TGT_QM
echo "start chl(SRC_QM.TO.TGT_QM) " |runmqsc SRC_QM
echo "start chl(TGT_QM.TO.SRC_QM) " |runmqsc TGT_QM 

5、尝试发送测试消息验证连接
尝试往SRC_QM队列放消息,能从TGT_QM队列读取

/opt/mqm/samp/bin/amqsput SENDQ SRC_QM
/opt/mqm/samp/bin/amqsget RECVQ TGT_QM

尝试往TGT_QM队列放消息,能从SRC_QM队列读取

/opt/mqm/samp/bin/amqsput ADMINQ TGT_QM
/opt/mqm/samp/bin/amqsget ADMINQ SRC_QM

DB2配置

准备数据库

注意:
1.需要source及target实例用户加入到mqm组;
2.需要为DB2添加包含Q-复制功能的license,AESE的license包含Q-复制的license,其他license需要添加Q-复制的license;
3.注意数据库的codepage一致;

数据库编目

1、在source建立源数据库

db2 "create db sample"

2、在target建立目标数据库

db2 "create db sample"

3、在source上catalog数据库,包括本地source及远端target

db2 "catalog tcpip node source1 remote 192.168.0.11 server 50000"
db2 "catalog database sample as ssample1 at node source1"
db2 "catalog tcpip node target1 remote 192.168.0.12 server 50001"
db2 "catalog database sample as tsample1 at node target1"

4、在target上catalog数据库,包括本地target以及远端source

db2 "catalog tcpip node source1 remote 192.168.0.11 server 50000"
db2 "catalog database sample as ssample1 at node source1"
db2 "catalog tcpip node target1 remote 192.168.0.12 server 50001"
db2 "catalog database sample as tsample1 at node target1"

5、在能使用db2rc 复制中心工具图形界面的操作机上catalog数据库,包括远端target以及远端source

db2 "catalog tcpip node source1 remote 192.168.0.11 server 50000"
db2 "catalog database sample as ssample1 at node source1"
db2 "catalog tcpip node target1 remote 192.168.0.12 server 50001"
db2 "catalog database sample as tsample1 at node target1"

注意:此步可选择,如果target以及source可以使用db2rc图形界面,就不需要单独操作机。理论上生产环境如果是AIX/Linux,建议单独配置一台window操作机或图形界面机器。

开启归档日志

1、source上开启归档日志并重启数据库

db2 update db cfg for sample using LOGARCHMETH1 disk:/data/db2inst1/arch/
db2stop
db2start
db2 backup db source 

2、target上开启归档日志并重启数据库

db2 update db cfg for sample get using LOGARCHMETH1 disk:DISK:/data/db2inst2/arch/
db2stop
db2start
db2 backup db target 
准备测试表

sorce及target上准备测试表,包括主键
注意:建议复制表都有主键

db2 "create table qrep.employee(id int NOT NULL, FAMILYNAME char(20), GIVENNAME char(20), PRIMARY KEY (ID))"

准备Q复制

生成密码文件

1、在target生成密码文件

asnpwd init using "/home/db2inst1/asncnf/asnpwd.aut"
asnpwd add alias ssample1 id db2inst1 password password using "/home/db2inst1/asncnf/asnpwd.aut"
asnpwd add alias tsample1 id db2inst1 password password using "/home/db2inst1/asncnf/asnpwd.aut"

2、在source生成密码文件

asnpwd init using "/home/db2inst2/asncnf/asnpwd.aut"
asnpwd add alias ssample1 id db2inst2 password password using "/home/db2inst2/asncnf/asnpwd.aut"
asnpwd add alias tsample1 id db2inst2 password password using "/home/db2inst2/asncnf/asnpwd.aut"
生成Q复制控制表

使用asnclp命令生成Q复制控制表的定义文件
1、准备asnclp定义文件

vi asn_create_control_table
##################################################
ASNCLP SESSION SET TO Q REPLICATION;
SET SERVER CAPTURE TO DBALIAS ssample1 ID db2inst1 PASSWORD "password";
SET SERVER TARGET  TO DBALIAS tsample1 ID db2inst2 PASSWORD "password";
SET RUN SCRIPT NOW STOP ON SQL ERROR ON;
CREATE CONTROL TABLES FOR CAPTURE SERVER USING PWDFILE "/home/db2inst1/asncnf/asnpwd.aut";
CREATE CONTROL TABLES FOR APPLY SERVER USING PWDFILE "/home/db2inst1/asncnf/asnpwd.aut";
QUIT;
##################################################

2、执行asnclp定义文件

asnclp -f asn_create_control_table 

3、source及target检查控制表

db2 connect to ssample1 
db2 list tables for all | grep -i ibmq
db2 list tables for all | grep -i ibmq | wc -l

db2 connect to tsample1 
db2 list tables for all | grep -i ibmq
db2 list tables for all | grep -i ibmq | wc -l

单向Q复制

将source中qrep.employee表事务,复制到target中同名表。
1、准备asnclp复制定义的文件

vi asn_create_qrepmap_qsub 
##################################################
ASNCLP SESSION SET TO Q REPLICATION;
SET SERVER CAPTURE TO DBALIAS ssample1 ID db2inst1 PASSWORD "password";
SET SERVER TARGET  TO DBALIAS tsample1 ID db2inst2 PASSWORD "password";
SET RUN SCRIPT NOW STOP ON SQL ERROR ON;
CREATE REPLQMAP SOURCE_ASN_TO_TARGET_ASN;
CREATE QSUB USING REPLQMAP TSSAMPLE1_ASN_TO_SSAMPLE1_ASN(SUBNAME EMPLOYEE0001 QREP.EMPLOYEE OPTIONS HAS LOAD PHASE I exist TARGET NAME QREP.EMPLOYEE LOAD TYPE 2);
QUIT;
##################################################

2、执行asnclp定义文件

asnclp -f asn_create_qrepmap_qsub  

3、查看qrepmap以及sub定义,执行asnclp命令,在交互命令行输入如下命令

ASNCLP SESSION SET TO Q REPLICATION
SET SERVER CAPTURE TO DBALIAS lsample1 ID db2inst1 PASSWORD "password"
SET SERVER TARGET  TO DBALIAS tsample1 ID db2inst2 PASSWORD "password"
list qsub for qcapture schema asn

4、在asnclp交互命令行中,启动QSUB

START QSUB SUBNAME EMPLOYEE0001 

5、source启动capture
第一次启动使用如下命令:

asncap CAPTURE_SERVER=SSAMPLE1 CAPTURE_SCHEMA=ASN CAPTURE_PATH="/data/db2inst1/asncnf" startmode=COLD

以后启动时用以下方式:

asncap CAPTURE_SERVER=TSAMPLE1 CAPTURE_SCHEMA=ASN CAPTURE_PATH="/home/db2inst1/asncnf" startmode=WARMSI

停止capture

asnccmd CAPTURE_SERVER=SSAMPLE1 CAPTURE_SCHEMA=ASN CAPTURE_PATH="/home/db2inst1/asncnf" STOP

查看状态

asnccmd CAPTURE_SERVER=SSAMPLE1  CAPTURE_SCHEMA="ASN" status show details

6、target启动apply

asnapply APPLY_SERVER=TSAMPLE1 APPLY_SCHEMA="ASN" APPLY_PATH="/data/db2inst2/asncnf"

停止apply

asnapply APPLY_SERVER=TSAMPLE1 APPLY_SCHEMA="ASN" APPLY_PATH="/data/db2inst2/asncnf" STOP

查看状态

asnqacmd APPLY_SERVER=TSAMPLE1  APPLY_SCHEMA="ASN" status show details
测试

插入数据检查数据是否复制到对端

检查sorce及target端条数

db2 "select count(*) from qrep.employee"

source插入数据

db2 "insert into qrep.employee values(5,'a','aa'),(6,'b','bb')";
db2 commit;

检查sorce及target端条数

db2 "select count(*) from qrep.employee"

附加资源

工具:Q Replication Dashborad管理
IBM InfoSphere Data Replication Dashboard
https://www.ibm.com/support/pages/ibm-infosphere-data-replication-dashboard
IBM InfoSphere Data Replication Dashboard

知识中心:InfoSphere Data Replication-Q Replication
https://www.ibm.com/docs/zh/idr/11.4.0?topic=q-replication-sql-replication

知识中心:DB2 9.7-Q Replication
https://www.ibm.com/docs/en/db2/9.7?topic=SSEPGG_9.7.0/com.ibm.swg.im.iis.repl.qrepl.doc/topics/iiyrqcncqreplsetup.html

  • 22
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值