首页 > 架构 > mogileFS分布式文件存储解决方案

mogileFS分布式文件存储解决方案

      mogileFS是一个分布式文件存储的解决方案,他由Six Apart开发下面列出了他的一些特性(由mogileFS页面http://www.danga.com/mogilefs/ 介绍翻译而来)
         1. 应用层——不需要特殊的核心组件
       2. 无单点失败——MogileFS安装的三个组件(存储节点、跟踪器、跟踪用的数据库),均可运行在多个 机器上,因此没有单点失败。(你也可以将跟踪器和存储节点运行在同一台机器上,这样你就没有必要用4台机器)推荐至少两台机器。
       3. 自动的文件复制——基于不同的文件“分类”,文件可以被自动的复制到多个有足够存储空间的存储节点上,这样可以满足这个“类别”的最少复制要求。比如你有一 个图片网站,你可以设置原始的JPEG图片需要复制 至少三份,但实际只有1or2份拷贝,如果丢失了数据,那么Mogile可以重新建立遗失的拷贝数。用这种办法,MogileFS(不做RAID)可以节 约 磁盘,否则你将存储同样的拷贝多份,完全没有必要。
        4. “比RAID好多了”——在一个非存储区域网络的RAID(non-SAN RAID)的建立中,磁盘是冗余的,但主机不是,如果你整个机器坏了,那么文件也将不能访问。 MogileFS在不同的机器之间进行文件复制,因此文件始终是可用的。
      5. 传输中立,无特殊协议——MogileFS客户端可以通过NFS或HTTP来和MogileFS的存储节点来通信,但首先需要告知跟踪器一下。
        6. 简单的命名空间——文件通过一个给定的key来确定,是一个全局的命名空间。你可以自己生成多个命名空间,只要你愿意,不过这样可能在同一MogileFS中会造成key冲突。
      7. 不用共享任何东西——MogileFS不需要依靠昂贵的SAN来共享磁盘,每个机器只用维护好自己的磁盘。
      8. 不需要RAID——在MogileFS中的磁盘可以是做了RAID的也可以是没有,如果是为了安全性着想的话RAID没有必要买了,因为MogileFS已经提供了。
      9. 不会碰到文件系统本身的不可知情况——在MogileFS中的存储节点的磁盘可以被格式化成多种格式(ext3,reiserFS等等)。MogilesFS会做自己内部目录的哈希,所以它不会碰到文件系统本身的一些限制,比如一个目录中的最大文件数。你可以放心的使用。

Mogilefs 的网站地址(http:// www.danga.com /mogilefs )

php 扩展 的地址http://www.capoune.net/mogilefs/ )提供了一个php扩展用来在php中使用mogileFS。
这儿也有一个地址,svn的源码库 http://svn.usrportage.de/php-mogilefs/trunk/

mogileFS 安装步骤( http://durrett.net/mogilefs_setup.html
      mogileFS 使用perl 编写的,在安装前你应该先安装好perl。同时mogileFS也需要一个数据库用来保存文件数据的跟踪信息(目前好像可以使用MySQL推荐 , SQLite,Oracle,Postsql)。

这儿有一个兄弟的中文安装学习笔记 mogileFS学习

      mogileFS 适合于静态存储,就是那种一次保存,多次读取型的资源,比如以html方式静态化处理的动态文件,图片文件,其他只提供下载的文件等。

二、mogileFS的工作方式

下面简要阐述 MogileFS 是怎么工作的.

mogileFS由如下一些部分构成:
Application: 想要 保存/加载 文件的应用
Tracker (the mogilefsd process): 基于事件的(event-based) 父 进程/消息 总线来管理所有来之于客户端应用的交互(requesting operations to be performed), 包括将请求负载平衡到 “query workers” 中,让mogilefsd的子进程去处理. 你可以在不同的机器上运行两个Tracker, 为了高可用性, 或使用更多的Tracker为了负载平衡(你需要运行多于两个的Tracker). mogilefsd的子进程有:
Replication — 个机器间复制文件
Deletion — 从命名空间删除是立即的,从文件系统删除是异步的
Query — 响应客户端的请求
Reaper — 在磁盘失败后将文件复制请求重新放到队列中
Monitor — 监测主机和设配的健康度和状态

Database — 数据库用来存放MogileFS的元数据 (命名空间, 和文件在哪里). 这应该设置一个高可用性(HA)的环境以防止单点失败.
Storage Nodes — 实际文件存放的地方. 存储节点是一个HTTP服务器,用来做 删除,存放等事情,任何WebDAV服务器都可以, 不过推荐使用 mogstored 。 mogilefsd 可以配置到两个机器上使用不同端口… mogstored 为所有 DAV 操作 (和流量监测), 并且你自己选择的快速的HTTP服务器用来做 GET 操作(给客户端提供文件). 典型的用户没一个加载点有一个大容量的 SATA 磁盘,他们被加载到 /var/mogdata/devNN.

High-level 流程:
应用程序请求打开一个文件 (通过RPC 通知到 tracker, 找到一个可用的机器). 做一个 “create_open” 请求.
tracker 做一些负载均衡(load balancing)处理,决定应该去哪儿,然后给应用程序一些可能用的位置。
应用程序写到其中的一个位置去 (如果写失败,他会重新尝试并写到另外一个位置去).
应用程序 (client) 通过”create_close” 告诉tracker文件写到哪里去了.
tracker 将该名称和域命的名空间关联 (通过数据库来做的)
tracker, 在后台, 开始复制文件,知道他满足该文件类别设定的复制规则
然后,应用程序通过 “get_paths” 请求 domain+key (key == “filename”) 文件, tracker基于每一位置的I/O繁忙情况回复(在内部经过 database/memcache/etc 等的一些抉择处理), 该文件可用的完整 URLs地址列表.
应用程序然后按顺序尝试这些URL地址. (tracker’持续监测主机和设备的状态,因此不会返回死连接,默认情况下他对返回列表中的第一个元素做双重检查,除非你不要他这么做..)

[ 概念定义 ]
可以参考官方wiki的这儿,简单说一下
domain:最高域,在一个域下key是唯一的。
class:包含在domain中,可以针对每一个class定义保存的份数。
key:对文件的唯一标识。
file:文件。

[ 适用性 ]
      由于Mogilefs不支持对一个文件的随机读写,因此注定了只适合做一部分应用。比如图片服务,静态HTML服务。
      即文件写入后基本上不需要修改的应用,当然你也可以生成一个新的文件覆盖上去。

三、【安装Perl和相关包】

[ 安装环境 ]
操作系统:RHEL 4 (AS 4)
Perl版本:Perl v5.8.8
注意:请确保你的Perl版本为大于 v5.8.8,不然可能安装会有问题,另外,本文所有操作都是在一台机器上完成,可能多台机器上稍微有些不同,请自行调整

[ MySQL ]
安装前请安装好MySQL,如果MySQL Server和MogileFS不是一台机器,请在MogileFS机器安装好MySQL Client,本文假设MySQL Client安装在:/usr/local/mysql 目录,安装完客户端后请建立一个软链接:
ln -s /usr/local/mysql/lib/libmysqlclient.so.15 /usr/lib/libmysqlclient.so.15

[ Perl包安装 ]

      因为MogileFS需要使用很多相关的Perl包,请逐一按照一下次序安装,本文采用的是比较笨,比较简单的安装方法,逐个把包下载回来本机手工安装,没有使用cpan的包安装方式。
要下载包,请在http://search.cpan.org中输入包名,然后下载,一般提供的是最新版,如果版本跟下面不一致,请以最新版为准。

为方便使用,本文包下载地址列表:(不保证您阅读本文的时候有效)
http://search.cpan.org/CPAN/authors/id/J/JH/JHI/BSD-Resource-1.2901.tar.gz
http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.22.tar.gz
http://search.cpan.org/CPAN/authors/id/J/JH/JHI/Time-HiRes-1.9715.tar.gz
http://search.cpan.org/CPAN/authors/id/M/MS/MSERGEANT/Danga-Socket-1.59.tar.gz
http://search.cpan.org/CPAN/authors/id/M/MU/MUIR/modules/Net-Netmask-1.9015.tar.gz
http://search.cpan.org/CPAN/authors/id/M/ML/MLEHMANN/IO-AIO-3.07.tar.gz
http://search.cpan.org/CPAN/authors/id/D/DO/DORMANDO/Perlbal-1.71.tar.gz
http://search.cpan.org/CPAN/authors/id/S/SO/SOENKE/String-CRC32-1.4.tar.gz
http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Gearman-1.09.tar.gz
http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Gearman-Client-Async-0.94.tar.gz
http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Gearman-Server-1.09.tar.gz
http://search.cpan.org/CPAN/authors/id/T/TI/TIMB/DBI-1.607.tar.gz
http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.008.tar.gz
http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/MogileFS-Client-1.08.tar.gz
http://search.cpan.org/CPAN/authors/id/D/DO/DORMANDO/mogilefs-server-2.20.tar.gz
http://search.cpan.org/CPAN/authors/id/P/PM/PMQS/IO-Compress-Base-2.015.tar.gz
http://search.cpan.org/CPAN/authors/id/P/PM/PMQS/Compress-Raw-Zlib-2.015.tar.gz
http://search.cpan.org/CPAN/authors/id/P/PM/PMQS/IO-Compress-Zlib-2.015.tar.gz
http://search.cpan.org/CPAN/authors/id/P/PM/PMQS/Compress-Zlib-2.015.tar.gz
http://search.cpan.org/CPAN/authors/id/D/DS/DSKOLL/IO-stringy-2.110.tar.gz
http://search.cpan.org/CPAN/authors/id/P/PM/PMQS/Compress-Raw-Zlib-2.015.tar.gz

包安装次序:(务必按照本次序进行)

BSD-Resource-1.2901.tar.gz
Sys-Syscall-0.22.tar.gz

Time-HiRes-1.9715.tar.gz
Danga-Socket-1.57.tar.gz

Net-Netmask-1.9015.tar.gz
IO-AIO-3.07.tar.gz (本包要求Perl v5.8.8以上)
Perlbal-1.71.tar.gz

String-CRC32-1.4.tar.gz
Gearman-1.07.tar.gz
Gearman-Client-Async-0.93.tar.gz
Gearman-Server-1.08.tar.gz

#make test 有可能会有一个错误,不用管它
DBI-1.607.tar.gz
DBD-mysql-4.008.tar.gz

#以下命令假设MySQL服务器是在本机
perl Makefile.PL–testhost=localhost –testuser=root –mysql_config=/usr/local/mysql/bin/mysql_config

IO-Compress-Base-2.015.tar.gz
IO-Compress-Zlib-2.015.tar.gz
Compress-Raw-Zlib-2.015.tar.gz
Compress-Zlib-2.015.tar.gz
IO-stringy-2.110.tar.gz

MogileFS-Client-1.08.tar.gz
mogilefs-server-2.20.tar.gz
MogileFS-Utils-2.13.tar.gz

一定要按以上顺序安装,解压缩,生成Makefile,测试,安装 这样的步骤来执行,命令是:

# tar zxvf xxxxx.tar.gz
# cd xxxxx
# perl Makefile.PL
# make
# make test
# make install  

这样就安装成功了,注意make test的错误提示,如果不是很严重的错误提示,基本可以忽略继续下一步。

四、【配置MogileFS】

        以下操作除非明确指定,不然是以root用户来运行,当然,你也可以使用自己的帐户来执行(除了一些特权操作),另外 10.15.6.28 是本机IP,本试验只使用了一台机器。如果配置过程不太顺利,请反复检查后反复试验。

1. 创建数据库(初始化)
可以预先在数据库服务器上建立好一个叫做 mogilefs 的数据库,便于进行下面的步骤.
#mogdbsetup –dbhost=10.15.6.28 –dbname=mogilefs –dbuser=root

–dbhost 是数据库主机地址, –dbname是数据库名,–dbuser是访问该数据库的用户,如果有密码请加上–dbpass选项,最好访问数据库的是超级用户root或者具有很高权限的新建数据库用户,因为MogileFS需要一些比较高权限的初始化操作。

2. tracker配置
新建tracker配置文件 /etc/mogilefsd.conf ,写入以下文件内容:(请去掉#后面的注意信息)

db_dsn DBI:mysql:mogilefs #数据库配置
db_user mogile #数据库用户
db_pass 123123 #数据库密码
conf_port 6001 #tracker端口
listener_jobs 5

db_dsn指向的是你数据库的位置,如果你数据库不在同一个机器上,请改为:
db_dsn DBI:mysql:mogilefs:127.0.0.1

由于mogilefsd不能用root用户启动.所以添加mogile用户
# adduser mogile

在配置下面以前先启动 trackers server
# su mogile
# mogilefsd -c /etc/mogilefsd.conf –daemon

3. Storage Server 配置
说明:以下命令假设你的 Perl 的包文件都在 /usr/lib/perl5/5.8.8 目录,如果不是,请自行修改。

用mogadm工具将storage server加到数据库中:
# mogadm –lib=/usr/lib/perl5/5.8.8 –trackers=10.15.6.28:6001 host add mogilestorage –ip=10.15.6.28 –port=7500 –status=alive
(由于本文是在一台机器上配,故trackers的地址和ip地址是一样的)

用下面命令来检测是否成功:
# mogadm –lib=/usr/lib/perl5/5.8.8 –trackers=10.15.6.28:6001 host list

加入一个设备到你的storage server:
# mogadm -lib=/usr/lib/perl5/5.8.8 -trackers=10.15.6.28:6001 device add mogilestorage 1

用下面命令来检测是否成功:
# mogadm –lib=/usr/lib/perl5/5.8.8 –trackers=10.15.6.28:6001 device list

Device ID 是唯一的,一旦创建将无法删除,只能mark为dead. 所以,如果你某个磁盘坏了,你mark为dead, 后来又修好了,
那么你必须重新格式化并命名为新的device id, 不支持将device从dead变为alive.

新建Storage配置文件: /etc/mogstored.conf 内容是: (请去掉#后面的注意信息)

httplisten=0.0.0.0:7500 #HTTP监听端口
mgmtlisten=0.0.0.0:7501 #MongileFS监听端口
docroot=/opt/mogdata #数据存储物理路径

建立存放数据的路径:(必须使用root权限才能创建)
# mkdir -p /opt/mogdata/dev1

说明:mogadm 参数的用法请参考 http://search.cpan.org/~dormando/MogileFS-Utils/mogadm

4. 运行MogileFS

启动 Storage Server
# mogstored -c /etc/mogstored.conf –daemon

如果没有启动Trackers,请启动 Trackers
# su mogile
$ mogilefsd -c /etc/mogilefsd.conf –daemon

查看你所有的服务都起来没有
# ps -ef | grep mogilefsd
# ps -ef | grep mogstored

五、【MogileFS使用测试】

生成domain
# mogadm –lib=/usr/lib/perl5/5.8.8 –trackers=10.15.6.28:6001 domain add testdomain

加一个 class 到domain
# mogadm –lib=/usr/lib/perl5/5.8.8 –trackers=10.15.6.28:6001 class add testdomain testclass

写一个perl文件试一下test.pl
#=======================================
use MogileFS::Client;
my $mogfs = MogileFS::Client->new(domain=>’testdomain’, hosts=>[‘10.0.22.184:6001′], root=>’/home/xiehl/mogdata’,);
my $fh = $mogfs->new_file("file_key", "testclass");
die $fh unless $fh->print($mogfs->readonly);
my $content = "file.txt";
@num = $mogfs->store_content("file_key","testclass",$content);
print "@num \n";
my $file_contents = $mogfs->get_file_data("file_key");
print "$file_contents \n";
#$mogfs->delete("file_key");
$fh->print($file_contents);
@urls = $mogfs->get_paths("file_key");
print "@urls \n";
#=======================================

执行脚本
# perl test.pl

本文返回的内容是:(可能你返回的内容会不同,格式类似就行)

8
SCALAR(0×9ddaaa8)
http://10.15.6.28:7500/dev1/0/000/000/0000000008.fid

在浏览器里输入:http://10.15.6.28:7500/dev1/0/000/000/0000000008.fid,将会看到输出:
file.txt

能够访问我们存储的数据,配置成功!

六、【附加内容】

[ MySQL检测代码 ]

如果需要检测你的DBI和MySQL Client是否安装正常,可以使用一下数据库测试代码来检测能否正常连接到MySQL:

#=======================================
#!/usr/bin/perl
# DBI is perl module used to connect to the database
use DBI;
# hostname or ip of server (for local testing, localhost should work)
$config{’dbServer’} = "localhost";
$config{’dbUser’} = "root";
$config{’dbPass’} = "";
$config{’dbName’} = "test";
$config{’dataSource’} = "DBI:mysql:$config{’dbName’}:$config{’dbServer’}";
# Connect to MySQL
my $dbh = DBI->connect($config{’dataSource’},$config{’dbUser’},$config{’dbPass’}) or
die "Can’t connect to $config{’dataSource’}<br>$DBI::errstr";
print "Connected successfully<br>";
$dbh->disconnect();
#=======================================

[ 相关参考 ]

mogilefs 最新版本安装: http://www.wuei.net/?p=33
Mogilefs学习: http://blog.chifeng.name/?p=220
mogileFS的工作方式: http://www.sunnyu.com/?p=32
mogileFS分布式文件存储解决方案: http://www.sunnyu.com/?p=10

[ 扩展阅读 ]

编译mogileFS的php模块: http://www.sunnyu.com/?p=78
mogileFS体系结构分析: http://www.sunnyu.com/?p=31
mogileFS体系结构分析: http://www.sunnyu.com/?p=30

分类: 架构 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.

=2加5(必填)请输入两数相加的结果。