数据仓库一体机
什么是一体机
一体机 (Applicance) 并没有一个通用的定义 , 一体机应该具备以下的一些特征。它应该是为特定的应用领域专门设计的设备,针对特定的用途集中优化,在特定的领域内提供一套完整的解决方案,需要很低的维护成本。对于最终用户来说一体机应该是能够快速简易的安装,通过标准的接口和非常简单的操作来满足用户的需求。一体机是个黑盒子,用户告诉它想要做什么,一体机快速的把结果或答案反馈给用户。IPod 就是一个很好的一体机例子,它简单化并且彻底改革了数字娱乐领域。
Netezza- 数据仓库领域真正的一体机
值得骄傲的是 Netezza 的产品是真正的,是专门为数据仓库设计的一体机。在数据仓库领域许多厂商都推出的自己的“一体机”产品。有些产品只提供软件,用户需要自行的集成软件与硬件。有些产品虽然把软件与硬件结合在一起,但并不是专门的为数据仓库而设计和优化。这些产品都需要非常复杂并漫长的人工调优过程,而且后续的维护成本也很高昂。说 Netezza 是真正的一体机是因为它解决了以上问题。它是软件与硬件不可分离的紧密结合体,无缝的整合数据库管理系统(DBMS)、服务器(Server)和存储设备(Storage)。不需要复杂配置和调优就可以取得非常优异性能。“Netezza”是印度某种方言中的一个词,在英语中的意思是“RESULT”。这个名字也非常恰如其分的体现了 Netezza 一体机的特点。需要结果么? 那么只需要提出问题。
简单性
Netezza 一体机与传统数据仓库的一个很大区别在于它的简单性。这种简单性体现在方方面面。
- 安装与部署的简单性 : 从外部来看 Netezza 一体机就是一个大盒子,给这个大盒子插上电配置好服务 IP 那它就可以对外提供服务了。而传统的数据仓库往往需要花很大的心思在物理规划设计上。这包括规划存储、配置网络以及安装所需要的软件等等。
- 管理和维护的简单性 : 听起来似乎有点不可思议,但事实确实如此 -Netezza 几乎不需要执行任何传统数据仓库 DBA 所执行的任务
- 没有索引(index)
- 不需要性能调优(tuning)
- 不需要存储管理:没有 dbspace/tablespace 规划和配置,没有 redo/physical long 规划和配置,没有表的 page/block/extent 规划和配置,无需临时表空间的分配与监控,无需 RAID 级别的选择,无需逻辑卷的规划与创建时间
- 无需配置操作系统内核参数以及维护建议的操作系统补丁级别
- 简单的数据分区策略:哈希或者随机
简单性所带来到好处是巨大的。这种简单性可以节省出昂贵的 DBA 管理和维护成本,节省出的资源可以投入到更能够创造出商业价值的任务上而不是乏味的 DBA 任务。清单 1和 清单 2是一个非常简单的创建数据库例子。可以看出 Netezza 的语句十分简单。当然其他的数据仓库语句也可以简单的和 Netezza 一样,但是如果那样的话创建出的数据库是没有经过优化会比清单 1 中创建出的数据库性能差很多。Netezza 的优势就在于用简单的语句(更少的管理与维护)也可以创建出性能很好的数据库。在一些实际的数据仓库数迁移项目中,其它数据仓库数千行的建表语句(包括分区和索引部分)转换到 Netezza 只用十几行就能代替,并且还能取得更好的性能。由于篇幅的关系这里就不列出建表语句的例子了
清单 1 在某数据仓库上创建一个 database 的语句
CREATE DATABASE TEST LOGFILE 'E:\OraData\TEST\LOG1TEST.ORA' SIZE 2M, 'E:\OraData\TEST\LOG2TEST.ORA' SIZE 2M, 'E:\OraData\TEST\LOG3TEST.ORA' SIZE 2M, 'E:\OraData\TEST\LOG4TEST.ORA' SIZE 2M, 'E:\OraData\TEST\LOG5TEST.ORA' SIZE 2M EXTENT MANAGEMENT LOCAL MAXDATAFILES 100 DATAFILE 'E:\OraData\TEST\SYS1TEST.ORA' SIZE 50 M DEFAULT TEMPORARY TABLESPACE temp TEMPFILE 'E:\OraData\TEST\TEMP.ORA' SIZE 50 M UNDO TABLESPACE undo DATAFILE 'E:\OraData\TEST\UNDO.ORA' SIZE 50 M NOARCHIVELOG CHARACTER SET WE8ISO8859P1; |
清单 2 在 Netezza 上创建一个 database 的语句
CREATE DATABASE TEST |
Netezza 一体机架构
之前的介绍中说用户可以把 Netezza 一体机看作一个黑盒子。那这个黑盒子是如何在保持简单性的同时又提供高性能的呢?这就需要我们打开黑盒子看一看 Netezza 一体机的独特架构。
图 1.Netezza 1000 一体机
图 1展示了 Netezza 1000 一体的机基本内部结构。一体机主要包括四大关键组件。SMP 主机、S-Blades、磁盘存储柜和网络结构
- SMP 主机是两台高性能的 Linux 服务器,两台服务器一台是活动的,另外一体是备机。BI 应用程序的请求都会通过活动的 SMP 主机来提交。SMP 主机编译并且生成最优的可执行代码,分发生成的可执行代码给 S-Blades 执行。最后收集并汇总 S-Blades 返回的结果返回给用户。
- S-Blades 是智能的处理节点也是 Netezza 魔法发生的地方。每个 S-Blades 都是一台独立的服务器它包含了个一台标准的刀片服务器和一块 Netezza 特有的数据库加速卡。刀片服务器和数据库加速卡通过 IBM 的 sidercar 技术整合起来,使它们在逻辑上和物理上都成为一个整体。Netezza 1000 的每个 S-Blades 节点包括 2 个 4 核的 CPU、4 个 2 核的 FPGA 引擎以及 16GB 的内存。
- 磁盘存储柜包含了高密度高性能的磁盘。每块磁盘包含表的一个数据片(data slice)。所有磁盘上的某个表的数据片合起来组成一个表完整的数据。每块磁盘上还包含另外一块磁盘上的数据镜像。磁盘阵列柜通过高速的通道(3Gb/s SAS)和 S-Blades 连接在一起。
- 网络结构并没有在中标注出来。主要的网络链接线路都在机柜的背面。Netezza 1000 一体机的各个组件是通过高速网络连接起来的。图 2描述了基本网络结构。网络有两种一种是 IP 网络另一种是 SAS 存储网络。IP 网络是服务于 SMP 主机与 S-Blades 节点之间以及不同 S-Blades 节点之间的数据通讯。IP 网络中的协议是经过深度定制的,专门为了 Netezza 的应用环境而优化,能够支持上千节点之间同时的大数据量传输。SAS 网络连接了 S-Blades 节点与磁盘存储柜,使 S-Blades 能够高速的访问磁盘上的数据。
图 2.Netezza 网络结构
Netezza 一体机架构
Netezza 的 AMPP(Asymmetric Massively Parallel Processing)是一个两层结构,如 图 3所示,专门为了处理多用户的大数据量查询而设计。AMPP 结构是 SMP 前端和 shared nothing 的 MPP 后端的完美结合。前端是 SMP 的高性能 Linux 主机。其主要功能是通过标准的接口(SQL、ODBC、JDBC、OLE DB)对外提供服务。SMP 主机负责编译从应用程序发出的查询请求,生成优化过的可执行代码片段,称之为 snippet,然后分发这些代码片段到所有的 S-Blades 上并行执行。当所有的 S-Blades 都执行完毕 SMP 主机汇总结果后把最终的结果返回给应用程序。后端是由大量的 S-Blades 组成,主要的数据操作过程都是在 S-Blades 上完成的。S-Blades 之间是相互独立的,每个 S-Blades 都会占有自己磁盘和数据片(data slice)在并行处理的时候并不会相互影响。这种结构的好处是可以通过增加 S-Blades 节点和其所使用的磁盘来使性能得到近似线性的提升。Netezza 1000 的 S-Blades 数量可以扩展到 120 个。在面对超大量数据的时候,这种分而治之的方法能收到立竿见影的效果。这种结构也提供了极大的灵活性通过改变磁盘、S-Blades 和内存的配比来创建出不同型号的 Netezza 一体机。比如增加磁盘数量减少 S-Blades 数量,这样的一体机查询性能有所减弱,但数据容量有所增大。可以用来存放历史数据。
图 3.AMPP 架构
FPGA 与数据流处理
在架构层面上,灵活的 AMPP 架构是 Netezza 一体机具有高性能的一个重要因素,另外一个起到决定性作用的因素就是 Netezza 一体机引入的数据库加速卡和数据流处理概念。这些都发生在 S-Blades 里面,它们极大的增强了一体机数据处理能力。下面将更深入的进入到魔法发生的地方 -S-Blades 里面看看它的独特之处。 S-Blades 包括一个刀片服务器 (8 个 CPU 核 ) 和一块数据加速卡(8 个 FPGA 核)。正常情况下在 Netezza 1000 一体机中一个 S-Blades 管理 8 个数据片(data slices)。一个 CPU 核与一个 FPGA 核再加上一个数据片组成了一个逻辑的处理单元,称之为 Snippet Processor。每个 Snippet Processor 都独立的负责一个数据片的处理,这样当运行查询的时候一个 S-Blades 中就有个 8 个这样的逻辑处理单元并行的处理 8 个数据片。
图 4.FPGA 与数据流
CPU 和 FPGA 各自都有明确的分工对任务的不同阶段进行处理,形成了流水线作业大大提高了性能。展示了一个逻辑处理单元(1 CPU 核 + 1 FPGA 核 + 1 数据片)各个组件的分工以及它们是如何协同工作的。 SMP 主机编译生成可执行的代码片段并且把它们分发到 S-Blades 上去执行。这个代码片段实际上包含两部分内容一部分是用来配置 FPGA 的参数另一部分是 CPU 可执行的程序。FPGA 配置好了参数之后便开始根据配置的参数来执行,这时将建立一个数据流。下面将结合一条 SQL 语句来解释一下数据是如何在流中被操作的。
SQL:select c1, c2, sum(c3) from t1 where c2=999 假设表 t1 包含 10 列分别是 c1 到 c10
- FPGA 从数据片中读取所查询表 t1 的所有数据块到内存中 . 这里读取的知识表 t1 的一部分数据,其他的数据存储在其它的数据片上。
- 磁盘上所有的数据都是经过压缩的,压缩的好处是可以有效的减少磁盘的 IO。FPGA 对数据进行解压
- FPGA 对数据进行投影操作,只保留操作中能用到的列。这样做可以减少数据的大小,使数据传输和处理起来都更加高效。效果对宽表尤其明显。SQL 语句中选择了 c1,c2 和 c3 三列其余的列都没有用到,这样只保存这三列其余列全部丢弃掉。
- FPGA 对数据进行过滤,只保留用户应该得到的数据。这里有两层过滤一层是由于查询条件限制需要过滤掉的数据,SQL 语句中的 c2=999 会在这个阶段产生作用。还有一层过滤是要过滤掉还实物还没有提交的数据。
- CPU 对过滤好的数据进行聚合、链接和汇总等操作。然后返回出这个逻辑处理单元的结果。SQL 语句中的 sum(c3) 在这个阶段被执行。
- SMP 主机收到所有的逻辑处理单元的结果后再汇总得到最终结果,返回给用户。
关键技术特性
分区数据库与分区键
Netezza 是一个分区的数据库,一个表的数据是分布所有的数据片上的。一条记录存储在那个数据片上是由分区键来决定的。有两种方式来制定分区键,一是定义表的时候可以指定一个或多个列来作为表的分区键,另一个是用随机的方式(round-robin)来给记录分区。清单 3列出了其基本语法 . 如果指定了列作为分区键,Netezza 会根据所指定用哈希算法算出一条记录数据属于那个分区。如果没有指定分区键则自动用第一个列作为分区键
清单 3 指定分区键
Create table table_name( Column_name1 data_type1 Column_name2 data_type2 Column_name3 data_type3) [distribute on (column_name1, column_name2, … ] | [distribute on random] |
分区键的选择对性能的影响是至关重要的,这也是 Netezza 中为数不多的可以管理和调优的地方。应该尽可能的使数据均匀的分布在所有的数据片上。下面有一些基本的原则
- 选择有大量唯一值的列做分区键,列的唯一值的数量越多数据的分布就越均匀。不要使用 bool 类型的列作为分区键,那将会导致所有的数据只会分布在两个数据片上。
- 对于表关联的情况,应该选择关联条件里面的所有列作为两个表的分区键,这样关联操作只会在数据片自己的分区内发生。每个数据片都不会广播自己的数据到其它分区。
压缩
与传统的数据仓库不同的,在 Netezza 一体机中所有的用户数据都是经过压缩存储的,而并不像传统数据仓库那样可以选择不压缩进行存储,这也体现了 Netezza 的简单性。数据仓库中性能的瓶颈往往出现在磁盘上,数据压缩存储的好处是可以减少磁盘的 IO 压力,FPGA 引擎负责将数据解压缩成可读的内容。 Netezza 的压缩对用户来说是完全透明的,它支持所有的数据类型,不要任何的调优和管理。压缩算法把记录根据列分成不同的数据列流,对每个列流独立的进行压缩,但在存储的时候保持行结构,这种具有专利的压缩算法保证了 4 到 32 倍的压缩率,极大的减少了磁盘 IO 的压力。
Zone Maps
Zone Maps 是 Netezza 很独特的技术,它可以使数据块在还没有被从磁盘上读出来之前就知道这块数据是否包含查询中所包含的数据,如果不包含则直接跳过该数据块。这种方式极大的减少的磁盘的 IO,大大提高了查询的性能。传统的数据仓库则需要读出数据块然后再判断是否需要里面的数据。 Zone Maps 是什么呢?在 Netezza 中数据是以数据块的方式存储的磁盘上的,对数据的读写操作的最小单位是数据块,每个数据块的大小是 3MB。Zone Maps 保存了每张表的每个数据块上表的各个列的最大值和最小值。默认情况下整数、日期和时间类型的列会生成 Zone Maps 统计信息。图 5说明了 Zone Map 是如何减少磁盘 IO 的。表 TradeTable 使用了 3 个数据块来存放数据。Zone Maps 收集了其中两列 Data 和 Cust_ID 的在每个数据块上的最大值和最小值。当语句“select * from TradeTable where data=02”执行的时候数据库系统首先检查 Zone Maps,根据 Zone Maps 的指示,只有第二个数据块中的数据有满足条件的记录,所以第一个和第三个数据块的数据不会被读入。
图 5.ZoneMaps
Zone Maps 也是自动维护的并不需要用户来进行干预。Zone Maps 会在以下的条件下自动进行更新:
- 运行 GENERATE STATISTICS 命令收集统计信息时
- 用 nzload 进行数据装载时
- 插入和更新数据时
- 运行 GROOM TABLE 重新整理数据块时
工作负载管理
现今的数据仓库大多是多用户同运行混合任务类型的系统。工作负载管理是这样的系统上不可取少的一项功能。Netezza 提供了一套简单又灵活的工作负载管理方案,包括以下一些策略:
- 资源保障分配(GRA):通过定义资源组,给每个资源组分配可使用资源的范围来控制不同用户对系统资源的使用比例。
- 分优先级的执行查询(PQE):可以给每个查询赋予低中高的优先级,当系统资源紧张的时候高优先级的查询会优先执行。PQE 和 GRA 可以结合起来使用,即在相同的资源组里面的查询也可以通过指定不同的优先级来进行区分。
- 短查询优先(SQB):保证短查询不受大数据量查询的影响,即使在系统资源很紧张的时候短查询也能很快的返回结果而不必等到大数据量查询结束。这个是通过系统预留出一定数量的资源来实现的。Netezza 会根据生成的执行计划来判断一个查询是否是短查询,默认情况下认为一个查询如果少于 2 秒就是一个短查询。
高可用性
Netezza 一体机的各个部件都存在冗余的备份,不存在单点失败的情况。其高可用性主要体现在以下三个层次。
- SMP 主机:从图 1 上可以看出一体机包含两台 SMP 主机,这两天主机是主备关系,其上面运行的 Linux HA 软件可以保证在主机出现宕机的情况下,所有的服务都可以转移到备机上。两台主机之间并没有采用共享磁盘的方式来保持共享的关键数据,而是采用了 DRBD 来同步需要共享的关键数据。
- S-Blades:从图 1 上我们还可以看出每个刀片服务器底座包含了 6 个 S-Blades。当其中有的一台 S-Blades 出现问题的时候,Netezza 会自动的把失败的的 S-Blades 所管理的磁盘分配给同一个底座上其他的 S-Blades 进行管理。对于只读的查询用户是感觉不到这种切换的存在。
- 磁盘:每块磁盘上都保存有一个数据片的数据,同时也保存着另外一个数据片数据的镜像备份。例如磁盘 1 上有数据片 1 上的数据以及数据片 2 上数据的镜像,磁盘 2 上有数据片 2 的数据以及数据片 1 的镜像。当磁盘 1 失败的时候,S-Blades 会自动的去访问磁盘 2 上的镜像数据,系统仍能维持正常的运行。此外磁盘存储柜里的还有一些空闲磁盘他们不属于任何的数据片,当有磁盘失败空闲的磁盘会重新的生成数据,例如磁盘 1 失败,那么空闲磁盘 X 会从磁盘 2 复制数据片 1 的镜像和数据片 2 的数据重新生成失败的磁盘 1,这个过程需要一些时间,在这个过程中 S-Blades 还是通过磁盘 2 来访问数据片 1 的数据。一旦这个过程完成 S-Blades 会通过新生成的磁盘来访问数据片 1 的数据。整个过程对于用户来说也都是透明的
结束语
一体机技术是今后数据仓库发展的趋势,各大厂商也都加大了在这个方向的投入。通过本文,您应该对 Netezza 一体机技术有所了解,理解了它为什么外表看起来了如此简单却又有着非凡的性能表现。希望您能有机会亲自体验一下它给你带来的惊喜。
参考资料
学习
- 通过 developerWorks Information Management 专区 学习关于 IM 的更多知识。
- 通过 IM 专区 DB2 9 技术资源中心 了解 DB2 产品更多信息和相关技术。
- 通过 Data Warehousing (数据仓库与分析) 了解 IBM 数据仓库产品更多信息和相关技术资源。
- 通过 DB2 V9.7 信息中心的 DB2 9 产品信息中心 了解关于 DB2 数据库的更多内容。
- 随时关注 developerWorks技术活动和 网络广播。