MogileFS和FastDFS分布式文件系统

1、分布式文件系统

为了应对海量数据的存储和处理,分布式文件系统应运而生。
那什么是分布式文件系统?分布式文件系统将数据在物理上分布到多个存储节点上存储,并对这些存储节点进行同一管理和分配,向用户提供文件系统访问接口。

分布式文件系统具有的特性

  • 高扩展性:可简单快速添加数据节点进行扩容操作

  • 冗余性:同一数据在多个节点上拥有多个副本,保证某一节点宕机数据不会丢失

  • 数据复制:文件系统可自行完成数据副本的创建

  • 空间平衡:保持多个存储节点的存储空间使用率均衡

  • 高IO能力:由于数据分散在多个节点存储,并行操作IO能力强于单机系统

  • 廉价性

2、MogileFS介绍

MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群,由 LiveJournal 旗下 Danga Interactive 公司开发,Danga 团队开发了包括 Memcached、MogileFS、Perlbal 等不错的开源项目:(注:Perlbal 是一个强大的 Perl 写的反向代理服务器)。MogileFS非常适用于存储海量小文件,比如图片,小段视频。

2.1 MogileFS角色介绍

Application:

存储和下载的客户端

Tracker:

运行的进程为mogilefsd。基于事件模型的父进程负责管理所有来自客户端的请求,均衡请求发送到各个查询线程,处理子进程间的所有通信。mogilefsd下的子进程包含:

  • Replication :自动复制数据副本

  • Deletion:删除线程

  • Query:应答客户端请求

  • Reaper:某节点失败后,自动补充丢失的数据副本到其他节点上

  • Monitor:监控节点和存储设备的健康和状态

Database:

MogileFS的元数据存储在数据库中,元数据包含命名空间和文件存储位置信息

Storage Nodes:

运行进程为mogstored,依赖于Perbal。存储数据的节点。Tracker与Storage Nodes 通信采用http协议。
图片描述

2.2 MogileFS 基本概念

domain:

上传的每一个文件对应一个fid,等同于key的概念。MogileFS允许定义多个域来存放数据,每个域中的key值必须唯一,不同的域中的key可以相同。

class:

class是每个域中最小数据副本复制的最小单元,也即数据副本是按class进行整体复制。同时也定义了文件属性,如数据副本的数量等等。

2、FastDFS

FastDFS是国人使用c++研发的一款轻量级分布式文件系统,同样适合存储海量小文件。

2.1 FastDFS角色介绍

Tracker:

Tracker在客户端与存储节点之间扮演协调者角色,它负责管理所有storage node 和group,在多个group间负载均衡数据存储以及接受客户端的数据请求。每个storage启动之后向tracker汇报自己所属group及健康信息,由此,在内存中tracker维护这些很少的元数据,即group与storage的映射关系。
这使得tracker的扩展十分容易,所有的tracker都会接收来自storage的报告信息,生成元数据之后提供读写服务。

Storage:

存储数据的节点,保存文件的元数据信息,完成客户端的数据请求。storage是以group为单位组织起来的,一个group包含至少一个storage,group内的storage互为备份存储相同的数据,做到冗余功能。每个storage下允许挂载多个目录,数据存储在本地文件系统上。

client:

数据请求者,以特定协议与tracker和storage通信,并保存上传文件后storage返回的key。
图片描述

2.2 一个上传流程

前提是storage不断向tracker汇报状态信息,当客户端向tracker提交上传请求,tracker根据调度规则挑选一个group,并把group中一个storage的地址信息返回给客户端,客户端继而将文件上传至该storage中,storage根据规则选择一个目录存储数据,storage存储成功后返回一个文件存储路径信息。路径信息由多个字段拼接而成。其中fileid包含了丰富信息,上传的源storageIP地址,文件创建时间戳,文件大小,文件后缀,再加上文件crc32和一个随机数,然后进行base64编码而成。具体返回的路径信息如下:
图片描述
需要注意的是,文件在一个storage存储完成之后便认为上传成功,之后源storage向group内其他storage提供文件元数据信息,其他节点自行复制数据。假如在同步的过程中,源storage失败,则本次上传的数据将丢失,如果想要避免这种风险,需要在客户端写好双重写代码。
图片描述

2.3 一个下载流程

客户端向tracker发送路径地址提交下载请求,tracker解析路径地址得到group信息,源storageIP,时间戳等信息后,根据规则挑选一个最佳storage地址信息返回给客户端,客户端再发送请求到指定storage,storage检索到后将数据发送给客户端。
在下载流程中,tracker挑选storage的细节:由于同一group内storage以异步形式存储数据,所以当源storage存储数据完成后,客户端马上请求刚刚上传的数据,这时其他storage节点很有可能没有完成数据同步,所以tracker需要根据时间戳信息进行判断哪些storage可接受客户端的数据请求。
图片描述

3、MogileFS和FastDFS比较

FastDFS的性能要优于MogileFS,原因在于,FastDFS采用c++较为底层的语言实现,效率要比perl编写的MogileFS高,而且FastDFS裁剪了DB这一角色,将元数据直接保存在storage中更加提升了性能。
FastDFS缺点在于,当一个storage中的某一目录挂载的磁盘损坏的话,不能进行自动恢复,需要手动恢复比较麻烦。

阅读 3k

推荐阅读
布朗克
用户专栏

勿忘初心

2 人关注
6 篇文章
专栏主页