您的位置:首页 > 运维架构

Lustre、HDFS、MogileFS、FastDFS、NFS、OpenAFS、MooseFS、pNFS、以及GoogleFS

2013-07-08 22:54 706 查看
1. Lustre
      lustre是一个大规模的、安全可靠的,具备高可用性的集群文件系统,它是由SUN公司开发和维护。该项目主要的目的就是开发下一代的集群文件系统,可以支持超过10000个节点,数以PB的数量存储系统。

  lustre是开放源代码的集群文件系统,采取GPL许可协议,目前在集群计算机里,计算机与磁盘间数据交换的提升无法跟上微处理器和内存增长的速度,从而也拖累了应用程序的性能,一种新兴的集群文件系统软件提高了I/O速度,可能降低企业购买存储设备的成本并改变企业购买存储的方式,集群文件系统已经在大学、实验室和超级计算机研究中心里使用,而且即将进入通用商业计算市场。新的集群文件系统采用了开源的lustre技术,由美国能源部(Department Of Energy)开发,惠普公司(HP)提供商业支持。它显著提高了输入输出(I/O)速度,目前已经在高校、国家实验室和超级计算研究中心产生了一定影响,未来几年中,它很有可能进入普通的商业计算机领域。

  运行在linux下,开发语言c/c++

website: www.lustre.org

 

2. HDFS

2.1 数据块(block)

       HDFS(Hadoop Distributed File System)默认的最基本的存储单位是64M的数据块。和普通的块文件系统相同的是,HDFS中的文件是被分成64M一块的数据块存储的。不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,会占用整个存储块的空间。

 

2.2 元数据节点(Namenode)和数据节点(datanode)

       元数据节点用来管理文件系统的命名空间其将所有的文件和文件夹的元数据保存在一个文件系统树中。这些信息也会在硬盘上保存成以下文件:命名空间镜像(namespace image)及修改日志(edit log)其还保存了一个文件包括哪些数据块,分布在哪些数据节点上。然而这些信息并不存储在硬盘上,而是在系统启动的时候从数据节点收集而成的。数据节点是文件系统中真正存储数据的地方。客户端(client)或者元数据信息(namenode)可以向数据节点请求写入或者读出数据块。其周期性的向元数据节点回报其存储的数据块信息。从元数据节点(secondary
namenode)从元数据节点并不是元数据节点出现问题时候的备用节点,它和元数据节点负责不同的事情。其主要功能就是周期性将元数据节点的命名空间镜像文件和修改日志合并,以防日志文件过大。这点在下面会相信叙述。合并过后的命名空间镜像文件也在从元数据节点保存了一份,以防元数据节点失败的时候,可以恢复。



[align=left] [/align]

NameNode目录结构
VERSION文件是java properties文件,保存了HDFS的版本号。



[align=left] [/align]

VERSION文件
layoutVersion是一个负整数,保存了HDFS的持续化在硬盘上的数据结构的格式版本号。

namespaceID是文件系统的唯一标识符,是在文件系统初次格式化时生成的。

cTime此处为0

storageType表示此文件夹中保存的是元数据节点的数据结构。

其他文件(edits, fsimage, fstime)
集群中的名称节点(NameNode)会把文件系统的变化以追加保存到日志文件edits中。 当名称节点(NameNode)启动时,会从镜像文件 fsimage 中读取HDFS的状态,并且把edits文件中记录的操作应用到fsimage,也就是合并到fsimage中去。合并后更新fsimage的HDFS状态,创建一个新的edits文件来记录文件系统的变化
那么问题来了,只有在名称节点(NameNode)启动的时候才会合并fsimage和edits,那么久而久之edits文件会越来越大,特别是大型繁忙的HDFS集群。这种情况下,由于某种原因你要重启名称节点(NameNode),那么会花费很长的时间去合并fsimge和edits,然后HDFS才能运行。

为了解决上述问题,在hadoop-0.20.2中可以设置fs.checkpoint.period 使得secondary namenode定时合并两个文件(具体过程如下)



[align=left] [/align]

数据节点数据存储结构



[align=left] [/align]

VERSION文件:



[align=left] [/align]

blk_<id>保存的是HDFS的数据块,其中保存了具体的二进制数据。

