Hadoop的分布式文件系统HDFS主要是借鉴了Google发表的论文:The Google File System。该文件系统最大的优点是可以利用很多低配的计算机搭建高扩展和高容错性的分布式文件系统,另外,HDFS放宽了POSIX关于I/O的规定,因为HDFS需要解决的是write-once-read-many问题,所以串行化和流处理技术被应用到HDFS中。

HDFS的设计目的主要是下面几个方面:

  1. 硬件故障:由于HDFS是由很多低配的计算机构成,所以每个节点发生故障的概率很大,HDFS需要能够保证在硬件发生故障时不会影响数据的正常操作,并且故障节点可以自动恢复;
  2. 流数据处理:主要目的是实现高吞吐率的数据访问;
  3. 大数据集:为了处理大数据集,HDFS需要提供很高的数据访问带宽以及高扩展性;
  4. 简单的一致性模型(coherency model):只需要满足write-once-read-many的数据访问模型即可,不需要过多考虑写入操作带来的多节点一致性问题;
  5. 迁移计算:HDFS尽可能保证运算与数据处于同一个节点上面,所以当需要处理的数据和计算不在同一个节点时,会将计算迁移而非数据,这也是考虑到数据规模太大;
  6. 可移植性:可以为多种应用提供底层存储。

在对HDFS的学习中,主要从系统架构、文件系统命名空间、数据备份等等几个方面着手,今天这篇文章的内容是系统架构。

一、业界调研

在介绍HDFS系统架构之前,我们先来了解一些现有的分布式文件系统架构:

1. GFS

GFS(Google File System)是HDFS的原型,所以在架构设计上很相似。如上图所示,Master和Chunk Server就相当于HDFS总的Name Node和Data Node,详见HDFS的介绍。

2. Ceph

../_images/stack.png

Ceph文件系统是建立在RADOS基础上的,RADOS本身是一个对象存储系统(RADOS - A Scalable, Reliable Storage Service for Petabyte-scale Storage Clusters),上图展示了Ceph整体的系统结构,Ceph FS相当于在RADOS建立的一个VFS。

对于一个文件,其存储过程如下(参见:Ceph: A Scalable, High-Performance Distributed File System):

对于任意文件,Ceph都会将其切分为多个Object,然后通过Hash分配到PG(Placement Group)中,最后由CRUSH算法将PG分配到一组OSD(Object Storage Disk)上面。

3.  FhGFS

FhGFS是由德国ITWM( the Fraunhofer Institute for Industrial Mathematics)开发的并行文件系统,重点关注的是数据吞吐率。下图展示了它的系统架构(引自:http://www.fhgfs.com/wiki/wikka.php?wakka=SystemArchitecture):

FhGFS System Architecture

主要包括三个部分:Client、Metadata Servers、Storage Servers。注意这三个部分可能并不是相互独立的节点,同一个节点上面可以同时运行两个或三个角色。除了这三个角色以外,还包括Management Serveic和可选的administration and monitoring service,前者负责管理全局的配置信息,后者负责为系统安装和监控提供可视化的前台图形展示。

4. GlusterFS

Gluster和Ceph很相似,都是开源系统,都是基于低配计算机搭建,节点间都可以相互备份,并且都是通过算法确定数据的存储位置。但它们也有区别,主要包含以下几点,比如GlusterFS使用环形一致性哈希策略,而Ceph使用CRUSH算法;Gulster只包含一种类型的服务节点,而Ceph有两种。这里不对GulsterFS做过多介绍。

5. Lustre

Lutre常用在超级计算机中,比如著名的泰坦(前不久刚被中国的天河二号打败),它具有很高的扩展性,它可以由上万节点的多个集群构成,存储数据可以达到数十PB级,吞吐率可以达到每秒TB级。下图展示了其系统结构:


二、HDFS

HDFS跟Google的DFS很像,见下图:


可以看出DFS中的Master和Chunk Server对应这里的Namenode和Datanode,Namenode负责维护这个系统的元数据信息,包括命名空间、数据块的位置信息等等;Datanode主要负责存储数据和备份其它Datanode的数据,关于数据一致性维护和备份机制在后面的文章中进行总结。

HDFS采取这种Namenode控制全局元数据信息,主要目的是为了实现数据的高可用性和一致性,但同时增加了SPoF(Single Point of Failure)风险的,所以一般情况下还会增加SecondNamenode,作为Namenode的备份。

另外,上图展示的Namenode和Datanode以及SecondNamenode都不一定对应一个节点,它们其实是不同的系统进程,很多时候可以共用一个节点,尤其是搭建伪分布环境。

对于任何数据,HDFS都会将其分割成固定大小的块(默认64M)进行存储,这样的好处一方面是为了避免操作系统对于大文件的限制,另一方面也是考虑到数据的迁移和备份的方便,便于对数据进行并行处理,这也是HDFS支持MapReduce的优势所在。

今天先写到这,待续。。。


Logo

开源、云原生的融合云平台

更多推荐