为了应对海量数据的存储和处理,分布式文件系统应运而生。
那什么是分布式文件系统?分布式文件系统将数据在物理上分布到多个存储节点上存储,并对这些存储节点进行同一管理和分配,向用户提供文件系统访问接口。node
高扩展性:可简单快速添加数据节点进行扩容操做c++
冗余性:同一数据在多个节点上拥有多个副本,保证某一节点宕机数据不会丢失数据库
数据复制:文件系统可自行完成数据副本的建立服务器
空间平衡:保持多个存储节点的存储空间使用率均衡负载均衡
高IO能力:因为数据分散在多个节点存储,并行操做IO能力强于单机系统dom
廉价性异步
MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群,由 LiveJournal 旗下 Danga Interactive 公司开发,Danga 团队开发了包括 Memcached、MogileFS、Perlbal 等不错的开源项目:(注:Perlbal 是一个强大的 Perl 写的反向代理服务器)。MogileFS很是适用于存储海量小文件,好比图片,小段视频。分布式
存储和下载的客户端性能
运行的进程为mogilefsd。基于事件模型的父进程负责管理全部来自客户端的请求,均衡请求发送到各个查询线程,处理子进程间的全部通讯。mogilefsd下的子进程包含:编码
Replication :自动复制数据副本
Deletion:删除线程
Query:应答客户端请求
Reaper:某节点失败后,自动补充丢失的数据副本到其余节点上
Monitor:监控节点和存储设备的健康和状态
MogileFS的元数据存储在数据库中,元数据包含命名空间和文件存储位置信息
运行进程为mogstored,依赖于Perbal。存储数据的节点。Tracker与Storage Nodes 通讯采用http协议。
上传的每个文件对应一个fid,等同于key的概念。MogileFS容许定义多个域来存放数据,每一个域中的key值必须惟一,不一样的域中的key能够相同。
class是每一个域中最小数据副本复制的最小单元,也即数据副本是按class进行总体复制。同时也定义了文件属性,如数据副本的数量等等。
FastDFS是国人使用c++研发的一款轻量级分布式文件系统,一样适合存储海量小文件。
Tracker在客户端与存储节点之间扮演协调者角色,它负责管理全部storage node 和group,在多个group间负载均衡数据存储以及接受客户端的数据请求。每一个storage启动以后向tracker汇报本身所属group及健康信息,由此,在内存中tracker维护这些不多的元数据,即group与storage的映射关系。
这使得tracker的扩展十分容易,全部的tracker都会接收来自storage的报告信息,生成元数据以后提供读写服务。
存储数据的节点,保存文件的元数据信息,完成客户端的数据请求。storage是以group为单位组织起来的,一个group包含至少一个storage,group内的storage互为备份存储相同的数据,作到冗余功能。每一个storage下容许挂载多个目录,数据存储在本地文件系统上。
数据请求者,以特定协议与tracker和storage通讯,并保存上传文件后storage返回的key。
前提是storage不断向tracker汇报状态信息,当客户端向tracker提交上传请求,tracker根据调度规则挑选一个group,并把group中一个storage的地址信息返回给客户端,客户端继而将文件上传至该storage中,storage根据规则选择一个目录存储数据,storage存储成功后返回一个文件存储路径信息。路径信息由多个字段拼接而成。其中fileid包含了丰富信息,上传的源storageIP地址,文件建立时间戳,文件大小,文件后缀,再加上文件crc32和一个随机数,而后进行base64编码而成。具体返回的路径信息以下:
须要注意的是,文件在一个storage存储完成以后便认为上传成功,以后源storage向group内其余storage提供文件元数据信息,其余节点自行复制数据。假如在同步的过程当中,源storage失败,则本次上传的数据将丢失,若是想要避免这种风险,须要在客户端写好双重写代码。
客户端向tracker发送路径地址提交下载请求,tracker解析路径地址获得group信息,源storageIP,时间戳等信息后,根据规则挑选一个最佳storage地址信息返回给客户端,客户端再发送请求到指定storage,storage检索到后将数据发送给客户端。
在下载流程中,tracker挑选storage的细节:因为同一group内storage以异步形式存储数据,因此当源storage存储数据完成后,客户端立刻请求刚刚上传的数据,这时其余storage节点颇有可能没有完成数据同步,因此tracker须要根据时间戳信息进行判断哪些storage可接受客户端的数据请求。
FastDFS的性能要优于MogileFS,缘由在于,FastDFS采用c++较为底层的语言实现,效率要比perl编写的MogileFS高,并且FastDFS裁剪了DB这一角色,将元数据直接保存在storage中更加提高了性能。FastDFS缺点在于,当一个storage中的某一目录挂载的磁盘损坏的话,不能进行自动恢复,须要手动恢复比较麻烦。