blk_<id>.meta保存的是数据块的属性信息:版本信息,类型信息,和checksum

当一个目录中的数据块到达一定数量的时候,则创建子文件夹来保存数据块及数据块属性信息。

 

2.3 安全模式
       NameNode启动时,是在安全模式下的。它首先将fsimage载入内存,并执行edit log中的各项操作。一旦在内存中成功创建文件系统元数据的映像,则创建一个新的fsimage文件(不需要借助Secondary NameNode)和一个空的编辑日志。此时NameNode监听RPC和HTTP请求。这个过程NameNode的文件系统对于客户端来说是只读的。由于在安全模式下,写、删除或重命名等操作都会失败。

        需要强调的是数据块的位置并不是NameNode维护的,而是以块列表的形式存储在DataNode中。在系统的正常操作期间,NameNode会在内存中保留所有块位置的映射信息。各个DataNode会向NameNode检查块列表信息(即向NameNode发送块列表的最新情况),NameNode了解到足够多的块位置信息之后,即可高效运行文件系统。但如果NameNode没有检查到足够多的DataNode,则需要将块复制到其他DataNode,而大多数情况下这都不必要的(因为只要等待检查到若干DataNode检入),这会浪费很多资源。所以需要安全模式,在安全模式下NameNode并不向DataNode发出任何块复制或删除的指令。如果满足“最小复本条件”,NameNode会在30秒后退出安全模式,所谓最小复本条件指在整个文件系统中99.9%的块满足dfs.replication.min属性设置的值即可。

 

 

2.4 数据流

2.4.1 文件读取数据流



[align=left] [/align]

使用HDFS提供的客户端开发库,向远程的Namenode发起RPC请求;

Namenode会视情况返回文件的部分或者全部block列表,对于每个block,Namenode都会返回有该block拷贝的datanode地址;

客户端开发库会选取离客户端最接近的datanode来读取block;

读取完当前block的数据后,关闭与当前的datanode连接,并为读取下一个block寻找最佳的datanode;

当读完列表的block后,且文件读取还没有结束,客户端开发库会继续向Namenode获取下一批的block列表。

读取完一个block都会进行checksum验证,如果读取datanode时出现错误,客户端会通知Namenode,然后再从下一个拥有该block拷贝的datanode继续读。

 



[align=left] [/align]

 
 

使用HDFS提供的客户端开发库,向远程的Namenode发起RPC请求;

Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则
b4a6
会让客户端抛出异常;

当客户端开始写入文件的时候,开发库会将文件切分成多个packets,并在内部以"data queue"的形式管理这些packets,并向Namenode申请新的blocks,获取用来存储replicas的合适的datanodes列表,列表的大小根据在Namenode中对replication的设置而定。

开始以pipeline(管道)的形式将packet写入所有的replicas中。开发库把packet以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给在此pipeline中的下一个datanode,直到最后一个datanode,这种写数据的方式呈流水线的形式。

最后一个datanode成功存储之后会返回一个ack packet,在pipeline里传递至客户端,在客户端的开发库内部维护着"ack queue",成功收到datanode返回的ack packet后会从"ack queue"移除相应的packet。

如果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除,剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持replicas设定的数量。

 

授权协议apache,开发语言java,资源耗费有点大。

 

  MogileFs

  Mogile Fs是一个开源的分布式文件系统,主要特征包括

  1、应用层的组件

  2、无单点故障

  3、自动文件复制

  4、具有比RAID更好的可靠性

  5、无需RAID nigukefs支持 ,运行在linux下。

 

FastDFS(code.google.com/p/fastdfs)

  FastDFS是一个开源的分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务, 如相册网站,视频网站等等。FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度的工作,在访问上起负载均衡的作用。存储节点存储文件,完成文件管理的所有功能:

  存储、同步、和提供存取接口,FastDFS同时对文件的meta data进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key value pair)方式表示,如:width=1024,其中的key为width,value为1024。文件meta data是文件属性列表,可以包含多个键值树。

  开发语言c/c++,运行在linux系统下。



[align=left] [/align]

FastDFS是为互联网应用量身定做的分布式文件系统,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标。和现有的类Google FS分布式文件系统相比,FastDFS的架构和设计理念有其独到之处,主要体现在轻量级、分组方式和对等结构三个方面。
(未完待续)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息