分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。一个典型的网络可能包括多个供多用户访问的服务器。另外,对等特性允许一些系统扮演客户机和服务器的双重角色。例如,用户可以“发表”一个允许其他客户机访问的目录,一旦被访问,这个目录对客户机来说就像使用本地驱动器一样。
判断一个分布式文件系统是否优秀,取决于以下三个因素:
目前主流的分布式文件系统有:GFS、HDFS、Ceph、Lustre、MogileFS、MooseFS、FastDFS、TFS、GridFS等。
Google公司为了满足本公司需求而开发的基于Linux的专有分布式文件系统。尽管Google公布了该系统的一些技术细节,但Google并没有将该系统的软件部分作为开源软件发布。
Hadoop 实现了一个分布式文件系统,简称HDFS。Hadoop是Apache Lucene创始人Doug Cutting开发的使用广泛的文本搜索库。它起源于Apache Nutch,后者是一个开源的网络搜索引擎,本身也是Luene项目的一部分。Aapche Hadoop架构是MapReduce算法的一种开源应用,是Google开创其帝国的重要基石。
参考链接:
http://hadoop.apache.org/docs/r2.9.1/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
是加州大学圣克鲁兹分校的Sage Weil攻读博士时开发的分布式文件系统。并使用Ceph完成了他的论文。
由于 ceph 使用 btrfs 文件系统, 而btrfs 文件系统需要 Linux 2.6.34 以上的内核才支持。ceph目前还不足够成熟,它基于的btrfs本身也不成熟,它的官方网站上也明确指出不要把ceph用在生产环境中。
参考链接:
https://github.com/ceph/ceph
https://ceph.com
Lustre是一个大规模的、安全可靠的,具备高可用性的集群文件系统,它是由SUN公司开发和维护的。该项目主要的目的就是开发下一代的集群文件系统,可以支持超过10000个节点,数以PB的数据量存储系统。目前Lustre已经运用在一些领域,例如HP SFS产品等。
参考链接:
http://lustre.org/
支持FUSE,相对比较轻量级,对master服务器有单点依赖,用perl编写,性能相对较差,国内用的人比较多。
参考链接:
https://moosefs.com
https://sourceforge.net/projects/moosefs/?source=directory
https://www.cnblogs.com/hjc4025/p/9956988.html
由memcahed的开发公司danga一款perl开发的产品,目前国内使用mogielFS的有图片托管网站yupoo等。MogileFS是一套高效的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上。
参考链接:
https://github.com/mogilefs
是一款类似Google FS的开源分布式文件系统,是纯C语言开发的。FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
参考链接:
https://github.com/happyfish100/fastdfs
https://www.cnblogs.com/shenxm/p/8459292.html
开源分布式横向扩展文件系统,可以根据存储需求快速调配存储,内含丰富的自动故障转移功能,且摈弃集中元数据服务器的思想。适用于数据密集型任务的可扩展网络文件系统,具有可扩展性、高性能、高可用性等特点。gluster于2011年10月7日被red hat收购。
参考链接:
http://www.gluster.org
https://blog.csdn.net/liuaigui/article/details/6284551
TFS是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器 集群上,可为外部提供高可靠和高并发的存储访问。TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求,被广泛地应用 在淘宝各项应用中。它采用了HA架构和平滑扩容,保证了整个文件系统的可用性和扩展性。同时扁平化的数据组织结构,可将文件名映射到文件的物理地址,简化 了文件的访问流程,一定程度上为TFS提供了良好的读写性能。
参考链接:
http://code.taobao.org/p/tfs/src/
MongoDB是一种知名的NoSql数据库,GridFS是MongoDB的一个内置功能,它提供一组文件操作的API以利用MongoDB存储文件,GridFS的基本原理是将文件保存在两个Collection中,一个保存文件索引,一个保存文件内容,文件内容按一定大小分成若干块,每一块存在一个Document中,这种方法不仅提供了文件存储,还提供了对文件相关的一些附加属性(比如MD5值,文件名等等)的存储。文件在GridFS中会按4MB为单位进行分块存储。
参考链接:
https://docs.mongodb.com/manual/core/gridfs
文件系统 | 开发者 | 开发语言 | 开源协议 | 易用性 | 适用场景 | 特性 | 缺点 |
---|---|---|---|---|---|---|---|
GFS | 不开源 | ||||||
HDFS | Apache | Java | Apache | 安装简单,官方文档专业化 | 存储非常大的文件 | 大数据批量读写,吞吐量高;一次写入,多次读取,顺序读写 | 难以满足毫秒级别的低延时数据访问;不支持多用户并发写相同文件;不适用于大量小文件 |
Ceph | 加州大学圣克鲁兹分校Sage Weil | C++ | LGPL | 安装简单,官方文档专业化 | 单集群的大中小文件 | 分布式,没有单点依赖,用C编写,性能较好 | 基于不成熟的btrfs,自身也不够成熟稳定,不推荐在生产环境使用 |
Lustre | SUN | C | GPL | 复杂,而且严重依赖内核,需要重新编译内核 | 大文件读写 | 企业级产品,非常庞大,对内核和ext3深度依赖 | |
MooseFS | Core Sp. z o.o. | C | GPL V3 | 安装简单,官方文档多,且提供Web界面的方式进行管理与监控 | 大量小文件读写 | 比较轻量级,用perl编写,国内用的人比较多 | 对master服务器有单点依赖,性能相对较差 |
MogileFS | Danga Interactive | Perl | GPL | 主要用在web领域处理海量小图片 | key-value型元文件系统;效率相比mooseFS高很多 | 不支持FUSE | |
FastDFS | 国内开发者余庆 | C | GPL V3 | 安装简单,社区相对活跃 | 单集群的中小文件 | 系统无需支持POSIX,降低了系统的复杂度,处理效率更高;实现了软RAID,增强系统的并发处理能力及数据容错恢复能力;支持主从文件,支持自定义扩展名;主备Tracker服务,增强系统的可用性 | 不支持断点续传,不适合大文件存储;不支持POSIX,通用性较低;对跨公网的文件同步,存在较大延迟,需要应用做相应的容错策略;同步机制不支持文件正确性校验;通过API下载,存在单点的性能瓶颈 |
GlusterFS | Z RESEARCH | C | GPL V3 | 安装简单,官方文档专业化 | 适合大文件,小文件性能还存在很大优化空间 | 无元数据服务器,堆栈式架构(基本功能模块可以进行堆栈式组合,实现强大功能),具有线性横向扩展能力;比mooseFS庞大 | 由于没有元数据服务器,因此增加了客户端的负载,占用相当的CPU和内存;但遍历文件目录时,则实现较为复杂和低效,需要搜索所有的存储节点,不建议使用较深的路径 |
TFS | Alibaba | C++ | GPL V2 | 安装复杂,官方文档少 | 跨集群的小文件 | 针对小文件量身定做,随机IO性能比较高;实现了软RAID,增强系统的并发处理能力及数据容错恢复能力;支持主备热倒换,提升系统的可用性;支持主从集群部署,从集群主要提供读/备功能 | 不适合大文件的存储;不支持POSIX,通用性较低;不支持自定义目录结构与文件权限控制;通过API下载,存在单点的性能瓶颈;官方文档少,学习成本高 |
GridFS | MongoDB | C++ | 安装简单 | 通常用来处理大文件(超过16M) | 可以访问部分文件,而不用向内存中加载全部文件,从而保持高性能;文件和元数据自动同步 |
文件系统 | 数据存储方式 | 集群节点通讯协议 | 专用元数据存储点 | 在线扩容 | 冗余备份 | 单点故障 | 跨集群同步 | FUSE挂载 | 访问接口 |
---|---|---|---|---|---|---|---|---|---|
HDFS | 文件 | 私有协议(TCP) | 占用MDS | 支持 | 存在 | 不支持 | 支持 | 不支持POSIX | |
Ceph | 对象/文件/块 | 私有协议(TCP) | 占用MDS | 支持 | 支持 | 存在 | 不支持 | 支持 | POSIX |
Lustre | 对象 | 私有协议(TCP)/ RDAM(远程直接访问内存) | 双MDS | 支持 | 不支持 | 存在 | 未知 | 支持 | POSIX/MPI |
MooseFS | 块 | 私有协议(TCP) | 占用MFS | 支持 | 支持 | 存在 | 不支持 | 支持 | POSIX |
MogileFS | 文件 | HTTP | 占用DB | 支持 | 不支持 | 存在 | 不支持 | 不支持 | 不支持POSIX |
FastDFS | 文件/块 | 私有协议(TCP) | 无 | 支持 | 支持 | 不存在 | 部分支持 | 不支持 | 不支持POSIX |
GlusterFS | 文件/块 | 私有协议(TCP)/RDAM(远程直接访问内存) | 无 | 支持 | 支持 | 不存在 | 支持 | 支持 | POSIX |
TFS | 文件 | 私有协议(TCP) | 占用NS | 支持 | 支持 | 存在 | 支持 | 未知 | 不支持POSIX |
什么是POSIX?
POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),也就是Unix下应用程序共同遵循的一种规范。支持POSIX的应用程序意味着在各个Unix系统间提供了跨平台运行的支持。
适合做通用文件系统的有:Ceph,Lustre,MooseFS,GlusterFS;
适合做小文件存储的文件系统有:Ceph,MooseFS,MogileFS,FastDFS,TFS;
适合做大文件存储的文件系统有:HDFS,Ceph,Lustre,GlusterFS,GridFS;
轻量级文件系统有:MooseFS,FastDFS;
简单易用,用户数量活跃的文件系统有:MooseFS,MogileFS,FastDFS,GlusterFS;
支持FUSE挂载的文件系统有:HDFS,Ceph,Lustre,MooseFS,GlusterFS。
考虑到GFS不开源,学习成本高,且相关特性资料不全面的情况下,暂时先不考虑使用GFS;
Ceph目前不够成熟稳定,很少有使用在生产环境的案例,暂时排除;
Lustre对内核依赖程度过重,且不易安装使用,暂时排除;
TFS安装复杂,且官方文档少,不利于以后的学习使用,暂时先排除;
经初步筛选剩下的文件系统有:HDFS、MooseFS、MogileFS、FastDFS、GlusterFS、GridFS。
需求:
分析:
根据需求,首选需要选择适合海量小图片存储的文件系统,适合的文件系统有:MooseFS,MogileFS,FastDFS。
其次需要支持冗余备份,适合的文件系统有:MooseFS、FastDFS、GlusterFS。
符合条件1,2且功能精简的文件系统有:FastDFS。
符合条件1,2且功能全面的文件系统有:MooseFS。
总结:
MooseFS功能较为全面,支持在线扩容、冗余备份、FUSE挂载和POSIX访问接口,不支持跨集群同步,存在单点故障,性能相对较差。
FastDFS功能精简,支持在线扩容、冗余备份,部分支持跨集群同步,不支持FUSE挂载和POSIX访问接口,不存在单点故障,性能较好。
提供的建议选型参考为FastDFS或MooseFS,可根据需求的细化进一步分析选取。
备注:此选型参考提供的是分布式文件系统的选型建议,根据系统需求也可选择NFS等其他更合适的文件系统类型;此选型参考仅局限于分析范围内的文件系统,仍然有其他类型的文件系统可能是更好的选择;此选型参考中没有确切的性能测试数据作为对比,无法提供性能方面的精确比较。
开源分布式存储系统的对比 [http://my.525.life/article?id=1510739742054]
分布式文件系统MFS、Ceph、GlusterFS、Lustre的对比 [https://www.cnblogs.com/zhiguo/p/3334993.html]
使用 FUSE 开发自己的文件系统 [https://www.ibm.com/developerworks/cn/linux/l-fuse]