IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

扶凯 2011-09-07 23:23:56 累计浏览 3,568 次
本机暂存

    在 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. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. perl更新/修改/删除文本文件内容 (累计阅读 10,648)
  2. 奇怪的 Nginx 的 upstream timed out 引起响应 502 (累计阅读 9,965)
  3. perl大牛flw传说 (累计阅读 7,714)
  4. AWStats是一个基于Perl的WEB日志分析工具。 (累计阅读 7,175)
  5. perl模块Getopt::Std用法及实例-从命令行读取参数模块 (累计阅读 7,018)
  6. [Perl] Template::Toolkit 模板技术. (累计阅读 6,345)
  7. Perl命令行常见用法及技巧 (累计阅读 5,912)
  8. PHP将死,何以为继? (累计阅读 5,918)
  9. 在perl中连接和使用sqlite做数据存储 (累计阅读 5,813)
  10. Perl 倒行分析文件方法。perl读文本文件,从末尾往前读. (累计阅读 5,609)