分布式文件系统定义各系统对比图1 分布式文件系统1.1 什么是分布式文件系统?1.2 分布式文件系统与一般文件系统对比2 根据需求选择分布式文件系统2.1 需求说明:2.2 筛选流程第一步:常见分布式文件系统比对第二步:功能分类第三步:分布式文件系统再次比对2.3 综述
在分布式存储技术体系当中,分布式文件存储是其中的分类之一。
分布式文件系统,可以说是分布式系统下的一个子集,比较广泛的几款产品,HDFS、Ceph、FastDFS、MooseFS。
分布式文件系统定义
分布式文件系统(Distributed File System,DFS)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点(可简单的理解为一台计算机)相连;或是若干不同的逻辑磁盘分区或卷标组合在一起而形成的完整的有层次的文件系统。
各系统对比图
存储系统 | HDFS | TFS | Ceph | Swift | Cinder | FastDFS | MooseFS | GlusterFS | Lustre | Sheepdog | IPFS | MogileFS |
开发语言 | Java | C++ | C++ | Python | Python | C | C | C | C | C | Go | Perl |
开源协议 | Apache | GPL V2 | LGPL | Apache | Apache | GPL V3 | GPL V3 | GPL V3 | GPL | GPLv2 | Apache | GPL |
数据存储方式 | 文件 | 文件 | 对象/文件/块 | 对象 | 块 | 文件/块 | 块 | 文件/块 | 对象 | 块 | 块 | 文件 |
集群节点通信协议 | TCP | TCP | 私有协议(TCP) | TCP | 未知 | TCP | TCP | 私有协议(TCP)/ RDAM(远程直接访问内存) | 私有协议(TCP)/ RDAM(远程直接访问内存) | totem协议 | P2P | HTTP |
专用元数据存储点 | 占用MDS | 占用NS | 占用MDS | 无 | 未知 | 无 | 占用MDS | 无 | 双MDS | 无 | 无 | 占用DB |
在线扩容 | 支持 | 支持 | 支持 | 支持 | 未知 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |
冗余备份 | 支持 | 支持 | 支持 | 支持 | 未知 | 支持 | 支持 | 支持 | 无 | 支持 | 支持 | 不支持 |
单点故障 | 不存在 | 存在 | 不存在 | 不存在 | 未知 | 不存在 | 存在 | 不存在 | 存在 | 不存在 | 存在 | 存在 |
跨集群同步 | 不支持 | 支持 | 不支持 | 未知 | 未知 | 部分支持 | 不支持 | 支持 | 未知 | 未知 | 未知 | 不支持 |
适用场景 | Mapreduce使用的文件存储 | 跨集群的小文件 | 单集群的大中小文件 | openstack对象存储 | openstack块存储 | 单集群的中小文件 | 单集群的中小文件 | 跨集群云存储 | 大文件读写 | 弹性块存储虚拟机 | P2P/区块链 | 未知 |
FUSE挂载 | 支持 | 未知 | 支持 | 支持 | 未知 | 不支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 不支持 |
访问接口 | 不支持POSIX | 不支持POSIX | POSIX | POSIX | 未知 | 不支持POSIX | POSIX | POSIX | POSIX/MPI | 未知 | POSIX | 不支持POSIX |
- 开源协议说明
Apache : 鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。 GPL:不允许修改后和衍生的代码做为闭源的商业软件发布和销售,修改后该软件产品必须也采用GPL协议; GPL V2:修改文本的整体就必须按照GPL流通,不仅该修改文本的源码必须向社会公开,而且对于这种修改文本的流通不准许附加修改者自己作出的限制; GPL V3:要求用户公布修改的源代码,还要求公布相关硬件; LGPL:更宽松的GPL
- 名词解释
- MDS:Metadata Server
- NS:NameServer
- DB:Database
1 分布式文件系统
1.1 什么是分布式文件系统?
分布式文件系统(Distributed File System,DFS)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点(可简单的理解为一台计算机)相连;或是若干不同的逻辑磁盘分区或卷标组合在一起而形成的完整的有层次的文件系统。DFS为分布在网络上任意位置的资源提供一个逻辑上的树形文件系统结构,从而使用户访问分布在网络上的共享文件更加简便。
1.2 分布式文件系统与一般文件系统对比
ㅤ | 分布式文件系统 | 一般文件系统 |
存储数据的方式 | 数据分散的存储在多台服务器上 | 集中存放所有数据,在一台服务器上 |
特点 | 分布式网络存储系统采用可扩展的系统结构,利用多台服务器分担负荷,利用位置服务器定位存储信息,不但提高了系统的可靠性、可用性和存取效率,还易于扩展,避免单点故障。 | 传统的网络存储系统采用集中的服务器存放所有数据,到一定程度服务器会成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。 |
2 根据需求选择分布式文件系统
目前可用于文件存储的网络服务选择有很多,比如阿里云OSS、腾讯云、百度云等等,对于中小型企业,如果不选择存储上云,或者为了帮解约成本,可自行部署文件系统。
本文主要介绍了根据需求来对常用分布式文件系统进行筛选。
2.1 需求说明:
目前要找的分布式文件系统至少满足以下条件:
- 频繁读写、从不修改、基本不删除
- 能够存储图片、音频以及100MB以上的视频等文件
- 非常稳定、高可用、可扩容、可运维部署、
- 上手简单、易于维护、社区相对活跃
2.2 筛选流程
常用的分布式文件系统有:GFS、TFS、HDFS、MooseFs、FastDfs、MogileFs、GridFs、MinIO、SeaweedFS、GlusterFS、Ceph、GlusterFS等。
第一步:常见分布式文件系统比对
1、GFS(Google File System)
Google公司为满足公司需求而开发的基于Linux的可扩展的分布式文件系统,用于大型的、分布式的、对大数据进行访问和应用,成本低,应用于廉价的普通硬件上,但不开源,暂不考虑。
2、TFS(Taobao File System)
阿里巴巴为满足了淘宝对小文件存储的需求而开发的一个可扩展、高可用、高性能、面向互联网服务、开源的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器集群上,可为外部提供高可靠和高并发的存储访问。TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,这个也暂不考虑。
3、HDFS(Hadoop Distributed File System)
Hadoop分布式文件系统,适合运行在通用硬件上做分布式存储和计算,因为它具有高容错性和可扩展性的特点,可部署在廉价的机器上,适合大数据的处理,在离线批量处理大数据上有先天的优势。
Hadoop是Apache Lucene创始人Doug Cutting开发的使用广泛的文本搜索库。它起源于Apache Nutch,后者是一个开源的网络搜索引擎,本身也是Luene项目的一部分。Aapche Hadoop架构是MapReduce算法的一种开源应用,是Google开创其帝国的重要基石。
4、MooseFS
MooseFS 是来自波兰的开源且具备冗余容错功能的分布式 POSIX 文件系统,也是参照了 GFS 的架构,实现了绝大部分 POSIX 语义和 API,它支持通过FUSE方式将文件挂载操作,同时其提供的web管理界面非常方便查看当前的文件存储状态,对master服务器有单点依赖,用perl编写,用于中、大型文件应用,但性能相对较差,由于可能会实时访问所以暂不考虑。
备注:POSIX表示可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准
5、FastDFS
由淘宝的余庆先生所开发的一个开源分布式文件系统。它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。适合以文件为载体的在线服务,如相册网站、视频网站等等。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS搭建一套高性能的文件服务器集群提供文件上传、下载等服务。但是FastDFS部署有点麻烦,且它的SKD是不全的。
6、MogileFS
MogileFS是一套高效开源的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上。支持多节点冗余,可实现自动的文件复制。不需要RAID,应用层可以直接实现RAID,不共享任何东西,通过集群接口提供服务工作于应用层,没有特殊的组件要求。使用HTTP方式通信。
国内所知道的使用 MogileFS 的公司有图片托管网站 yupoo又拍,digg, 土豆, 豆瓣,1 号店, 大众点评,搜狗,安居客等等网站.基本很多网站容量,图片都超过 30T 以上。
7、GridFS
MongoDB是一种知名的NoSql数据库,GridFS是MongoDB的一个内置功能,它用于存储和恢复那些超过16M(BSON文件限制)的文件(如:图片、音频、视频等),是文件存储的一种方式,但是它是存储在MonoDB的集合中。它可以直接利用已建立的复制或分片机制,所以对于文件存储来说故障恢复和扩展都容易,且GridFS不产生磁盘碎片。
8、MinIO
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。它也是一个非常轻量的服务,可以很简单的和其他应用的结合。MinIO的特色在于简单、轻量级,对开发者友好,学习成本低,安装运维简单,开箱即用。
而MinIO是apache项目,它拥有着较高的性能,100%兼容s3,学习成本低、安装运维简单、开箱即用。
9、SeaweedFS
SeaweedFS是基于go语言开发高度可扩展开源的分布式存储系统,能存储数十亿文件(最终受制于你的硬盘大小)、并且速度快,内存占用小。上手使用比fastDFS要简单很多,自带Rest API。对于中小型文件效率非常高,但是单卷最大容量被程序限制到30G,建议存储文件以100MB以内为主。
10、Ceph
Ceph是Red Hat旗下一个成熟的分布式文件系统,而且还是一个有企业级功能的对象存储生态环境。该系统具备高性能、高可用性、高可扩展性、实时存储性等特点。虽然ceph很强大,但是学习成本高、安装运维复杂。Ceph用C++编写,存储容量可轻松达到PB级别。
11、GlusterFS
GlusterFS 是由美国的 Gluster 公司开发的 POSIX 分布式文件系统(以 GPL 开源),它主要应用在集群系统中,具有高扩展性、高可用性、高性能、可横向扩展等特点,并且其没有元数据服务器的设计,让整个服务没有单点故障的隐患。该系统主要是为中大型文件设计的,存储容量可轻松达到PB。它存在扩容缩容影响服务器较多、遍历目录下文件耗时、小文件性能较差的缺点。
第二步:功能分类
- 适合做通用文件系统的有:Ceph、MooseFS、MinIO;
- 适合做中小文件存储的文件系统有:Ceph、FastDFS、MinIO、SeaweedFS;
- 适合做大文件存储的文件系统有:HDFS、MinIO、Ceph、GridFS;
- 轻量级文件系统有:FastDFS、MinIO、SeaweedFS;
- 简单易用,用户活跃的文件系统有:HDFS、FastDFS;
- 综上:Ceph目前不够成熟稳定,官方也明确指出不要把ceph用在生产环境中,暂不考虑;
- 经初步筛选剩下的文件系统有:HDFS、FastDFS、MinIO、GridFS。
第三步:分布式文件系统再次比对
MinIO:上手简单,适合存储大容量非结构化的数据, 基本满足当前业务需求但是目前没有中文社区。
FastDFS:功能精简,支持在线扩容、冗余备份,部分支持跨集群同步,不存在单点故障,性能较好。但是不支持FUSE挂载和POSIX访问接口。
HDFS:适合批量数据处理.可以部署在廉价的机器上。可以部署在廉价的机器上,但是不适合大量小文件,通过牺牲响应延时来换取高的吞吐量。
GridFS:能够简化技术栈,如果已经使用了MongoDB,那么使用GridFS,就不需要其它独 立的存储工具了(很遗憾我们当前还没有引入MongoDB),不过性能不如直接访问文件系统快。无法修改文档。如果要修改GridFS里面的文档,只能是先删除再添加(对我们当前业务没有影响)
2.3 综述
目前提供的建议选型参考为MinIO或FastDFS,
如果想减少技术栈的话可以考虑HDFS或GridFS,
如果不在乎响应时间可以考虑HDFS。