在文章开始前先作个声明,本人并非专业技术人员,充其量只能算IT从业人员和技术爱好者。本文也不是写给专业技术人员看的技术类文档,只是本人因为工作需要,在学习Oracle Exadata系统架构的过程中,自己的一些感触和体会,只是想分享给对Oracle Exadata和其他计算机技术感兴趣的人们,希望大家能一起探讨。因此本文在谈到技术细节问题时,一定漏洞百出,敬请专业人士指正。
Oracle Exadata是Oracle公司研发的一款Oracle数据库一体机,关于Exadata的介绍文档,在网上能找到很多,它有很多特性,Smart scan,Smart Flash cache,HCC,Storage index等等,在本文中不对这些特性作详细说明。本文探讨的只是Oracle在设计这款一体机时,借鉴了Hadoop HDFS(Google Gfs的开源实现)等分布式计算集群的一些设计理念,使Oracle数据库的运行环境突破了传统基于共享存储的scale-up架构,创新的使用了基于scale-out的智能存储节点的架构,从而极大地提高了Oracle数据库在海量数据分析类应用的性能。
一、Hadoop 项目简单介绍:
由于本文探讨的是Exadata和Hadoop的相似处,因此先简单介绍下Hadoop。
Hadoop是Apache开源软件基金会的一个项目的总称,它包含了HDFS,MapReduce,Hive,Hbase,Pig等组件,它是基于Googel GFS和MapReduce的论文发展起来的开源软件项目,而HDFS和Hadoop MapReduce是它的核心。
HDFS是一个开源的分布式文件系统,和单机文件系统一样,它也使用目录树结构,和单机文件系统不同的是,它的文件系统是跨越整个Hadoop集群的,下图是它的架构
HDFS集群是主从架构,它由一台Namenode节点(Master)和多台Datanode节点(Slaver)构成。Namenode节点和Datanode节点都是标准的x86。Datanode节点采用DAS存储的方式,即x86内置多块大容量硬盘,Datanode节点可以多达上千台。
HDFS通常用于存储大文件,在HDFS中每个文件都被切割为固定大小的数据块,然后被分散存放于多台Datanode的硬盘上。并且每个数据块都会有副本存放于远端机架的Datanode上,副本数一般设置为三个。Namenode节点不存放实际的文件,而只存放整个文件系统的目录树等元数据。当客户端需要访问存储于HDFS的某个文件时,首先需要访问Namenode节点,以取得文件存放的位置信息(哪几台Datanode,以及在Datanode硬盘上的具体地址),然后根据这些目的地址对各Datanode上存放的数据并行地进行访问。
HDFS的这种分布式存储架构,主要有几个好处:1、当存储空间不够时,只要简单增加Datanode节点,而系统自动会把数据块分配到新Datanode节点上,而无需人工干预。从而使得Hadoop集群存储的扩展性非常好。2、当客户访问某一文件时,由于该文件存放于多台设备上,因此是由多台Datanode并行处理的,这样大大增加了整个系统的吞吐量。3、HDFS的数据都有多个副本,HDFS 系统在后台自动检测数据的一致性,并能在发生错误时,自动恢复数据,因此系统有很好的可用性。4、由于Hadoop中硬盘是顺序读写的,因此读写硬盘的性能很好。
但是需要注意的是:Namenode节点为了加快对客户端的响应速度,是把文件目录树等元数据缓存于主内存中的,因此整个文件系统的容量受限于Namenode节点的内存大小,所以说理论上Hadoop集群的扩展性也并非无限的,但相对于传统存储系统,Hadoop的容量已经很大了,据说目前Facebook已经有容量超过100PB的HDFS集群。
谈完HDFS,再介绍下Hadoop的另一核心MapReduce计算框架(以下斜体字内容引用自博客Lucene的小屋,链接如下:
http://user.qzone.qq.com/165162897/blog/1257776641#!app=2&via=QZ.HashRefresh&pos=1257092143
Hadoop Map/Reduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集。
一个Map/Reduce 作业(job) 通常会把输入的数据集切分为若干独立的数据块,由 map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序, 然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。 整个框架负责任务的调度和监控,以及重新执行已经失败的任务。
通常,Map/Reduce框架和分布式文件系统是运行在一组相同的节点上的,也就是说,计算节点和存储节点通常在一起。这种配置允许框架在那些已经存好数据的节点上高效地调度任务,这可以使整个集群的网络带宽被非常高效地利用。
Map/Reduce框架由一个单独的master JobTracker 和每个集群节点一个slave TaskTracker共同组成。master负责调度构成一个作业的所有任务,这些任务分布在不同的slave上,master监控它们的执行,重新执行已经失败的任务。而slave仅负责执行由master指派的任务。
这张是Hadoop的MapReduce任务调度图:
这张是MapReduce的工作机制图
MapReduce简单的理解,就是Master节点(Jobtracker)把客户端提交的任务,分割成很多个小任务,然后交给各Datanode节点(TaskTracker)并行执行Map,Reduce计算,最终提交给客户一个完整的结果。
我认为MapReduce有几个非常重要的的特点:1多节点并行计算,2大量需要计算的数据在本地,只有计算产生的中间结果或结果才在网络里传输,大大减少了网络流量。
最后再简单介绍下Hadoop HBase和Hive。
HBase是构架于HDFS之上的面向列的实时分布式数据库(非关系型),HBase 的设计目的之一是支持高并发用户数的高速读写访问。这是通过两方面来实现的。首先数据行被水平切分并分布到多台服务器上,在大量用户访问时,访问请求也被分散到了不同的服务器上,虽然每个服务器的服务能力有限,但是数千台服务器汇总后可以提供极高性能的访问能力。其次,HBase 设计了高效的缓存机制,有效提高了访问的命中率,提高了访问性能。
Hive 是一种建立在Hadoop 之上的数据仓库架构。它提供了:
• 一套方便的实施数据抽取(ETL)的工具。
• 一种让用户对数据描述其结构的机制。
• 支持用户对存储在Hadoop 中的海量数据进行查询和分析的能力。
Hive 的基本特点是它采用HDFS 进行数据存储并利用MapReduce 框架进行数据操作。所以从本质上来说,Hive 就是个编译器,它把用户的操作(查询或者ETL)变换成MapReduce任务,利用MapReduce 框架执行这些任务以对HDFS 上的海量数据进行处理。
Hive 定义了一种简单的类SQL 查询语言HiveQL,让熟悉SQL 的用户可以非常容易的进行查询。与此同时,HiveQL 也允许熟悉MapReduce 框架的程序员在查询中插入自定义的mapper和reducer 脚本以扩展Hive 内嵌的功能,完成更复杂的分析。
二、Oracle Exadata架构
介绍完Hadoop 后,我们再来看一下Oracle Exadata的架构:
如图中所示,Oracle Exadata是由计算节点和存储节点构成,图上层为计算节点,下层为存储节点,计算节点和存储节点均为X86服务器,存储节点是X86服务器直联存储(DAS)的设计,计算节点可以作Oracle RAC(HA,负载均衡,并行计算),计算节点间互联以及计算节点和存储节点间的互联都是采用Infiniband(高带宽,低延迟),而不是传统的以太网。整个系统中网络部分都有冗余,设计为无单点故障。
计算节点本身不存放数据,它通过ASM模块访问存放于存储节点的数据,Oracle 的ASM是Oracle公司自己的自动存储管理软件,特别需要注意的是:ASM是Oracle Exadata架构非常核心的部分,本文主要讨论的就是Exadata中的ASM以及Smart Scan(Offloading)技术,其它如Smart flashcache,Storageindex,HCC等特性,本文不作讨论。
由于Oracle的文档中对于Exadata中ASM技术细节的描述不多,因此本文中有些观点是我本人的猜测,如有谬误,敬请谅解。
以下有关ASM的资料很多来自于《Oracle+Database+11g+RAC手册(第2版)》一书
ASM与Oracle 数据库紧密集成在一起,并对其进行优化。它是通过3 个关键组件实现的:ASM 实例、ASM 动态卷管理器(ADVM)和ASM 集群文件系统(ACFS)。ASM 动态卷管理器为ASM 集群文件系统提供了卷管理器功能。
ASM可以拥有63 个磁盘组,其中放置10 000 个ASM 磁盘,每个ASM 磁盘可以存储高达2TB数据。一个磁盘组可处理100 万个ASM 文件。在Oracle Database 11g 中,一个数据文件所支持的最大文件大小为128TB,而ASM 在采用外部冗余时支持高达140PB 数据。可见ASM所能管理的存储空间也在100PB的量级。
以下是Oracle在使用ASM前后的架构对比:
Exadata使用ASM管理所有智能存储节点上的硬盘,它首先把所有存储节点的磁盘放到一个资源池里,并形成ACFS集群文件系统,然后应用Stripe And Mirror Everything技术把需要存储的所有数据文件分割成固定大小的块,均匀的分布到各存储节点的硬盘上,并可以对数据块设定副本的数量,常规是双重副本,高级是3重副本。副本通常也会被放置于其他存储节点的硬盘上。因此当计算节点需要访问某个数据文件时,也是需要到多个存储节点上并行读取。从这点上看起来,ASM在文件分割和副本方面的策略是否与HDFS的思路很象?不同的是Oracle ASM一般设数据块大小为128K或1M,而HDFS一般设为64M。
在Exadata存储容量不够时,也可以在线添加存储节点,ASM在存储配置和再配置期间,不需要任何停机时间,也就是说,在改变存储配置时不需要使数据库脱机。在磁盘组中添加或删除磁盘之后,ASM 会自动在磁盘组的所有磁盘之间均匀地再分布文件数据。这个操作称为“磁盘再均衡”,它对数据库是透明的。但Oracle Exadata对存储节点的添加是有要求的,它每次扩容最少需要扩1/4机架,也就是4个存储节点。目前Exadata最大容量只支持最大8个机架,但我相信是由于交换机硬件架构的限制,而不是ASM本身的限制。
讨论到现在再回头看看,Hadoop Hbase是构架于HDFS上的Nosql数据库,Exadata则是构建于ASM上的oracle数据库,此外Exadata使用的ASM和HDFS是有很多相似的地方。前面我总结的HDFS的4个主要特点中,可扩展性,多磁盘并发工作,高可用这三个特性,在Exadata中都有类似的实现方式。
由于ASM的资料较少,我不是很清楚Exadata中ASM的元数据的管理方式,因为从Exadata的架构上看,没有类似于HDFS的Namenode的角色,因此ACFS肯定不是采用集中式元数据服务模型。我也曾请教过别人,有人说是采用类似GlusterFS的弹性Hash技术,另外有人说是采用分布式元数据服务模型,但我从Oracle的文档上看到,元数据是存放在每个智能存储节点上的,因此我更倾向于后者。这个需要熟悉Oracle的高手解惑!
最后再来看一下Exadata的另一个主要特性Smart Scan(Offloading)
下图是Smart Scan(Offloading)的工作示意图:
1、客户端向数据库计算节点发出了一个 SELECT 语句,带有谓词,要求过滤并仅返回所需行。
2、计算节点数据库内核确定存储节点可用,并构造一个代表发出的 SQL 命令的iDB 命令,并将其发送到各存储节点。
3、存储节点的 CELLSRV 组件扫描数据块以识别哪些行和列满足发出的SQL。
4、存储节点只将满足谓词的行和请求的列返回给计算节点。
5、计算节点数据库内核整合各个 Exadata 单元的结果集。
6、最后,将查找到的行返回给客户端。
简单的说,Exadata的Smart Scan工作模式就是:当计算节点接到客户端任务时,它就把任务下发给各个存储节点,各存储节点计算完后再把结果返还给计算节点,最后由计算节点整合成完整结果集,再返回给客户。
思考一下Exadata的这个特性是否和MapReduce中的Jobtracker,Tasktracker的工作模式很象?都是Master接到客户端任务后,把任务分解成多个小任务,然后由多台Slave并行计算,最终把汇总结果返还给客户端。由此是否可以说Exadata的Smart Scan(Offloading)技术也符合前文总结的MapReduce的两个重要特性:1、多节点并行计算,2、大量需要计算的数据在本地,只有计算产生的中间结果或结果才在网络里传输,大大减少了网络流量。
前文介绍过,HBase和Hive都是通过很多节点并行作MapReduce计算,来提高整体系统的吞吐量从而海量数据的查询和分析能力,其实Exadata也采用类似的架构,区别就是存储节点上不是跑MapReduce,而是跑SQL而已。但不可否认的是Hadoop支持成千上万个节点的集群,而目前Exadata只支持8个机柜,因此从扩展性方面,还是无法和Hadoop集群比。
综上所述,其实Exadata借鉴了分布式计算的很多优点,它把RDBMS构建于分布式集群存储之上,从而使得RDBMS具备了更好的扩展性,此外它还吸取了众多类似于Flash,Infiniband,列式数据库等新技术的特点,并将这些技术完美的融合在一起。不可否认,Oracle的Exadata是关系型数据库领域里伟大的革新性产品。
关于Oracle 数据库,Exadata,RAC,ASM,ACFS等技术,有非常多的内容,而我也是在开始学习的过程中,本文只是我在学习过程中的一些总结和感想,我觉得计算机技术中很多都是相通的,当一个领域里有好的技术发布之后,其他领域的技术人员会迅速学习并借鉴这些技术,从而推动自己领域的技术发展,这也是信息技术在这些年里飞速发展的原因!