MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群,由LiveJournal旗下DangaInteractive公司开发;
1.其特点如下:
应用层——不需要特殊的核心组件;
无单点故障——mogfilefs的三个组件(storage nodes, trackers, tracker's databases)可运行在多主机上,所以无单点故障(你可以将tracker和databases运行在同一台主机上,这样可以不需要4台主机了),推荐最低使用2台主机;
文件的自动复制——基于不同的文件“分类”,文件可以被自动的复制到多个有足够存储空间的存储节点上,这样可以满足这个“类别”的最少复制要求.比如你有一个图片网站,你可以设置原始的JPEG图片需要复制至少三份,但实际只有1或2份拷贝,如果数据丢失了,那么MogileFS可以重新建立遗失的拷贝数.这样,MogileFS(不做RAID)就可以节约在磁盘上的开销,否则你将存储多个数据的拷贝,这是没必要的;
比RAID要好——在一个非存储区域网络的RAID(non-SANRAID)的配置中,磁盘是冗余的,但主机不是,如果你整个机器坏了,那么文件也将不能访问.MogileFS会在不同的机器之间进行文件复制,因此文件始终是可用的;
简单的名称空间——文件通过一个给定的key来确定,是一个全局的名称空间,你可以自己创建多个命名空间,只要你愿意,不过多个应用可能在同一MogileFS中会造成key冲突;
不共享任何东西——MogileFS不需要依靠昂贵的SAN来共享磁盘,每个机器只维持自己的磁盘;
不需要RAID——MogileFS storage nodes上的本地磁盘可以是做了RAID的也可以不是,如果是为了安全性着想的话RAID没有必要买了,因为MogileFS已经提供了;
跨硬件的本地文件系统——MogileFS storage nodes上的本地磁盘可以被格式化为你想要的文件系统(如ext3,XFS)mogilefs会做自己内部的文件hash,所以没有文件系统限制,如要求目录中的最大文件数或目录中的最大文件夹数;
传输中立,无特殊协议——MogileFS客户端可以通过NFS或HTTP来和MogileFS的存储节点来通信,但首先需要告知跟踪器一下;
2.mogilefs的工作原理
大致流程:
(tracker负载均衡的情况下)用户请求被转发到某个tracker上,通过文件的key来查找数据库是否存在该文件,如果存在就返回该文件的位置等信息,然后按照这个位置去寻找并取得该文件;
3.MogileFS的三大组成部分
Mogilefs由Tracker(Database),StorageNodes和Client组成,这里先不讲Client,因为Client实际上是一个Perl的模块,可以写程序调用该模块来操作MogileFS系统,对整个系统进行读写操作.另外,像nginx之类有相关的客户端模块.另外也有做成像文件系统一样采用fuse方式挂载看起来象一个本地文件系统.其它语言的客户端也非常多;
3.1 Tracker(跟踪器/调度器)
MogileFS的核心部分,通俗点讲就是一个调度器.mogilefsd进程就是trackers进程程序,管理所有的来自应用的客户端通信请求。包括均衡请求到"Query workers",处理所有的mogilefsd与子进程之间的通信。
mogilefsd的子进程功能包括:
Replication:文件复制
Deletion:文件删除
Query:查询
Reaper reenqueuing files for replication after a disk fails
Monitor:主机和device状态监视器
mogadm,mogtool的所有操作都要跟trackers打交道,Client的一些操作也需要定义好trackers,因此最好同时运行多个 trackers来做负载均衡。trackers可以只运行在一台机器上,也可以跟其他程序运行在一起(不建议).
tracker借助数据库保存各节点文件的元数据信息,保存每个域中所有键的存储位置分布,方便检索定位数据位置的同时监控各节点,告诉客户端存储区位置并指挥storage节点复制数据副本;
3.2 Databases(数据库)
数据库用来存放MogileFS的元数据(命名空间和文件位置),由Trackers来操作和管理它.可以用mogdbsetup程序来初始化数据库.因为数据库保存了MogileFS的所有元数据,如果这儿挂了,那么整个MogileFS将处于不可用状态.因此最好是HA结构;
3.3 Storage Nodes(存储节点)
进程程序为mogstored,是文件实际存放的地方。存储节点是一个HTTP服务器,可以对文件做删除,存放,重命名等事情。任何WebDAV服务器(一种基于HTTP1.1协议的通信协议,使应用程序可直接对WebServer直接读写并支持写文件锁定(Locking)及解锁(Unlock))都可以,不过推荐使用mogstored;mogilefsd可以配置到两个机器上通过使用不同的端口。mogstored来进行所有的DAV操作和流量,IO监测,并且你自己选择的HTTP服务器(默认为perlbal)用来做GET操作给客户端提供文件;
典型的应用是一个挂载点有一个大容量的SATA磁盘,它们被挂载到/var/mogdata/devNN,只要配置完配置文件后mogstored程序的启动将会使本机成为一个存储节点。当然还需要mogadm这个工具增加这台机器到Cluster中;
StorageNodes将指定域中的键转换为其特有的文件名存储在指定的设备文件中,转换后的文件名为值,storage节点自动维护键值的对应关系,storage节点由于使用http进行数据传输,因此依赖于HTTP服务器(perlbal),storage节点前端可以使用nginx进行反向代理,但需要安装nginx-mogilefs-module-master模块进行名称转换;
3.4 其他
Application:应用程序,存储和读取文件;
Domain(域):一个域中的键值是惟一的,一个MogileFS可以有多个域,域可以用来存储不同应用类型的数据的容器;
Host:每一个存储节点称为一个主机,一个主机上可以有多个存储设备(单独的硬盘),每个设备都有ID号,Domain+Fid用来定位文件;
Class:复制最小单位,文件属性管理,定义文件存储在不同设备上份数;
3.5 High-level流程:
应用程序请求打开一个文件(通过RPC通知到tracker,找到一个可用的机器),做一个 “create_open” 请求;
tracker做一些负载均衡处理,决定请求应该去哪儿,然后给应用程序一些可用的位置;
应用程序写到其中的一个位置去 (如果中途写失败,他会重新尝试并写到另外一个位置去);
应用程序(client)通过”create_close” API告诉tracker文件写到哪里去了;
tracker将名称加入domain的namespace(通过数据库);
tracker,在后台,开始复制文件,直到它满足该文件类别设定的复制策略;
然后app通过(key=="filename")向该domain发送一个get_paths请求,tracker在通过询问数据库或缓存系统等后获取文件的保存位置,所有的该文件可访问的URL,基于权重的存储位置,返回该文件可用的完整URLs地址列表响应;
应用程序按顺序尝试这些URL地址.(tracker持续监测主机和设备的状态,因此不会返回死连接,默认情况下他对返回列表中的第一个元素做双重检查,除非你不要他这么做);
4.MogileFS的3个部分(摘自马哥笔记):
(1)server:主要包括mogilefsd和mogstored两个应用程序。mogilefsd实现的是tracker,它通过数据库来保存元数据信息,包括站点domain、class、host等;mogstored是存储节点(storenode),它其实是个WebDAV服务,默认监听在7500端口,接受客户端的文件存储请求。在MogileFS安装完后,要运行mogadm工具将所有的storenode注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控;
(2) utils(工具集):主要是MogileFS的一些管理工具,例如mogadm等;
(3)客户端API:MogileFS的客户端API很多,例如Perl、PHP、Java、Python等,用这个模块可以编写客户端程序,实现文件的备份管理功能等;
附:分布式文件存储系统
Google Filesystem GFS擅长处理单个大文件GFS+MapReduce(编程模型-运行框架-API)可以实现程序切割到多节点运行,实现分布式处理
Hadoop Distributed Filesystem 根据GFS思想开发的,擅长处理单个大文件
ClusterFS 擅长处理单个大文件
Taobao Filesystem 淘宝开源的文件系统,擅长处理海量小文件,适用于大规模场景。
MogileFS 一个高性能的分布式存储,擅长处理海量小文件
Ceph 一个Linux PB级别的分布式文件系统,测试中
MooseFS 分布式文件系统,兼容POSIX(FUSE),可以直接挂载使用,当节点多,并发量大环境中,可扩展性差,性能一般。
Lustre 一种平行分布式文件系统
参考文章:
http://my.oschina.net/kisay/blog/199607
官方文档: