常见分布式文件系统
阅读原文时间:2021年04月26日阅读:1

分布式文件系统:

分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。一个典型的网络可能包括多个供多用户访问的服务器。另外,对等特性允许一些系统扮演客户机和服务器的双重角色。例如,用户可以"发表"一个允许其他客户机访问的目录,一旦被访问,这个目录对客户机来说就像使用本地驱动器一样。(服务器间的数据访问从一对多变为多对多)

(1)原始的文件管理系统图:

一、MooseFS(MFS)文件系统

MFS文件系统结构:

(1)包含4种角色:  

        管理服务器managing server (master)

        元数据日志服务器Metalogger server(Metalogger)

        数据存储服务器data servers (chunkservers)

        客户机挂载使用client computers

(2)4种角色作用: 

        管理服务器:负责各个数据存储服务器的管理,文件读写调度,文件空间回收以及恢复.多节点拷贝

        元数据日志服务器: 负责备份master服务器的变化日志文件,文件类型为changelog_ml.*.mfs,以便于在master server出问题的时候接替其进行工作

        数据存储服务器:负责连接管理服务器,听从管理服务器调度,提供存储空间,并为客户提供数据传输.

        客户端: 通过fuse内核接口挂接远程管理服务器上所管理的数据存储服务器,.看起来共享的文件系统和本地unix文件系统使用一样的效果.

1.3、环境搭建和测试用例:

http://bbs.chinaunix.net/thread-1643863-1-1.html

1.4、执行图解:

二、Ceph文件系统:

是加州大学圣克鲁兹分校的Sage weil攻读博士时开发的分布式文件系统。性能高、C++编写的代码,支持Fuse,并且没有单点故障依赖,

Ceph最大的特点是分布式的元数据服务器 通过CRUSH,一种拟算法来分配文件的locaiton,其核心是 RADOS(resilient automatic distributed object storage),一个对象集群存储,本身提供对象的高可用,错误检测和修复功能。

Ceph是统一存储系统,支持三种接口。

Object:有原生的API,而且也兼容Swift和S3的API

Block:支持精简配置、快照、克隆

File:Posix接口,支持快照

Ceph也是分布式存储系统,它的特点是:

高扩展性:使用普通x86服务器,支持10~1000台服务器,支持TB到PB级的扩展。

高可靠性:没有单点故障,多数据副本,自动管理,自动修复。

高性能:数据分布均衡,并行化度高。对于objects storage和block storage,不需要元数据服务器。

1、映射:

    Ceph的命名空间是 (Pool, Object),每个Object都会映射到一组OSD中(由这组OSD保存这个Object):

     (Pool, Object) → (Pool, PG) → OSD set → Disk

Ceph中Pools的属性有:

Object的副本数

Placement Groups的数量

所使用的CRUSH Ruleset

Client从Monitors中得到CRUSH MAP、OSD MAP、CRUSH Ruleset,然后使用CRUSH算法计算出Object所在的OSD set。所以Ceph不需要Name服务器,Client直接和OSD进行通信。

2、一致性:

   (1)Ceph的读写操作采用Primary-Replica模型,Client只向Object所对应OSD set的Primary发起读写请求,这保证了数据的强一致性。

   (2)由于每个Object都只有一个Primary OSD,因此对Object的更新都是顺序的,不存在同步问题。

   (3)当Primary收到Object的写请求时,它负责把数据发送给其他Replicas,只要这个数据被保存在所有的OSD上时,Primary才应答Object的写请求,这保证了副本的一致性。

3、容错性:

    (1)在分布式系统中,Ceph能够容忍网络中断、掉电、服务器宕机、硬盘故障等故障,并进行自动修复,保证数据的可靠性和系统可用性。

   (2)Monitors是Ceph管家,维护着Ceph的全局状态。Monitors的功能和zookeeper类似,它们使用Quorum和Paxos算法去建立全局状态的共识。

OSDs可以进行自动修复,而且是并行修复。

4、高性能:

(1)Client和Server直接通信,不需要代理和转发

(2)多个OSD带来的高并发度。objects是分布在所有OSD上。

