分布式文件存储系统研究及应用.docx
《分布式文件存储系统研究及应用.docx》由会员分享,可在线阅读,更多相关《分布式文件存储系统研究及应用.docx(51页珍藏版)》请在冰豆网上搜索。
分布式文件存储系统研究及应用
分布式存储系统研究和应用实践
二〇一二年二月
摘要
物质、能量和信息是自然科学研究的三个基本对象,处理、传输和存储是信息计算的三大基本任务。
随着网络技术及信息处理技术的不断发展,个人数据和企业数据的产生量呈现爆炸性膨胀的趋势,IT系统正面临着海量数据存储成本高、管理困难、可靠性低的问题,为了充分利用资源,减少重复的投资,数据存储作为IT系统的主要架构和基础设施之一,逐步被作为一个完整的系统从IT系统中独立出来,分布式存储系统因为具有海量数据存储、高扩展性、高性能、高可靠性、高可用性的特点,目前正被作为企业海量数据存储方案被业界所广泛讨论和应用。
因此对于分布式存储系统的研究不仅紧跟目前发展的趋势,而且具有较高的应用价值。
本文基于对分布式存储系统的研究,旨在通过在网络环境下构建具有高传输性能、高可靠性、高可用性的网络分布式文件系统,通过网络数据流方式实现对海量文件系统中的数据进行存储和访问,解决大规模非结构化数据的存储、查询、高性能读取、高容错性的问题,为IT系统提供高性能、高可靠性、高可用性的存储应用服务,并为今后的分布式计算研究提供技术基础。
本文阐述的主要内容如下:
(1)分布式架构的相关理论以及分布式存储系统的应用现状,介绍了分布式存储系统概念;
(2)然后引入开源项目Hadoop的HDFS分布式文件系统,接着对HDFS关键运行机制进行了详细分析;
(3)并在此基础上,通过搭建基于HDFS0.23版本的实验环境进行实际的测试验证,采集实验数据,并对实验结果作出进一步的分析总结,得到理论和实际结合的第一手资料;
(4)最后,通过结合实际需求,在对医学影像中心业务分析的基础上,对医学影像中心存储体系、功能结构及运行环境进行了设计和规划。
关键词:
分布式存储系统、HDFS、Hadoop
第一章绪论
一.1背景说明
IDC的一项预测曾指出,“数字宇宙”(digitaluniverse)项目统计得出,2006年的数据总量为0.18ZB,并预测在2011年,数据量将达到1.8ZB。
1ZB等于10的21次方字节,或等于1000EB,1,000,000PB,或者大家更熟悉的10亿TB的数据。
这相当于世界上每人一个磁盘驱动器所能够容纳的数据的数量级。
在如此强大的需求下,对海量存储容量、高性能、高安全性、高可用性、可扩展性、可管理性的存储的要求不断提高。
1.1.1.关于磁盘存储
目前的情况是,磁盘存储容量快速增加的同时,其访问速度-磁盘数据读取速度却未能与时俱进。
目前,普通的1TB磁盘,其传输速率约为100MB/S左右,写入则更慢,而10年前,10G的磁盘,其传输速率也有66M/s,即便换成基于闪存的SSD固态硬盘,也只是将读取速度提高3倍、写入速度提高1.5倍而已,甚至最先进的光纤通道硬盘,和内存的读取和写入数据的速率相比也不在一个数量级上。
一个简单的减少磁盘读取时间的方法就是同时从多个磁盘上读取数据,假设,我们拥有100个磁盘,每个磁盘存储1%的数据,并行读取,所需要的读取时间,也相当于原来的1%左右。
这种方法称之为条带化存储(Strip),是RAID(RedundantArrayofIndependentDiskes,独立磁盘冗余阵列)技术的一项重要特性,通过使用一组磁盘同时进行I/O操作,从而获得更大的I/O吞度量,并依靠存储冗余信息(镜像+奇偶校验)来保障数据的安全性。
例如RAID10模式,数据块被分别以位或字节为单位进行分割并且并行读/写,同时,为每一块磁盘作磁盘镜像进行冗余,既保证了最高的读写存储性能,又通过镜像保护了数据,缺点是磁盘利用率比较低。
设置RAID10至少需要安装4块硬盘,当把4块磁盘设置成RAID10后,每一对磁盘被设置成镜像,每一对磁盘之间被设置成条带以便数据快速传输。
下图为RAID10的数据分布及镜像示意。
1.1.2.网络存储应用
除了个人PC机的本地存储,企业的大多数的存储应用,都是基于局域网或者广域网的文件共享和存储,目前很多简易的局域网内的文件共享和存储应用都是基于文件服务器,主要的功能是提供网络用户访问共享文件,通常是C/S模式,基于FTP或TCP/IP连接。
这样的存储服务器,在访问的高峰期,单机IO负载很大,不能充分使用网络带宽,而且扩展性差,可靠性和容错能力需要依靠硬件来完成,比如RAID的磁盘阵列。
随着网络技术的发展,网络的带宽已经超过了磁盘的带宽,现在,很多存储系统方案采用网络存储的技术来解决传统存储的问题,针对I/O是整个网络系统效率低下的瓶颈问题,最有效地方法是将数据从通用的服务器中分离出来,进行集中管理,形成所谓的存储网络。
其中又有两种不同的实现手段,NAS(网络附加存储)和SAN(存储器网络),两者之间的区别在于,NAS是每个访问客户端通过网络共享协议使用同一个文件管理系统,而SAN在每个访问客户端都有个文件管理系统。
FC硬盘是普通的SATA硬盘的成本是的十倍,耗电量也是SATA硬盘的十倍,但是只提供1/10的密度,NAS和SAN虽然解决了存储速度和可靠性的问题,但是其高昂的成本和复杂的管理问题局限了其应用范围。
针对服务器的I/O效率和网络访问的问题,通过分布式系统通过在不同的节点间实现共享,提供多个访问点提高性能,来实现各个节点的高效、一致的数据共享来解决。
第二章分布式存储相关理论
二.1分布式系统概念
在网络基础设施及服务器性能不断成熟和发展的背景下,分布式系统架构越来越多的为人所关注,分布式系统架构以传统信息处理架构无法比拟的优势特性,正在成为企业实现提高效率、提高灵活性、降低成本的重要选择。
分布式系统(DistributedSystem)是建立在网络之上的支持分布式处理的软件系统。
正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。
所谓的内聚性是指每一个分布节点高度自治,有独立的程序进行管理。
透明性是指每一个分布节点对用户的应用来说都是透明的,看不出是本地还是远程。
在一个分布式系统中,一组独立的计算资源展现给用户的是一个统一的整体,就好像是一个系统似的。
系统拥有多种通用的物理和逻辑资源,可以动态的分配任务,分散的物理和逻辑资源通过计算机网络实现信息交换。
在传统网络系统中,这种统一性、模型以及其中的软件都不存在。
用户看到的是实际的机器,计算机网络并没有使这些机器看起来是统一的。
如果这些机器有不同的硬件或者不同的操作系统,那么,这些差异对于用户来说都是完全可见的。
分布式系统和传统网络系统的共同点是:
多数分布式系统是建立在网络之上的,所以分布式系统与传统网络系统在物理结构上是基本相同的。
他们的区别在于:
分布式系统的设计思想和网络系统是不同的。
网络系统要求网络用户在使用网络资源时首先必须了解网络资源(比如:
计算机的功能与配置、软件资源、网络文件结构等情况);分布式系统是以全局方式管理系统资源的,它可以任意调度网络资源,并且调度过程是“透明”的,在利用分布式系统的过程中,用户并不会意识到有多个处理器的存在,这个系统就像是一个处理器一样。
二.2分布式存储系统概念
由此而知,分布式存储系统是指通过分布式技术,将网络中不同节点上的存储设备通过分布式应用软件集合起来协同工作,共同对外提供数据存储和业务访问功能的一个系统。
分布式存储系统的最大特点是,数据分散存储在分布式存储系统的各个独立节点上,供用户透明的存取。
分布式存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。
二.3分布式存储系统的应用现状
以高性能、高容量为主要特性的分布式存储系统,必须满足以下4个条件
1、应用于网络环境中;
2、单个文件数据分布存放在不同的节点上;
3、支持多个终端多个进程并发存取;
4、提供统一的目录空间和访问名称;
只有这样,考虑到目前网络总带宽超过单个磁盘带宽的特点,支持多个进程在多个磁盘上并发存取,增加文件系统的带宽,来提高存储的性能,并且通过动态增减分布节点,来实现整个存储系统容量的动态扩展性。
分布式存储系统因为其高容量、高性能、高并发性以及低成本的特性而被众多IT企业特别是互联网服务提供企业所广泛关注和支持。
下图为一部分常用的云存储产品,可谓是种类繁多、琳琅满目。
随着宽带网络的发展,用户数量的不断增加,CDN(Contentdeliverynetwork)内容分发、P2P、数据压缩技术的广泛运用,以及分布式技术的完善,分布式存储(云存储)在技术上已经趋于成熟。
从厂商的解决方案来看,面对目前互联网应用PB级的海量存储的存储需求,频繁的数据传输,都是通过应用分布式存储系统,实现在普通PC机上部署节点,通过系统架构设计提供强大的容错能力,针对大型的、分布式的、大量数据访问的应用给用户提供总体性能最高的服务。
二.4分布式存储系统架构分析
目前,分布式系统的应用体系架构,主要有两种实现类型,一种是中心化(Centralization),一种是去中心化(Decentralization)。
二.4.1中心化体系架构
中心化体系结构,顾名思义,就是系统中含有某些“中央节点“。
中心化体系类似于我们网络拓扑中的星型拓扑,用一个节点作为中心节点,其他节点直接与中心节点相连构成的网络,中心节点维护了整个网络的元数据信息,任何对系统的分布式请求都要经过中心节点,中心节点通过处理后,给各个节点分配任务,再由分配到任务的各个节点处理完成后,直接将结果返回到目标位置,因此,中心节点相当复杂,通信的负载也是最大的,而各个节点的负载比较小。
中心化的结构对于系统的可扩展性有较大的影响,因为那个”中心“很可能会成为瓶颈。
在互联网上,中心化的结构还是比较常见的,例如,某个新闻网站。
逻辑上,所有的用户都会通过访问同一个网址来获得服务。
当然,这背后早就不再是一个服务器提供服务了。
大致的体系架构如下图所示:
二.4.1.1联邦化体系结构
在中心化体系结构的基础上延伸出一种联邦式的体系架构来通过对中心节点进行水平扩展的方式解决决单个中心化体系结构的局限性的问题。
因此,联邦化体系结构虽然解决了“热点”的问题,但是不能完全解决单点故障问题,如果某个分区的中心节点失效,其管理的相应文件将不能访问,但是通常,中心节点都会配置有副中心节点,当主中心节点失效后,副中心节点将会接管。
本次论文中要重点论述的分布式存储系统——HDFS中采用了这种联邦化的架构,NameNode相当于一个分区主节点,每个NameNode加上一个BlockPool形成一个NamesapceVolumn(命名空间卷),相当于磁盘文件系统的一个逻辑卷,各个逻辑卷加起来呈现的相当于整个硬盘。
二.4.2去中心化体系架构
在这种结构中,相对于中心化架构,不再存在某类中央节点,总体上讲,每个节点的功能都是类似的或者说对称的,类似于我们网络拓扑中的环型拓扑。
对于去中心化结构而言,最重要的问题之一就是如何把这些节点组织到一个网络中。
一般而言,系统中的一个节点不可能知道系统中所有的节点,它只能知道在这个网络中自己的邻居并与这些邻居直接交互。
去中心化体系结构,根据系统维护方式,又可以分为两类:
结构化网络和非结构化网络。
●结构化网络
网络是通过一个确定的过程建立起来的,节点数据的划分都通过哈希算法进行切分分配,寻址采用DHT(DistributedHashTable,分布式哈希表)方式(HASH表的应用类似于Oracle的HASH分区概念,通过HASH对数据进行散列分区),节点间通过Gossip协议进行通讯,使网络达到去中心化,提高系统可用性,在这种系统中,各个节点构成一个逻辑的环。
●非结构化网络
在非结构化的网络中,网络的建立带有更多的随机性。
每个节点都维护这一个局部视图(一个包含n个节点的表),这个视图中的节点就是它的邻居。
它通过与邻居不断地交换视图内容来更新自己的视图。
在此种结构中,因为整个体系中的节点都是对等,根据其动态组织的特点,所以对等节点可以随意的加入或者离开网络,所以,整个结构是一个自组织的动态网络,因此该体系结构必须控制数据的一致性,确保整个网络中的所有数据可以实现数据同步。
正因为去中心化的架构具有数据动态一致性的特点,所以不仅可以做为文件存储系统,还可以作为键值对(Key-Value)的分布式缓存系统进行应用。
大致的体系架构如下图所示:
二.4.3中心化体系结构与去中心化体系结构的比较
中心化体系结构与去中心化体系结构各有优缺点,如下:
●中心化体系结构
优点:
一致性管理方便,可以直接对节点进行查询;
缺点:
存在访问的“热点”现象,单台服务器会形成瓶颈,容易造成单点故障,单点故障会影响个系统的可用性;
●去中心化体系结构
优点:
消除了单点故障,可用性高;
缺点:
一致性管理复杂,依赖节点间的网络通讯,交换机故障所导致的分割,依然会造成故障,不能直接查询;
综合来看,中心化体系结构最大优势是结构简单、管理方便,查询效率高,去中心化体系结构最大的优势是可用性高,可扩展性高。
下表比较了3种体系结构的综合性能,比较结果如下表所示:
比较
中心化
联邦化
去中心化
可扩展性
低
中
高
可用性
中
中
高
可维护性
高
中
低
动态一致性
低
低
高
节点查询效率
高
高
低
执行效率
高
高
低
二.4.4“中心化”与“去中心化”混合架构
在实际的使用中,中心化结构和无中心化结构都有各自的问题,所以,实际的系统通常是混合结构的。
例如著名的Emule(电驴)和BitTorrent系统。
Emule和BitTorrent都是基于的P2P技术的文件共享软件,它们与传统的文件共享方式的区别是:
共享文件不是在集中的服务器上等待用户端来下载,而是分散在所有参与者的硬盘上,所有参与者组成一个虚拟网络。
在Emule中也存在一些服务器,不过这些服务器不再存放文件,而是存放这些共享文件的目录地址,客户端从服务器处得到或搜索到共享文件的地址,然后自动从别的客户端进行下载,参与的客户越多,下载的速度越快。
二.4.5“中心化”与“去中心化”间的选择
对于两种架构设计的优劣,目前在网络上还存在很多争议,有人甚至认为去中心化的设计思想甚至是一种缺陷,为什么这么说呢?
去中心化的设计相对于中心化设计的最大好处,也是其最大的优点是有极佳的伸缩性,因为去中心化,相当于无政府化,不用去向中心去登记和注销,从事物的两面性而言,有利必有弊,客户端的每个查询都会涉及到多个节点的响应,并产生不必要的网络IO,这里讲得查询,主要是基于DHT分布式HASH表的查询,这种设计在巨型、频繁伸缩的网络,比如Emule、Bittorrent这种网络是有其特殊意义的。
由此可见,去中心化的分布式存储方案,从HighPerformance上讲并不是最佳的企业分布式存储方案。
第三章HDFS分布式存储系统研究
三.1HSDF系统架构和设计要点
三.1.1HDFS的特点
HDFS(HadoopDistributedFileSystem),是一个设计用来保存大数据量的数据的分布式文件系统(PB级甚至是EB级),并提供快速访问这些数据的能力,数据通过冗余的方式保存在多台机器上,以来保存对失败的容错性和并行应用的高度可用性。
HDFS和现有的网络文件系统相似,是一个运行在普通的硬件之上的分布式网络文件系统,然而它与普通网络文件系统也存在着一定的差别。
HDFS具有高容错性,可以部署在低成本的硬件之上,同时HDFS放松了对POSIX的需求,使其可以以流的形式访问文件数据,从而提供高吞吐量地对应用程序的数据进行访问,适合大数据集的应用程序,比如:
MapReduce的分布式计算。
HDFS的设计相对网络文件系统,具有高性能、高可靠性、高可用性、高可扩展性的特点,主要表现在以下几个方面:
1)HFDS设计用来保存非常大的数据量信息,就需要将数据分布到大量的机器上;
2)HFDS的数据保存是可靠的,如果集群中的某些机器工作不正常,数据仍然是可用的;
3)通过简单添加一些机器,提供快速,可扩展的数据访问能力,使得HDFS能服务于更多的客户端;
4)在HDFS上的应用与一般的应用不同,它们主要是以流式读为主,做批量处理,比之关注数据访问的低延迟问题,更关键的在于数据访问的高吞吐量;
5)HDFS与HadoopMapReduce能很好地集成,它在可能的情况下,能使数据读取、计算本地化;
三.1.2HDFS的系统架构
HDFS采用master/slave架构,HDFS的架构示意图如下:
从图中可以看出,一个HDFS集群是有一个Namenode和一定数目的Datanode组成。
●NameNode名称节点
Namenode是一个中心服务器,是HDFS的中枢,负责管理文件系统的目录名字空间信息(namespace)和客户端对文件的访问,并且管理所有的DataNode;
●DataNode数据节点
Datanode在HDFS中一般是一个节点一个,负责管理节点上它们附带的存储的Block(数据块)。
在HDFS内部,文件不是放在一块磁盘上,一个文件其实分成一个或多个block(数据块),这些block存储在Datanode集合中不同的DataNode上,NameNode记录有block对应在不同的DataNode上的映射关系。
从图中可以看到NameNode接受客户端的元数据请求,然后对DataNode发出BlockOps(块操作)指令,文件的创建、删除和复制操作,同时决定block到具体Datanode节点的映射。
Datanode在Namenode的指挥下进行block的创建、删除和复制。
三.1.3NameNode是整个集群的中枢
可以形象的比喻为劳务中介或包工头,NameNode在线只有一个可用,NameNode主要负责:
1.管理HDFS集群中文件系统的名字空间(Namespace)
打开文件系统、关闭文件系统、重命名文件或者目录等;
2.管理客户端对HDFS集群中的文件系统中的文件的访问
实际上文件以块的形式存储在Datanode上,文件系统客户端向Namenode请求所要执行操作的文件块(该块存储在指定的Dadanode数据结点上),然后通过与Datanode结点交互来完成文件读写的操作。
也就是说,Namenode结点还负责确定指定的文件块到具体的Datanode结点的映射关系。
3.管理Datanode结点的状态报告
包括Datanode结点的健康状态报告和其所在结点上数据块状态报告,以便能够及时处理失效的数据结点。
三.1.4DataNode用于存储数据
在HDFS集群中,DataNode(数据节点)可以形象的比喻为农民工,一般是一台节点服务器对应一个DataNode实例,DataNode的任务是:
1.负责管理它所在结点上存储的数据的读写
Datanode数据结点进程还要在Namenode的统一指挥调度下完成对文件块的创建、删除、复制等操作,当与Namenode交互过程中收到了可以执行文件块的文件块操作的命令后,才开始让文件系统客户端执行指定的操作。
2.向Namenode结点报告状态
每个Datanode结点会周期性地向Namenode发送心跳信号和文件块状态报告,以便Namenode获取到工作集群中Datanode结点状态的全局视图,从而掌握它们的状态。
如果存在Datanode结点失效的情况时,Namenode会调度其它Datanode执行失效结点上文件块的复制处理,保证文件块的副本数达到规定数量。
3.执行数据的流水线复制(产生数据冗余)
当文件系统客户端从Namenode服务器进程获取到要进行复制的数据块列表(列表中包含指定副本的存放位置,亦即某个Datanode结点)后,会首先将客户端缓存的文件块复制到第一个Datanode结点上,并且由第一个Datanode向第二个Datanode结点复制,……,如此下去完成文件块及其块副本的流水线复制。
三.1.5HDFS的设计要点
HDFS基于GoogleFileSystem的高可扩展、高可用、高性能、面向网络服务的设计,是通过块结构的文件系统设计来实现的:
(1)在HDFS中的单个文件被分成相同大小的块,这些块被分布到HDFS网络中的多台数据节点(DataNode)的机器上,一个文件可由多个块组成,它们并不需要放到同一台机器上。
(2)保存每个块的机器是由中心服务器-名称节点(NameNode)通过负载均衡随机选择的,因此访问一个文件需要多台机器协作。
(3)使用多台机器保存一个文件,这些机器中任何一台崩溃都会导致文件不可访问,HDFS通过将每块复制到多台机器(默认3台)的方式来保证HDFS的高可用性。
HDFS中默认使用块大小为64MB,这使得HDFS减少了对每个文件元数据的存储量,另外,通过把大量数据连续化存放在磁盘上,就可以快速地流式读取数据。
这种设计的结果是HDFS倾向于处理大文件。
HDFS文件数据是以一次写入,多次读取的方式访问的,元数据结构(文件名,目录名)会被大量客户端同时修改,所以元数据结构信息不适合进行同步,因为节点和节点之间的同步是相当耗费资源的。
HDFS可靠性和性能主要通过数据块的副本来实现,并且HDFS采用一种称之为Rack-aware(机架感知)的策略来改进数据的可靠性、有效性和网络带宽的利用。
比如:
不同的机架间的两台机器的通讯需要通过交换机,显然,同一个机架内的两个节点间的带宽回避不同机架上的两台机器带宽要大。
在通常副本数为3的情况下,HDFS的策略将一个副本存放在本地机架上,一个副本放在同一个机架上的另一个节点,最后一个副本放在不同机架上的一个节点。
在读取时,为了降低整体的带宽消耗和读延时,如果客户端同一个机架上有一个副本,那么就读该副本。
HDFS健壮性的主要目标是实现在失败情况下的数据存储可靠性,常见的三种失败:
Namenodefailures,Datanodefailures和网络分割(networkpartitions)。
1、硬盘数据错误、心跳检测和重新复制
每个Datanode节点都向Namenode周期性地发送心跳包。
Namenode在一段时间内收不到Datanode的心跳包,则认为这个Datanode死掉了,存储在这个Datanode上的数据块无法访问,Namenode开始不断查询哪些数据块需要复制。
一旦出现Datanode死掉或者副本中断或者Datanode磁盘故障,都要开始进行数据重新复制。
2、数据完整性
当一份HDFS文件建立的时候,会生成这份文件的校验和,保存在HDFS命名空间的一个独立的隐藏文件夹中,客户端拷贝文件时,收到文件后就去匹配这些校验和看文件是否完整。
如果不完整,则从另外一个Datanode重新拷贝。
3、负载均衡
HDFS中非常容易出现机器与机器之间磁盘利用率不平衡的情况,比如HDFS中添加新的数据节点。
当HDFS出现不平衡状况的时候,将引发很多问题,比如,机器之间无法达到更好的网络带宽使用率,机器磁盘无法利用等等。
一旦某个Datanode存的数据量低于某个阈值,通过HDFS的Rebalancer程序自动的把其它节点上的数据拷贝过来,使得HDFS达到一个平衡的状态。
4、元数据事务日志和检查点
对于任何对文件系统元数据产生修改的操作,Namenode都会使用一种称为EditLog的事务日志记录下来。
例如,在HDFS中创建一个文件,Namenode就会在Editlog中插入一条记录来表示;整个文件系统的名字空间,包括数据块到文件的映射、文件的属性等,都存储在