当前的应用系统主要分为两类:联机事务处理(OLTP)和联机分析处理(OLAP)。OLTP主要执行日常的事务处理,比如银行存取款、商场买东西等,它的主要特点是对响应时间要求高,数据量一般较小,并发多,面向应用。OLAP主要指数据仓库、决策分析类系统,主要特点是数据量大,对实时性要求不高,面向主题。
针对这两种典型的系统,DB2提供了很好的支持。对于OLTP系统和数据量较小的OLAP系统,可以采用单分区架构,如图2.1所示。在这个单分区架构中,包含一台数据库服务器,该机器包含一些物理资源,如CPU(左边)、一组内存(中间)和一组磁盘(下边)。DB2在设计上的一个主要考虑就是充分利用这些资源并行处理一些任务。
图2.1 DB2单分区架构
在图2.1中,一些Client客户端应用程序连接到DB2服务端。每个客户端连接都有一个或多个DB2代理(agent)进程或线程,代表应用执行一些任务。当读取数据时,这些进程或线程首先将数据从磁盘加载到缓冲池,然后返回给客户端。当写数据时,DB2引擎内部还有一些独立的进程或线程,进行异步I/O操作和日志读/写操作。这些线程或进程直接或间接地与磁盘交互,将数据读出或写入磁盘。
一般来说,一个DB2代理进程或线程服务于一个应用程序。但是有的时候,当查询的数据量很大时,用户可以开启一个非常有用的功能,使得多个进程和线程在同一分区内共同并行处理一个事务请求。这个功能叫做分区内并行(Intra-Parallel)。比如,一个复杂的SQL语句在DB2引擎中由两个子代理进程或线程同时处理,然后将得到的结果汇总给一个另外的代理(叫做协调代理),返回给用户。这个功能可以为大规模的数据处理提供很高的效率。
但是有一些OLAP系统,比如国内一些通信公司和电力公司的经营分析系统,包含的数据超过几十TB(有的已经上千TB),一台机器的处理性能根本无法满足要求。这时,可考虑DB2的多分区架构,即Shared Nothing架构。图2.2所示是DB2多分区架构图。
图2.2 DB2多分区(DPF)架构
从概念上讲,DB2数据库多分区在很多时候可以看成是一系列单分区数据库的聚集,每个分区都包含独立的数据、日志、锁等,当一个任务到来后,由一个分区(这个分区叫做协调分区)将请求分发到各个分区上,每个分区都会启动一个或若干个子代理,同时执行查询处理,然后把结果集返回给协调分区进行汇总,最后返回给应用程序。分区数据库对应用是透明的,应用看到的还是一个数据库。
当新的数据被插入,或者老的数据被修改时,DB2会通过一种叫做“分区键”的数据列(用户可以指定列作为分区键)对其进行散列(hash),然后根据散列结果插入相应的分区。也就是说,一条数据仅仅存在一个分区中,每个分区无法访问其他分区中的数据。在海量数据应用中,这种设计大大减少了每个分区需要处理的数据量,为查询性能的提升起到了重要的作用。
这种架构的优点就是能够充分利用系统资源,将一个大型的查询分解成若干个小查询并行运行在不同的系统中。由于每一个分区只能够访问自己分区的数据,当查询数据需要关联时,需要在分区中交换必要的数据,分区之间使用一种叫做FCM(Fast Communication Manager)的通信机制。这种架构对系统设计人员的要求较高,一定要充分理解优化器与系统访问数据的规则,并且设计很好的“分区键”,才能够尽可能避免分区间大量的数据交换。
DB2 for LUW是Share-Nothing架构的典型代表,当前比较流行的Greenplum也是这个架构。该架构的设计目标主要是解决数据扩展性和并发性能问题,而不是高可用性。目前主要用于包含海量数据的OLAP系统,如仓库和经营分析系统。
与Share-Nothing相对的另外一种常见的架构是Share-Disk,典型代表是Oracle RAC和DB2 for z/OS。Share-Disk架构允许所有机器都可以访问全部的数据,好处是管理起来相对方便,而且一台机器宕机后,只要存储部分不出问题,其他系统可以照样访问数据。它的设计目标主要是提供高可用性,一般用于OLTP系统。
很多初学者都会问一个问题:这两个架构哪个好?答案也很明显,适合你自己业务的就是最好的。用Share-Disk架构来跑几百个TB的数据仓库明显是吃力不讨好,而使用DB2分区数据库跑只有几十GB的在线交易也有点大材小用。因此,在选择一个系统的时候,一定要对相关的不同架构进行了解,然后通过自己的分析(别看广告,看疗效)得出相应的结论。
另外,为了满足OLTP系统对高可用性的需求,DB2 for LUW对DB2 9.8版本(代号pureScale)进行了体系结构的重大变革,即支持Share-Disk架构,它的体系结构更加先进,效率更高。IBM一直在致力于发展与改进pureScale系统,相信在不久的将来,越来越多的生产系统会使用SD架构。
关于DPF和pureScale的更细节介绍,我们将在《DB2数据库高级管理》一书中重点讲述。本书只专注于单分区数据库的学习。