简介

    MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的DangaInteractive公司开发。Danga团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。目前使用MogileFS 的公司非常多,如日本排名先前的几个互联公司及国内的yupoo(又拍)、digg、豆瓣、1号店、大众点评、搜狗和安居客等,分别为所在的组织或公司管理着海量的图片。

 

MogileFS组成部分

MogileFS由3个部分组成:

    1、server:主要包括mogilefs和mogstored两个应用程序。mogilefs实现的是tracker,它通过数据库来保存元数据信息,包括站点domain、class、hots等;mogstored是存储节点(storgenode’),它其实是个WsbDAV服务,默认监听在7500 端口,接受客户端的文件存储请求。在Mogilefs安装完后,要运行mogadm工具将所有storge node注册到mogilefs的数据库里,mogilefs会对这些节点进行管理和监控。

    2、utils(工具集):主要是Mogilefs的一些管理工具,例如mogadm等

    3、客户端API:mogilefs的客户端API很多,例如Perl、PHP、java、python等,用这个模块可以编写客户端程序,实现文件的备份管理功能等;

 

MogileFS特性

    1、  工作与应用层

    2、  无单点:三大组件(tracker、mogstore,database)皆可实现高可用;

    3、  自动完成文件复制:复制的最小单位不是文件,而是class,文件可以被自动复制到多个有足够存储空间的存储节点上;

    4、  传输无需特殊协议:可以通过NFS或HTTP协议进行通信;

    5、  名称空间:文件通过一个给定的key来确定,是一个全局的命名空间,没有目录基于域实现文件隔离;

    6、  不共享任何数据:无需通过昂贵的SAN来共享磁盘,每个存储节点只需维护自己所属的存储设备(device);

 

MogileFS原理

术语解释

         tracker:借助数据库保存各个节点的元数据信息,便于检索定位数据位置并监控各个节点,告知客户端存储区的位置并指挥storage节点复制数据副本,进程为mogilefsd

         database:为tracker节点存储节点文件的元数据信息;

         storage:将指定域中的键转换我I特有的文件名存储与在特定的设备文件中,转换后文件名为值,storage自动维护键值之间的对应关系,storage节点使用http进行数据传输,依赖于perbl,进程为mogstored,perbal;

         Domain:一个域中的键值为唯一的,一个Mogilefs可以有多个域来存储不同类型的文件;

         Class:复制的最小单位,管理文件属性,定义文件存储在不同设备上的分数;

         device:一个存储节点,可以有多个device,就是用来存放文件的目录,每个设备都有一个设备ID,需要在mogstored配置文件中docroot配置,设备不能删除,只能将设备的状态置为dead,置为dead之后数据就无法恢复了,并且设备ID也无法使用。(建议每个节点只有一个device,文件存储多份时,有多余数据备份在当前节点其他设备,等于没有备份,若只备份2份,节点发生故障,数据就会丢失);

 

 

Mogilefs架构图

MogileFS原理介绍_Nginx

上图为Mogilefs架构图,下面也描述了图中体现出一次数据请求过程。

    1、  客户端在发起一次数据请求,假设请求banner.jpg,请求首先到达前端代理perbal(当然此处可利用Nginx实现)

    2、  perbal或nginx会将请求代理至Mogilefs client(这里解释下,MogileFS本身就是一个Web服务可以提高返回数据信息,不过普通的浏览器或web客户端是不具备利用获取的Mogilefs返回的数据位置信息再次请求storage节点获取数据的,所以此处需要一个特定的客户端来访问Mogilefs,而此客户端在Nginx代理时,是nginx的特定的模块。)

    3、  mogilefs client模块将请求发往trackers节点,trackers向DB server发起查询

    4、  tracker将以banner.jpg为key查询到的vlaue值发给nginx。

    5、  Nginx通过Mogilefs API向storage 节点请求数据。

这就是一次完整的数据获取过程。