[原创]MogileFS 用户层的分布式文件系统

[原创]MogileFS 用户层的分布式文件系统

-------昨晚的测试结果, 整理出来分享, 如需转载 请注明来源: Joseph.Chen from http://admon.org @2008-10-19
如本文有误或者有新内容需要添加往联系我: E-mail c a x 0 c h @ g m a i l

MogileFS 是一套高效的文件系统冗余组件, 由Six Apart开发(也是 memcached 的发布者), 广泛应用在高负载站点上,比如 LiveJournal, Digg, Flickr, Yupoo.com, Snappark.com.
它以 Perl 开发, 工作在用户层, 不需要安装任何内核模块, 以普通用户模式运行. 当前版本号为 2.20

借助 MogileFS 可以把多台主机的空间组合成一个集中的存储系统, 相互之间复制以达到冗余, 有效排除了单点故障, 能保证所存储的文件对Web服务100%可用.
在各存储节点均可启用多个 Web Server 对外提供服务, 这些 Web 共用一个存储系统.节点间 负载及IO均衡 由 MogileFS 自身维护.
MogileFS 适用于保存一次写入多次读取的环境, 常用于保存大量的图片.

安装 Mogile 所需 Perl 模块列表:

[/home/mogile]# ls *.tar.gz
BSD-Resource-1.2901.tar.gz        Gearman-Server-1.09.tar.gz   MogileFS-Utils-2.13.tar.gz
Danga-Socket-1.59.tar.gz          IO-AIO-3.15.tar.gz           Net-Netmask-1.9015.tar.gz
DBD-mysql-4.008.tar.gz            Linux-AIO-1.9.tar.gz         Perlbal-1.72.tar.gz
Gearman-1.09.tar.gz               MogileFS-Client-1.08.tar.gz  Sys-Syscall-0.22.tar.gz
Gearman-Client-Async-0.94.tar.gz  mogilefs-server-2.20.tar.gz

其中:
mogilefs-server-2.20.tar.gz 包括 mogilefsd 和 mogstored 两个程序.前者是 MogileFS 的 tracker, 它将一些全局信息写入到 MySQL 数据库里(innodb 表); 后者是维护存储节点需要的守护进程, 它其实是个 HTTP Server, 默认侦听在7500端口,接受客户端的文件备份请求.
MogileFS-Utils-2.13.tar.gz 包含了 MogileFS 的一些管理工具, 如 mogadm, mogtool.
MogileFS-Client-1.08.tar.gz 提供了 Perl API(MogileFS.pm), 用这个模块可以编写客户端程序.

程序结构:
一台启用了 mogilefsd 和 mogstored 的测试环境:
** 转载请注明: Joseph Chen from http://admon.org @2008-10-19
[/home/mogile]# ps -ef  | grep mog
hadoop   13973     1  0 Oct17 ?        00:00:50 mogilefsd
hadoop   13974 13973  0 Oct17 ?        00:00:16 mogilefsd [replicate]
hadoop   13975 13973  0 Oct17 ?        00:00:00 mogilefsd [delete]
hadoop   13976 13973  0 Oct17 ?        00:00:04 mogilefsd [queryworker]
hadoop   13977 13973  0 Oct17 ?        00:00:03 mogilefsd [queryworker]
hadoop   13978 13973  0 Oct17 ?        00:00:01 mogilefsd [queryworker]
hadoop   13979 13973  0 Oct17 ?        00:00:01 mogilefsd [queryworker]
hadoop   13980 13973  0 Oct17 ?        00:00:04 mogilefsd [queryworker]
hadoop   13981 13973  0 Oct17 ?        00:00:57 mogilefsd [monitor]
hadoop   13982 13973  0 Oct17 ?        00:00:02 mogilefsd [reaper]
hadoop   13983 13973  0 Oct17 ?        00:00:06 mogilefsd [fsck]
hadoop   25434     1  0 Oct18 ?        00:00:35 mogstored
hadoop   25435 25434  0 Oct18 ?        00:00:02 mogstored [diskusage]
hadoop   25436 25434  0 Oct18 ?        00:00:01 mogstored [iostat]
hadoop   25437 25434  0 Oct18 ?        00:00:00 mogstored [fidsizes]

MogileFS由如下部分构成:
    * MySQL DB -- 数据库是用来存放MogileFS的元数据的地方, 做命名空间到和文件物理位置的 Mapping. 数据库是 MogileFS 的核心部分.

    * Tracker (即上面的 mogilefsd): 基于事件的(event-based)来管理客户端应用的交互, 包括将请求均衡分配到 "queryworker" 中, 让 mogilefsd 子进程去处理. 可以使用多个的Tracker来做负载平衡. mogilefsd的子进程:
          o Replication --- 机器间复制文件
          o Deletion --- 从命名空间删除是立即的,从文件系统删除是异步的
          o QueryWorker --- 响应客户端的请求
          o Reaper --- 在磁盘失败后将文件复制请求重新放到队列中
          o Monitor --- 监测主机和设配的健康度和状态

    * Storage Nodes -- 文件存放的实际位置. 存储节点是一个HTTP服务器,用于删除, 存取等操作, 支持 WebDAV 服务器均可使用, 推荐使用 mogstored.

工作原理简述:
    * 应用程序请求打开一个文件, 通过 RPC 通知到 tracker,并找到一个可用的机器.
    * tracker 做一些负载均衡处理,然后给应用程序一些可能用的地址.
    * 应用程序往其中的一个地址写, 如果写失败, 它会重试或者写到其他地址.
    * 应用程序通过 "create_close" 告诉tracker文件的写入位置.
    * tracker 将写入点与域空间的记录(即数据库中的记录)关联.
    * tracker 在后台开始复制文件, 直到完成类别中预设的复制规则(比如: 重要的文件需要复制5份)
    * 随后,应用程序发起 "get_paths" 请求获取 domain + key (即 key == "filename"的格式. key在一个domain中是唯一的.), tracker根据各个节点的IO情况整理并返回所有可用的URL列表.
    * 应用程序按顺序尝试这些URL地址.(tracker 持续监测主机和设备状态,因此不会返回死连接,默认情况下他对返回列表中的第一个URL做双重检查,除非你不要它这么做.)

在存储节点上用来保存文件的文件存储目录结构: $rootpath/$dev/a/bbb/ccc/$fid.fid

其中 $rootpath为主机上用来存储的根路径, $dev 表示是该主机上被登记的设备的映射路径, a/bbb/ccc 是**目录用于将文件分散到不同目录. $fid.fid 对应记录$fid的物理文件. a/bbb/ccc 是 fid 除 1000 求余数得到的,这样保证一个目录下不会有太多目录和文件.

如果一个文件的 fid 为 1234567890,则在 $rootpath 下的路径为: 1/234/567/1234567890.fid

[/home/mogile]# ls -l data/dev1/0/000/000/0000000005.fid
-rw-r--r-- 1 hadoop hadoop 264741 Oct 18 05:31 data/dev1/0/000/000/0000000005.fid

API 接口:
有完善的 Perl 接口, 同时也有第三方提供了 PHP 和 Java 的API.
参考: http://netsneek.info/index.php?hl=f5&q=uggc%3A%2F%2Fzbtvyrsf.cojvxv.pbz%2FPyvrag%2BYvoenevrf

参考网站:
http://www.danga.com/mogilefs/
http://mogilefs.pbwiki.com/ [Blocked]

Joseph.Chen from http://admon.org @2008-10-19

      
在 安装 IO-AIO-3.15.tar.gz  时, 如果出错, 换用 cvs 中最新的代码即可. 也会出现警告信息, 可以安全的忽略掉.