(3)负载均衡。每个OSD都有权重值(现在以容量为权重)。

(4)client不需要负责副本的复制(由primary负责),这降低了client的网络消耗。

5、高可靠性

(1)数据多副本。可配置的per-pool副本策略和故障域布局,支持强一致性。5

(2)没有单点故障。可以忍受许多种故障场景;防止脑裂;单个组件可以滚动升级并在线替换。

(3)所有故障的检测和自动恢复。恢复不需要人工介入,在恢复期间,可以保持正常的数据访问。

(4)并行恢复。并行的恢复机制极大的降低了数据恢复时间,提高数据的可靠性。

5、高扩展性

(1)高度并行。没有单个中心控制组件。所有负载都能动态的划分到各个服务器上。把更多的功能放到OSD上,让OSD更智能。

(2)自管理。容易扩展、升级、替换。当组件发生故障时,自动进行数据的重新复制。当组件发生变化时(添加/删除),自动进行数据的重分布。

6、缺点:

   不稳定,目前还在试验阶段,不适合生产环境的使用。

三、GlusterFS文件系统:

GlusterFS是Scale-Out存储解决方案Gluster的核心,具有强大的横向扩展能力,支持数PB存储容量和处理数千客户端,GlusterFS借助TCP/IP或InfiniBand RDMA网络将物理分布的存储资源聚集在一起,是用单一全局命名空间来管理。GlusterFS基于可堆叠的用户空间设计,可为各种不同的数据负载提供优异的性能。

1、GlusterFS主要特征:

   (1)扩展性和高性能

         GlusterFS允许通过增加资源来提高存储容量和性能。支持高速网络互联;Gluster弹性哈希(Elastic Hash)解除了GlusterFS对元数据服务器的需求,消除了单点故障和性能瓶颈,真正实现了并行化数据访问。

   (2)高可用性:

     GlusterFS可以对文件进行自动复制,如镜像或多次复制,从而确保数据总是可以访问,同时具有自我修复功能,即使在硬件故障的情况下。GlusterFS采用操作系统中主流标准的磁盘文件系统(如EXT3、ZFS)来存储文件。

   (3)全局统一命名空间:

    全局统一命名空间将磁盘和内存资源聚集成一个单一的虚拟存储池,对上层用户和应用屏蔽了底层的物理硬件。存储资源可以根据需要在虚拟存储池中进行弹性扩展。

   (4)弹性哈希算法

GlusterFS采用弹性哈希算法在存储池中定位数据,而不是采用集中式或分布式元数据服务器索引,消除了IO瓶颈和单点故障,存储系统可以智能地定位任意数据片,不需要查看索引或其他服务器。

   (5)弹性卷管理:

    数据储存在逻辑卷中,逻辑卷可以从虚拟化的物理存储池进行独立逻辑划分而得到。存储服务器可以在线进行增加和移除,不会导致应用中断。逻辑卷可以在所有配置服务器中增长和缩减,可以在不同服务器迁移进行容量均衡,或者增加和移除系统,这些操作都可在线进行。文件系统配置更改也可以实时在线进行并应用,从而可以适应工作负载条件变化或在线性能调优。

2、GlusterFS总体设计:

GlusterFS的组成:

    (1)存储服务器(Brick Server)

    (2)客户端

    (3)NFS/Samba存储网关组成。

作用:

(1)存储服务器:

   主要提供基本的数据存储功能,最终的文件数据通过统一的调度策略分布在不同的存储服务器上。它们上面运行着Glusterfsd进行,负责处理来自其他组件的数据服务请求

四、淘宝分布式文件系统TFS

    TFS(Taobao File System)是一个高可用、高性能、高可扩展的分布式文件系统,基于普通的Linux服务器构建,主要提供海量非结构化数据存储服务。TFS被广泛地的应用在淘宝的各项业务中,目前已部署的最大集群存储文件数已近千亿。 TFS已在TaoCode上开源 (项目主页:http://code.taobao.org/p/tfs/src/),提供给外部用户使用。

TFS集群的组成:

     (1)名字服务器(nameserver)

     (2)数据服务器(dateserver)

TFS的性质:

     (1)TFS以数据块(block)为单位存储和组织数据。

     (2)TFS将多个小文件存储在同一个block中,并为block建立索引,便以便快速在block中定位文件。

     (3)每个block会存储多个副本到不同的机架上,以保证数据的高可靠性。

     (4)每个block在集群中拥有全局唯一的数据块编号(block id),block id由nameserver创建时分配。Block中的文件拥有唯一的文件编号(file id),file id由dateserver在存储文件时分配。

     (5)block id和file id组成的二元组唯一标识一个集群里的文件

2、存储机制:

    Namserver上的所有元信息都保存在内存,并不进行持久化存储,dataserver启动后,会汇报其拥有的block信息给nameserver,nameserver根据这些信息来构建block到server的映射关系表,根据该映射关系表,为写请求分配可写的block,为读请求查询block的位置信息。Nameserver有专门的后台线程轮询各个block和server的状态,在发现block缺少副本时复制block(通常是由dataserver宕机导致的);在发现dataserver负载不均衡时,迁移数据来保证服务器间的负载均衡。

3、TFS集群:

    TFS集群通过多副本机制来保证数据的可靠性,同时支持多机房容灾,具体做法是在多个机房各部署一个TFS物理集群,多个物理集群的数据通过集群间的同步机制来保证数据互为镜像,构成一个大的逻辑集群。

主集群同时提供读写服务,备集群只提供读服务,主集群上存储的所有文件都会由对应的dataserver记录同步日志,日志包含文件的block id和fileid以及文件操作类型(写、删除等),并由dataserver的后台线程重放日志,将日志里的文件操作应用到备集群上,保证主备集群上存储的文件数据保持一致的状态。

5、TFS的缺点:

(1)通用性方面。TFS目前只支持小文件的应用,大文件应用是不支持的。对小图片、网页等几十KB内的数据存储非常适用,但对视频点播VOD、文件下载等应用暂时无法适用。

(2)性能方面。Client写文件是同步处理的,需要等所有dataserver写成功后才能返回,这很是影响性能。

(3)用户接口。TFS没有提供POSIX接口,提供的API也与标准接口不一致。另外,TFS有自己的文件命名规则,如果用户使用自定义的文件名,则需要自已维护文件名与TFS文件名之间的映射关系。

(4)代码方面。使用了C++实现,感觉相对臃肿一点,如果用纯C实现应该会简洁不少(可能我C中毒太深了)。代码注释基本没有,代码质量也不是很好。

MFS、Ceph、GlusterFS、

Lustre、hadoopFS的比较

MSD:虚拟光驱的镜像文件

MooseFS(MFS)

Ceph

GlusterFS

LustreFs

hadoopFS

  Metadata server

  (元数据服务器)

单个MDS,存在单点故障和拼劲

多个MDS,不存在单点故障和瓶颈。MDS可以扩展,不存在瓶颈。

无,不存在单点故障。靠运行在各个节点上的动态算法来代替MDS,不需同步元数据,无硬盘I/O瓶颈。

双MDS(互相备份)。MDS不可以扩展,存在瓶颈。

有。存在单点故障。

Namenode是一个中心服务器,负责管理文件系统的命名空间以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。

FUSE(用户空间文件系统、挂载某些网络空间)客户端必须装

支持

支持

支持

支持

支持

访问接口

POSIX

POSIX

POSIX

POSIX/MPI

POSIX

文件分布/数据分布

文件被分片,数据块保存在不同的存储服务器上。

文件被分片,每个数据块是一个对象。对象保存在不同的存储服务器上。

Gluster Translators(GlusterFS集群核心包),包括AFR、DHT、Stripe三种类型。

(1)AFR相当于RAID1,每个文件都被复制到多个存储节点上。

(2)Stripe相当于RAID0,文件被分片,数据被条带化到各个存储节点上。

(3)Translators可以组合,即AFR和stripe可以组成RAID10,实现高性能和高可用。

可以把大文件分片并以类似RAID0的方式分散存储在多个存储节点上。

一个典型的数据块大小是64MB。因而,HDFS中的文件总是按照64M被切分成不同的块,每个块尽可能地存储于不同的Datanode中

亢余保护/副本

多副本

多副本

镜像

数据可靠性

由数据的多副本提供可靠性

由数据的多副本提供可靠性。

由镜像提供可靠性。

由存储节点上的RAID1或RAID5/6提供可靠性。假如存储节点失效,则数据不可用。

备份

提供备份工具。支持远程备份

故障恢复

手动恢复

当节点失效时,自动迁移数据、重新复制副本。

当节点、硬件、磁盘、网络发生故障时,系统会自动处理这些故障,管理员不需介入。

扩展性

增加存储服务器,可以提高容量和文件操作性能。但是由于不能增加MDS,因此元数据操作性能不能提高,是整个系统的瓶颈。

可以增加元数据服务器和存储节点。容量可扩展。文件操作性能可扩展。元数据操作性能可扩展。

容量可扩展。

可增加存储节点,提高容量可文件操作性能,但是由于不能增加MDS,因此元数据操作性能不能提高,是整个系统的瓶颈。

安装和部署

简单

简单

简单

复杂。而且Lustre严重依赖内核,需要重新编译内核。

开发语言

C

C++

C

C

JAVA

适合场景

大量小文件读写

小文件

适合大文件。

对于小文件,无元数据服务设计解决了元数据的问题。但GlusterFS并没有在I/O方面作优化,在存储服务器底层文件系统上仍然是大量小文件,本地文件系统元数据访问是瓶颈,数据分布和并行性也无法充分发挥作用。因此,GlusterFS的小文件性能还存在很大优化空间

大文件读写

产品级别

小型

中型

中型

大型

应用

国内较多

较多用户使用

HPC领域

优缺点

(1)实施简单,但是存在单点故障。

(2)不停服务扩容。MFS框架做好后,随时增加服务器扩充容量;扩充和减少容量皆不会影响现有的服务。注:hadoop也实现了这个功能。

(3)高可靠性:数据能被分成几个副本存储在不同的服务器上。

不稳定,目前还在实验阶段,不适合于生产环境。

无元数据服务器,堆栈式架构(基本功能模块可以进行堆栈式组合,实现强大功能)。具有线性横向扩展能力。

由于没有元数据服务器,因此增加了客户端的负载,占用相当的CPU和内存。

但遍历文件目录时,则实现较为复杂和低效,需要搜索所有的存储节点。因此不建议使用较深的路径。

很成熟、很庞大。

2、LustreFS、HadoopFs、GlusterFS的比较:

LustreFS

HadoopFS

GlusterFS

Metadata Server

有。存在单点故障。

MDS使得用户可以访问到存储在一个或多个MDT上的元数据。每个MDS管理着LustreFS中的文件名和目录,并且为一个或者多个MDT提供网络请求处理。

有。存在单点故障。

Namenode是一个中心服务器,负责管理文件系统的命名空间以及客户端对文件的访问。集群中的Datanode一般是一个节点一个,负责管理它所在节点上的存储。

无。不存在单点故障。

靠运行在各个节点上的动态算法来代替MDS,不需同步元数据,无硬盘I/O瓶颈。

POSIX兼容

不完全。为了实现对文件的流式读取,放宽了对POSIX的要求

用户/组的配额

支持

支持

不详

权限控制

Access Control List (ACL)

独立实现的一个和POSIX系统类似的文件和目录的权限模型

不详

快照

Lustre可以创建所有卷的快照,并且在快照系统中把他们集合在一起,以供Lustre挂载。

利用快照,可以让HDFS在数据损坏时恢复到过去一个已知正确的时间点。HDFS目前还不支持快照功能,但计划在将来的版本进行支持。

不支持

网络支持

可支持各种网络,如 Infiniband(光纤),TCP/IP, Quadrics Elan, Myrinet (MX and GM) 和 Cray。

只支持TCP/IP

支持很多种网络,如千兆以太网,百兆以太网,Infiniband(光纤)。

文件分割

采用RAID 0模式,将数据分割到一定数量的对象中去,每个对象包含很多数据块。当一个被写入的数据块超过了这个对象的容量时,下一次写入将被存储到下一个目标中。Lustre可以把文件最多分布到160个目标存储上。

一个典型的数据块大小是64MB。因而,HDFS中的文件总是按照64M被切分成不同的块,每个块尽可能地存储于不同的Datanode中。

不支持

备份及恢复

提供两个备份工具,一个用于扫描文件系统,一个用于打包备份和加压恢复。

支持数据复制。采取一定的策略,将文件的多个副本存放到不同的节点。在读取副本的时候,系统会自动选择最近的副本。

支持数据复制,提供全局的命名空间。多个文件的多个副本可以被放置到不同的host上去。这意味着,host以及所有与其相关的磁盘可以因为任何原因而下线,而由其它弄得host来担任文件的完整副本(例如网络分割,甚至只是系统维护)。读取副本时,系统会选择最近的副本。

故障自救

Lustre中的MDS可以被配置成一个主动/被动对,而OSS通常被配置成主动/主动对,这样可以提供没有任何开销的冗余。通常,热备的MDS是另一个LustreFS的活跃MDS,所以在集群之中不会出现空闲的设备。

心跳信号检测机制。每个Datanode节点周期性地向Namenode发送心跳信号。

Namenode是HDFS集群中的单点故障所在。如果Namenode机器故障,是需要手工干预的。目前,自动重启或在另一台机器上做Namenode故障转移的功能还没实现。

当系统中出现永久性损坏的时候(如一台服务器的磁盘发生故障,导致本地文件无法读取),系统会更换主机并将其加入集群,并自动开始恢复过程。Gluster对一些假定的故障(如硬件故障, 磁盘故障,网络被分割,以外断电)都有处理预案,系统会自动处理这些故障,而不需要管理员的参与。

技术支持

Sun Microsystems

Apache Hadoop项目组

Gluster

商业应用

为全球100大高性能存储计算(High-Performance Computing-HPC)集群中的40%多提供支持。目前已经拥有成千上万的客户端系统,PB级的存储,数百GB/s的I/O吞吐量。由于Lustre的可扩展性,它在石油,燃气,制造业,媒体,金融等行业得到广泛应用。近年来在ISP(Internet Service Provider)方面的应用呈现增长趋势。

Hadoop由Doug Cutting在2004年开始开发,2008年开始流行于中国,2009年在中国已经火红,包括中国移动、百度、网易、淘宝、腾讯、金山和华为等众多公司都在研究和使用它,另外还有中科院、暨南大学、浙江大学等众多高校在研究它。

世界各地有100多个地区在测试或者使用Guster。大多集中在欧洲和美国地区。亚洲及中国用户较少。

动态扩容

件数据存在OSS上的对象中。LustreFS的容量以及总的存储带宽可以在不打断任何操作的情况下,通过增加新的带有OST的OSS来实现动态扩展。

不详

支持动态扩容。可以通过简单的操作动态增加存储,服务器和客户端。

扩展能力

高扩展性。在产业化环境中,大多数集群的客户端节点在1万到2万左右,最多可以支持到2.6万个客户端节点。目前足以支持40PB的文件系统。

在一个集群里可扩展到数百个节点。一个单一的HDFS实例应该能支撑数以千万计的文件。

支持线性扩展。可以轻松地扩展到数百PB的量级。

安装

略微复杂

简单

简单。在Ubuntu等发行版Linux中有内嵌的软件源的支持。

开发语言

C

Java

C

I/O特性

Lustre在产业化环境中的部署目前可以提供100 GB/s的性能。在试验环境中,可以达到130GB/s以及13000 creates/s的性能。

Lustre单独客户端的节点的吞吐量最大可以达到2 GB/s,而OSS最大可以达到2.5 GB/s。在Oak Ridge National Laboratories,Lustre运行在Spider File System上,达到了240 GB/s的性能。

在千兆以太网中,写的速度保持在100 MB/s左右。

千兆以太网中,写的速度保持在65 MB/s左右。读的速度保持在117 MB/s左右。但对小文件的写入则只有3 MB/s左右的速度。