IT技术博客大学习 共学习 共进步

MogileFS 的客户端和API(MogileFS 系列4)

扶凯 2011-09-07 23:23:56 浏览 3,442 次

    在 MogileFS 最重要的一个部分是客户端的应用,如下,可以支持的语言非常多,也支持 FUSE 所以下面,我来以 MogileFS 的 Perl 客户端和 MogileFS 的 FUSE 的 API 连接来讲讲.
     上面提到各种客户端,MogileFS 的 java Ruby PHP Python 都是支持的,其它客户端 API 的资料可以参考如下地址:
Java - http://github.com/eml/java-mogilefs
Ruby - http://seattlerb.rubyforge.org/mogilefs-client/
PHP - http://projects.usrportage.de/index.fcgi/php-mogilefs
Python - http://www.albany.edu/~ja6447/mogilefs.py

MogileFS 的 Perl 的客户端

这个是我们最常用的客户端,和别的 PHP,Python 基本也分别不大,但主要是因为 MogileFS 的原型就是 Perl ,所以我们在这介绍一下这种应用.
他的资料的网站是
Perl - http://search.cpan.org/~bradfitz/MogileFS-Client/

使用非常的容易第一步和普通的面向对象的函数一样,先 new 一个对象出来,存到 $mogc 的变量名中,需要提供二个参数,主要就是 domain 的地址和 track 的地址

my $mogc = MogileFS::Client->new(
	domain => <domain>,
	hosts => [qw/<track_ip>:7001/]
);


介绍几个常用的功能。
在内存中新建一个文件存入 MogileFS.这个会打开一个文件句柄。

$mogc->new_file($key, $class)

例如:

my $fh = $mogc->new_file('foo', 'some_file');
print $fh "hi this is new file";
$fh->close;


在给文件系统本身存在的文件存入 MogileFS.

$mogc->store_file($key, $class, $fh_or_filename[, $opts_hashref])

这个会直接返回文件的大小

$filesize = $mogc->store_file('some_file', 'foo', '/tmp/test.txt');

如果没有大小,就存入失败了。


取得一个文件存储在 MogileFS 中的路径

@paths = $mogc->get_paths($key, { noverify => $bool });

这个函数会得到路径的地址的列表值,因为一个文件有可能会存多个地址,所以才会出一个列表值。
例如:

my @pathes = $mogc->get_paths('foo');
print @pathes;

实际的地址如下
["http://xxx.xxx.xxx.xxx:7500/dev2/0/000/000/0000000016.fid"]


直接取得文件的内容,这个会直接得到文件的内容,内容为一个引用,需要使用 $$content 来解这个引用

$dataref = $mogc->get_file_data($key)

例如

my $content = $mogc->get_file_data('some_file');
print $$content;


删除文件系统中指定的文件

$mogc->delete('some_file');


重命名指定文件到新的名字

$mogc->rename('some_key', 'any_key');

MogileFS 的 FUSE 的 API 来对文件进行操作

另一个是基于象文件系统一样的 FUSE,很多人问我 MogileFS 和 NFS 有什么分别,我真不想解释,使用一样就感觉得出来,简单的分就是,一个是分布文件系统,一个是共享分文系统,从这个字面也不难理解它们的分别了吧.

先有个准备工作,就是准备 FUSE 的环境,这个要系统支持,也得 Perl 支持。 FUSE 主要就是给原来给 VFS 的命令,转成 MogileFS 相应的命令来替换文件系统的操作。这样就能和正常的文件系统一样。显示和操作想关的文件。
MogileFS 中 FUSE 功能操作系统支持需要的包如下

yum install fuse fuse-devel fuse-libs

Perl 要支持 FUSE 的操作,所需要的模块

cpanm FUSE::Client
cpanm FUSE::Server
cpanm Fuse

最后,我们需要挂载文件系统的内容。默认 MogileFS 有一些操作。来支持这个功能。我们可以使用 sixapart 提供的一个程序
我们可以使用 svn 下载 http://code.sixapart.com/svn/mogilefs/trunk/fuse/ ,然后使用其中的 mount-filepaths 就可以实现这个功能了。
命令的参数如下:

mount-filepaths --tracker HOST:PORT --domain DOMAINNAME [ --class CLASSNNAME ] [ --file-perms FILEPERM ] [ --dir-perms DIRPERM ] [ --log LOGFILE ] [ --cache-size NUM ] [ --cache-age SECS ] [ --verbose ] [ --help ]

这个功能的使用,我们要借助另外二个插件
MogileFS-Plugin-FilePaths
MogileFS-Plugin-MetaData
这二个插件的作用是,让 MogileFS 支持文件列表。会给一些 MetaData 传到这个系统中。不过这二个插件(模块)可能得修改一下才能正常使用。

上面的 sixapart 的脚本使用我不细写了。我建议使用国外另一个高人写的一个新的 MogileFS 的改善后的程序。

MogileFS + FUSE + Bigfile support: http://www.spicylogic.com/allenday/blog/2008/07/14/mogilefs-fuse-bigfile-support/

我们 Copy 这个脚本中的内容建一个名字。然后直接使用,注意。这个脚本要生产用,还得修改一下,另外,只要使用了 FUSE 性能一定不会好。。。

<fuse_script>.pl <mount_point>

例如我使用

perl myfuse.pl /mnt/

当使用了这个上面的挂载命令后,文件系统,记的先不要关掉,最好推到后台,然后我们在进入 /mnt 中就能对文件进行操作了。就象普通的文件系统一样操作。

Nginx 做为 MogileFS 的客户端使用
本功能决定在下一个文章写,写 Nginx 在 MogileFS 中的应用.不但做为客户端还做为 Perlbal 的替代用来做 MogileFS 吐文件的 API 来使用。

建议继续学习

  1. 分布式缓存系统 Memcached 入门 (阅读 16,042)
  2. Zookeeper工作原理 (阅读 11,942)
  3. GFS, HDFS, Blob File System架构对比 (阅读 10,341)
  4. Zookeeper研究和应用 (阅读 9,341)
  5. 一致性哈希算法及其在分布式系统中的应用 (阅读 9,041)
  6. 分布式日志系统scribe使用手记 (阅读 8,841)
  7. 分布式哈希和一致性哈希 (阅读 8,665)
  8. HBase技术介绍 (阅读 7,942)
  9. 分布式系统的事务处理 (阅读 7,244)
  10. Memcache分布式部署方案 (阅读 6,666)