DB2数据库分区是DB2企业版DPF(DataPartitioningFeature)选件提供的,它主要用来为大规模数据处理、高并发数据访问提供支持。DB2数据库分区采用Share-nothing体系结构,数据库在一个非共享的环境中被分解为独立的分区,每个分区都具有自己的资源,例如内存,CPU和磁盘以及自己的数据、索引、配置文件和事务日志。数据库分区有时称为节点或数据库节点。如下图所示:
数据通过Hash算法均允地散列到不同的分区内,每个分区只负责处理自己的数据。当用户发出SQL操作后,被连接的分区被称为CoordinateNode,它负责处理用户的请求,并根据Partitionkey将用户的请求分解成多个子任务交由不同分区并行处理,最后将不同分区的执行结果经过汇总返回给用户,分区对应用来说是透明的。
在DB2中,数据库分区可以部署在集群或MPP环境下,也就是说数据库分区分布在不同的机器上;数据库分区也可以部署在同一台SMP机器上,在同一台机器上的分区我们称为逻辑分区。同时,我们还可以在集群或MPP环境下部署多个分区,在集群或MPP每一个节点上部署多个逻辑分区。
DB2数据库分区提供了强大的可扩展能力。由于采用Share-nothing体系结构,每个分区(节点)只处理它那一部分数据,分区之间尽可能独立,这就减少了节点间共享资源的争用,允许数据库有效地伸缩以支持更大的数据规模及更多的用户访问。DB2数据库分区提供scaleup(垂直扩展)及scaleout(水平扩展)能力。垂直扩展是通过增加机器的物理资源如cpu、磁盘、内存来实现的;水平扩展是通过增加物理机器来实现的,DB2中,最多可以支持1000个分区。在规划DB2数据库分区时,我们需要考虑是通过增加逻辑分区还是物理分区来实现扩展能力。如果一台物理机器上有多个CPU,其物理资源可以允许多个分区共享该资源,我们可以通过增加逻辑分区来实现扩展;如果一台物理机器上的物理资源不能满足应用需求,我们就需要通过增加机器,也就是物理分区来实现扩展能力。
DB2数据库分区还提供了强大的并行处理能力。首先,它提供了inter-partitionparallelism分区间的并行机制,通过hash算法将数据库请求分成多个任务在不同的分区上并行执行,同时,提供了intra-partitionparallelism分区内的并行机制,将任务分解成不同的子任务,在不同的CPU上并行执行,另外,我们还可以同时利用inter-partitionparallelism、intra-partitionparallelism来实现完全的并行处理能力。DB2数据库的查询操作、backup/restore/load等实用程序及I/O操作都可以通过上述的并行处理能力来显著提高其性能。如下图所示:
采用数据库分区,可以为您带来如下好处:
这是采用数据库分区最主要的原因之一。将一个大的数据库分成多个小的数据库可以提高查询的性能,因为每个数据库分区拥有自己的一小部分数据。假设您想扫描1亿条记录,对一个单一分区的数据库来讲,该扫描操作需要数据库管理器独立扫描一亿条记录,如果您将数据库系统做成50个分区,并将这1亿条记录平均分配到这50个分区上,那么每个数据库分区的数据库管理器将只扫描200万记录。
在DB2V8和以前版本,非分区数据库的最大的表取决于页面大小,4K页最大支持64GB,32K页最大支持512GB数据量。表和表空间大小限制是每个分区上的限制,因此将数据库分成N个分区可以将表的最大尺寸增加为单个分区表最大尺寸的N倍。内存也可能是个限制,特别是在32为操作系统环境,因为每个数据库分区管理并拥有自己的资源,因此通过数据库分区可以克服这个限制。
在高度活动的系统中,数据库日志的性能可能会限制系统的整体吞吐量。在分区数据库环境中,每个分区有自己一套日志。当大量插入、更新、删除操作时,多个数据库分区可以提高性能,因为日志是在每个数据库分区上是并行写的,且每个单一的分区需要记录的日志更少。
DB2随数据量或处理器和分区的增加,提供近线性的扩展能力,可是,数据库分区是否提供最多的益处依赖于处理的工作负荷、最大表的大小及其他因素。
设计数据库分区的基本原则是,尽量将大表分布在所有的分区上,提高并行处理能力;将小表放置在尽量少的分区上,一般是建议放在单一分区上;尽量减少分区间的通信。对于是否采用数据库分区,除了考虑上一节提到的分区的优势之外,我们也要根据分区设计原则来考虑:
InfoSphereBalancedWarehouse主要由以下几个模块组成:如下图:
FoundationModule:有时也称为administrationBCU。该模块主要包括编目分区、协调分区以及单分区表。系统必须要有1个FoundationModule。
DataModule:有时也称为dataBCU。该模块主要保存分区表数据。根据数据量,可以有1个或多个DataModule。
UserModule:如果系统有大量用户访问,我们可以考虑增加UserModule。
FailoverModule:用于满足HA的需求。
ApplicationModule:用于运行应用程序,比如说ETL应用就可以配置在ApplicationModule上。
本次配置环境包括一个administrationBCU和2个dataBCU,如下图所示:
/opt/IBM/db2/V9.1/instance/db2icrt-ubcufencbcuaixdb2setDB2COMM=tcpipdb2updatedbmconfigusingsvcenamexbcuaixdb2fm-iinstance_name-fno缺省的情况下,db2diag.log文件创建在~/sqllib/db2dump目录下,这个目录是NFS-mounted,我们一般建议要将db2diag.log文件放在非NFS-mounted目录下。在E7100实施中,我们建议将该文件放到外部的存储上。
AdministrationBCU:mkdir-p/db2path/bcuaix/NODE0000/SQL00001/db2dumpDataBCU1:mkdir-p/db2path/bcuaix/NODE0001/SQL00001/db2dumpDataBCU2:mkdir-p/db2path/bcuaix/NODE0009/SQL00001/db2dumpAdministrationBCU:ln-s/db2path/bcuaix/NODE0000/SQL00001/db2dump/db2path/bcuaix/db2dumpDataBCU1:ln-s/db2path/bcuaix/NODE0001/SQL00001/db2dump/db2path/bcuaix/db2dumpDataBCU2:ln-s/db2path/bcuaix/NODE0009/SQL00001/db2dump/db2path/bcuaix/db2dumpdb2updatedbmconfigusingdiagpath/db2path/bcuaix/db2dump定义数据库分区在数据库分区环境下,数据库被分为多个分区,分区之间彼此独立工作,实现并行操作。数据库分区可以是物理分区也可以是逻辑分区。在一台物理机器上部署的一个分区,我们称为物理分区,如果是在一台SMP机器上部署多个分区,这些分区我们称为逻辑分区。我们可以选择物理分区,也可以选择逻辑分区。通常,如果决定采用大的SMP机器,有更多的CPU、内存及硬盘,我们会采用逻辑分区;如果决定采用多台物理机器,我们会通过非共享的体系结构采用物理分区;如果决定采用多台SMP机器,我们则会采用物理分区和逻辑分区结合的方式。
在DB2数据库分区环境中,执行CREATEDATABASE语句所在的分区称为编目分区(catalogpartition)。编目分区保存系统编目表。编目分区只能创建在一个分区上。通常,在实际生产环境中,我们建议采用一个专用编目分区,这个分区只包含编目表,不包含用户数据。这对DB2的一些实用程序运行效率有较大的提高。比如说BACKUP和RESTORE命令,需要先在编目分区上运行,之后才能在其他分区上执行。由于编目分区上没有用户数据,因此它的备份和恢复就可以很快完成,并且可以最小程度地延迟对其他分区的(并行)操作的开始。
在DB2数据库分区环境中,应用程序连接的分区,我们称为协调分区(coordinatepartition)。它负责处理用户的请求,并根据Partitionkey将用户的请求分解成多个子任务交由不同分区并行处理,最后将不同分区的执行结果经过汇总返回给用户。任何一个数据库分区都可以是协调分区。在实际生产环境中,我们建议采用一个或几个专用协调分区。因为应用程序要通过一个或多个协调分区为用户连接转移大量的数据的话,那么就会消耗那些分区上的大部分CPU,并降慢了数据访问速度。如果让分区什么也不做,只是充当协调者(coordinator),就不会降低数据分区数据访问速度。
在InfoSphereBalancedWarehouseE7100的设计中,我们在administrationBCU中,分别为编目分区和协调分区分配了专用的分区,同时,根据数据库分区的基本原则,我们将系统中的小表创建在了一个单一分区上。用户的数据,我们创建在dataBCU上,同时,根据数据库分区的基本原则,我们将系统中的大表尽量地分布到dataBCU上的所有分区上。当用户数据增加后,我们可以通过增加更多的dataBCU来实现增量的方式扩展、提供均衡的性能。如下说明:
Databasepartition0(BPU0)包含:Catalogfunction(onlyonedatabasepartitionhasthedatabasecatalog)CoordinatorfunctionSingle-partitiondatafunctionQueryPatrollerserverandcontroltables(ifimplemented)LocatedontheadministrationBCUDatabasepartition1-n(BPU1-BPUn)包含:DatabasepartitionswithpartitioneddataLocatedonthedataBCUsDB2节点配置文件(db2nodes.cfg)用来定义数据库分区。在创建分区数据库之前,一定要先定义db2nodes.cfg文件。该文件放置在用户实例主目录下。系统中的每一个分区在该文件中都会有一项。
db2nodes.cfg文件的基本格式如下:
dbpartitionnumhostnamelogical-portnetnam其中:
dbpartitionnum数据库分区号唯一地定义数据库分区,可在0到999之间。数据库分区号必须以升序顺序排序。该顺序中可以有间隔。一旦指定了数据库分区号,就不能对其进行更改。否则,分布图(它指定数据分发方式)中的信息可能不正确。
hostname用作分区间通信的IP地址的主机名。
logical-port它指定该数据库分区的逻辑端口号。此号码与数据库管理器实例名一起用来标识etc/services文件中的TCP/IP服务名称条目。对于每个主机名,一个逻辑端口必须为0(零)。
netname指定用于FCM高速互联的主机名称。
下边是包括一个administrationBCU和2个dataBCU环境的db2nodes.cfg文件内容:
0adminbcu0010adminbcu001_fcm1databcu0010databcu001_fcm2databcu0011databcu001_fcm3databcu0012databcu001_fcm4databcu0013databcu001_fcm5databcu0014databcu001_fcm6databcu0015databcu001_fcm7databcu0016databcu001_fcm8databcu0017databcu001_fcm9databcu0020databcu002_fcm10databcu0021databcu002_fcm11databcu0022databcu002_fcm12databcu0023databcu002_fcm13databcu0024databcu002_fcm14databcu0025databcu002_fcm15databcu0026databcu002_fcm16databcu0027databcu002_fcm在分区号的分配上,我们建议,catalogpartition分区号分配为0,因为一个实例下只能有1个catalogpartition,分区号990-999分配给另外需要增加的coordinatorpartitions,分区号980-989分配给另外需要增加的单分区的表。
在DB2数据库分区环境中,分区之间需要通过DB2FastCommunication
Manager进行通信。在/etc/services文件中,需要为DB2FCM通信设置相应的通信端口。
xbcuaix50000/tcpxbcuaix_int50001/tcpDB2_bcuaix60000/tcpDB2_bcuaix_END60016/tcp创建数据库我们在administrationBCU上创建数据库testdb。
db2"createdatabasetestdbautomaticstoragenoon/db2path\pagesize16384autoconfigureapplynone"创建数据库分区组(databasepartitiongroups)数据库分区组是一个或多个数据库分区的集合。在DB2数据库分区环境中,数据库表空间创建在数据库分区组中。
在设计数据库分区组时,我们一般建议:
当我们创建一个数据库后,系统会缺省创建3个数据库分区组:
IBMCATGROUP:编目数据库分区组,用来存储系统编目表。它只包含一个数据库分区。
SYSCATSPACE表空间创建在这个分区组中。
在BCU设计中,IBMCATGROUP创建在0号数据库分区上。
IBMTEMPGROUP.:临时数据库分区组,tempspace1系统临时表空间创建在这个分区组中。它包含系统中的所有数据库分区。
IBMDEFAULTGROUP:缺省数据库分区组。用户表空间缺省创建在该分区组中。USERSPACE1表空间包含在IBMDEFAULTGROUP中。
在BCU设计中,建议不使用IBMDEFAULTGROUP,而是创建了2个新的数据库分区组:
PDPG:分布在dataBCU分区上的数据包含在此数据库分区组中。PDPG只包括dataBCU上的分区,但不包含administrationBCU上的分区。它适用于中等数据规模到大数据规模的表。
SDPG:该数据库分区只包含administrationBCU分区上的数据,它只包含一个数据库分区,即0号数据库分区。系统中的一些小表保存在此数据库分区组中,这些小表通常是一些维表(dimensiontables)或lookuptables。
CREATEDATABASEPARTITIONGROUPPDPGONDBPARTITIONNUMS(1to16)CREATEDATABASEPARTITIONGROUPSDPGONDBPARTITIONNUMS(0)创建bufferpools在本示例中,我们创建2个16K页的bufferpools:
CREATEBUFFERPOOLBP_16KALLDBPARTITIONNUMSSIZE53760PAGESIZE16K;CREATEBUFFERPOOLBPTMP_16KALLDBPARTITIONNUMSSIZE10752PAGESIZE16K;创建表空间在本次实例中,我们将创建如下表空间:
db2tmp---临时表空间
ts_pd_data_001---分区表数据空间
ts_pd_idx_001---索引表空间
ts_sd_small---单分区表空间。如图所示:
在dataBCU上创建如下表空间:
CREATETABLESPACEts_sd_small_001INDATABASEPARTITIONGROUPsdpgPAGESIZE16KMANAGEDBYDATABASEUSING(FILE‘/db2fs1p0/bcuaix/databasename/ts_sd_data_001’100G)EXTENTSIZE16PREFETCHSIZEAUTOMATICBUFFERPOOLBP_16KOVERHEAD5.75TRANSFERRATE0.4AUTORESIZEYESMAXSIZE200GNOFILESYSTEMCACHING;在创建分区数据库表空间时,我们经常会使用数据库分区表达式。它是由参数'$N(注意在$N之前有一个空格)来指定的,DB2会将$N替换成数据库分区组中已定义的分区号。
当创建数据库分区组时,每一个数据库分区组都会对应一个分区图(partitioningmap),它是一个包含4096个条目的数组,每个条目的值对应于数据库分区组中的某一个分区号。
分区键(partitioningkey)是由一个表上的一个列或者多个列组成,用于确定某一行特定数据分布在哪个分区上。分区键是在CREATETABLE语句来定义的。如果没有指定分区键,缺省的分区键是主键的第一列,如果没有这么一列,则选择有适合数据类型的第一列。
当向表中插入一条记录时,DB2将该记录的分区键值散列(hash)到分区图中的一个条目上,并根据该条目找到要使用的分区号。
在定义分区表时,分区键的定义对今后性能的影响非常大,因此,在选择上一定要慎重。通常,在选择分区键时,要遵从如下原则:
在DB2数据库分区环境下,数据在不同分区的分布会影响表的连接策略。分区数据库环境下表连接策略主要包括:
并置连接(Collocatedjoins)--采用该种连接方式,表的连接以本地方式在数据所在的数据库分区上进行,不会在分区之间传输数据,这是效率最高的表连接方式。在分区数据环境下,应尽量采用该种连接方式。
定向连接(Directedjoins)--采用该种连接方式,一个表中的数据会按照连接对中的另一个表的分区键值重新分发到其他分区上来完成表连接操作。它会在分区之间移动数据,对性能会有一定影响。当并置连接及未被采用,DB2优化器会选择定向连接方式。
广播连接(Broadcastjoins)--采用该种连接方式,一个表中的所有数据会广播到另外表所在的所有分区上来完成表连接操作。如果在分区之间广播的数据量较大,对性能影响也会很大。当并置连接及定向表连接未被采用,DB2优化器会选择广播连接方式。
在DB2数据库分区环境下,应尽量采用并置连接方式。要使用并置连接方式,被并置的表必须:
分区兼容性是在分区键中相应列的基本数据类型之间定义的。分区兼容的(partition-compatible)数据类型有一个特性,那就是对于两种不同类型的两个变量,假设变量有相同的值,则它们将通过相同的分区函数映射到相同的分区键索引。分区兼容性有以下特征:
另外,我们也经常使用复制的具体化查询表(replicatedMQT)来实现并置连接。我们往往会选择更新不多而又经常与大表进行连接的小表或中等大小的表来作为复制的具体化查询表。
下面是对复制表的一个示例定义:
createtablet1_repas(select*fromt1)datainitiallydeferred\refreshdeferredints_pd_data_001replicated下边的例子,我们在ts_pd_data_001表空间上创建一个LINEITEM表:
在DB2数据库分区环境中,ROLLFORWARDDATABASE等命令需要在编目分区上执行。我们可以通过LISTDATABASEDIRECTORY命令来确定编目分区。
db2LISTDATABASEDIRECTORY分区切换在DB2数据库分区环境中,我们可以通过设置DB2NODE环境变量或使用setclient命令进行分区间的切换。
exportDB2NODE=2db2terminateORdb2setclientconnect_dbpartitionnum2增加数据库分区db2startDBPARTITIONNUM4ADDDBPARTITIONNUMHOSTNAMEClydePORT4该命令会自动在db2nodes.cfg中增加新定义的分区信息,并在新的数据库分区上创建
TEMPSPACE1表空间。
我们也可以用如下命令增加数据库分区:
exportDB2NODE=4db2terminatedb2connecttotestdbdb2ADDDBPARTITIONNUM使用该命令时,必须事先修改db2nodes.cfg文件包含新定义的分区信息,并在新增加的数据库分区上执行该命令。
在删除数据库分区时,只有那些不包含数据的分区才可以被删除。因此,在删除分区时,必须要先执行DROPPARTITIONNUMVERIFY命令检查一下该分区是否可以被删除。如果某一个分区正在被使用,要先执行REDISTRIBUTEDATABASEPARTITIONGROUP命令将该分区上的数据分布到其他分区上。
exportDB2NODE=4db2TERMINATEdb2DROPDBPARTITIONNUMVERIFYSQL6034WNode"4"isnotbeingusedbyanydatabases.db2stopDROPDBPARTITIONNUM4如果数据库分区4上有数据,则执行下述命令:
在DB2分区环境下,很多操作都需要在各个分区上分别执行,如果每次都要到各个分区上单独执行,对用户来说非常繁琐。在DB2中,可以使用db2_all命令,它可以在指定的所有数据库分区服务器上运行该命令。
db2_all"db2UPDATEDBCFGFORTESTDBUSINGLOGRETAINON"db2_all";db2UPDATEDBCFGFORTESTDBUSINGLOGRETAINON"db2_all"db2CONNECTTOtestdb;db2LISTTABLESPACESSHOWDETAIL"rah命令它指定在所有计算机上运行该命令。
如果想为多台物理机器创建一个目录,那么可以发出下面的命令:
rah")mkdir/tmp/$USER“数据库备份要备份分区数据库,您必须要首先在编目分区上调用备份实用程序,然后在其他数据库分区上调用备份实用程序。
db2_all"<<+0 db2BACKUPDATABASEtestdbONDBPARTITIONNUMS(1,2)\TABLESPACE(USERSPACE1)ONLINEUSETSMOrdb2backupdbtestdbonalldbpartitionnumstablespace(T1)监控数据库备份命令执行情况exportDB2NODE=0db2terminatedb2LISTUTILITIESSHOWDETAIL数据库恢复要恢复分区数据库,您必须要首先在编目分区上调用恢复实用程序,然后在其他数据库分区上调用恢复实用程序。 前滚恢复分区0及分区2上的表空间TBS1: db2rollforwarddbtestdbtoendoflogsondbpartitionnums(0,2)tablespace(TBS1)前滚恢复分区6上的6个小表: db2rollforwarddbtestdbtoendofbackupandcompleteEXPORT命令export用于将表中的数据卸载到文件中。 db2"EXPORTTOlineitem.delOFDELSELECT*FROMdb2inst1.lineitem"在分区数据库环境下,import或LOAD命令不支持IFX文件格式。 用于将外部文件中的数据插入到表中。 db2"IMPORTFROMlineitem.tblOFDELMODIFIEDBYCOLDEL|\COMMITCOUNT100000REPLACEINTOlineitem"LOAD命令在多分区数据库环境中,大量的数据放在多个数据库分区中。分区键用来确定每部分数据所在的数据库分区。必须先分布数据,然后才能将该数据装入到正确的数据库分区中。 在多分区数据库中装入表时,load实用程序可以: 将数据装入到多分区数据库中分两阶段完成:第一阶段为设置阶段,在此阶段获取数据库分区资源(如表锁定);第二阶段为装入阶段,在此阶段将数据装入到数据库分区中。在将数据装入多分区数据库时,可以使用下列其中一种方式: PARTITION_AND_LOAD 对数据进行分布(有可能以并行方式进行分布),并且同时在各个相应数据库分区上装入数据。 PARTITION_ONLY 对数据进行分布(有可能以并行方式进行分布),并将输出写入每个装入数据库分区上指定位置中的文件。每个文件都包含分区头,该分区头指定数据在数据库分区上的分布方式,并指定可以使用LOAD_ONLY方式将该文件装入到数据库中。 LOAD_ONLY 假定数据已分布在数据库分区上;将跳过分布过程,并且在相应的数据库分区上同时装入数据。 ANALYZE 生成最佳分布图(在所有数据库分区之间均匀地分布数据)。 下边是LOAD命令的一些示例: 要将load.del中的数据装入到所有定义了TABLE1的数据库分区中,请发出以下命令: LOADFROMLOAD.DELofDELREPLACEINTOTABLE1要在数据分布在数据库分区3和数据库分区4上的位置执行装入操作,请发出以下命令: LOADFROMLOAD.DELofDELREPLACEINTOTABLE1PARTITIONEDDB\CONFIGPARTITIONING_DBPARTNUMS(3,4)在使用数据库分区3和数据库分区4的情况下,要将load.del分布(而不装入)到所有定义TABLE1的数据库分区中,请发出以下命令: LOADFROMLOAD.DELofDELREPLACEINTOTABLE1PARTITIONEDDBCONFIGMODEPARTITION_ONLYPART_FILE_LOCATION/db2/dataPARTITIONING_DBPARTNUMS(3,4)如果已经以PARTITION_ONLY方式执行了装入操作,并且要将每个装入数据库分区的/db2/data目录中的分区文件装入到所有定义了TABLE1的数据库分区中,请发出以下命令: LOADFROMLOAD.DELOFDELREPLACEINTOTABLE1PARTITIONEDDBCONFIGMODELOAD_ONLYPART_FILE_LOCATION/db2/data要仅装入到数据库分区4中,请发出以下命令: LOADFROMLOAD.DELOFDELREPLACEINTOTABLE1PARTITIONEDDBCONFIGMODELOAD_ONLYPART_FILE_LOCATION/db2/dataOUTPUT_DBPARTNUMS(4)REORG命令在分区数据库中,同样使用DB2REORG命令重组表及索引。 db2"REORGINDEXESALLFORTABLElineitemALLOWWRITEACCESS"db2"REORGTABLElineitemINPLACEALLOWWRITEACCESSONALLDBPARTITIONNUMS"RUNSTATS命令在分区数据库中,同样使用RUNSTATS命令收集统计信息。 db2"RUNSTATSONTABLEdb2inst1.lineitemWITHDISTRIBUTIONAND\DETAILEDINDEXESALLALLOWWRITEACCESS"在分区数据库中,RUNSTATS命令运行时所在分区的统计信息才会被收集,再对这些统计信息加以推断(前提是行在各分区上是均匀分布的)以反映整个数据库。这意味着,SYSCAT.TABLES中的CARD列可能不包含该表中确切的行数。我们要尽量让数据均匀地分布在各分区上。