MogileFS是一个开源的分布式文件存储系统,是由LiveJournal旗下的Danga Interactive公司开发。目前使用MogileFS的公司非常多,如日本排名先前的几个互联公司以及国内的Yupoo(又拍)、digg、豆瓣、大众点评、搜狗等,分别为所在的组织或公司管理着海量的图片。以大众点评为例,用户全部图片均有MogileFS存储,数据量已经达到500TB以上
二、MogileFS的特性:
1、支持多节点冗余
2、自动完成文件复制:复制的最小单位不是文件,而是class,文件可以被自动复制到多个有足够存储空间的存储节点上;
3、使用名称空间(命名空间),每个文件通过key来确定,是一个全局的命名空间,没有目录基于域实现文件隔离;
4、不需要RAID,应用层可以直接实现R ID,不共享任何东西,通过“集群”接口提供服务
5、工作在应用层,没有特殊的组件要求
6、不共享任何数据,mogilefs不需要依靠昂贵的SAN来共享磁盘,每个机器只用维护好自己的磁盘。每个存储节点只需维护自己所属的存储设备(device);
7、无单点:三大组件(tracker、mogstore,database)皆可实现高可用;
三、MogileFS组成部分
MogileFS由3个部分组成:
1、server:主要包括mogilefs和mogstored两个应用程序。
mogilefs实现的是tracker,它通过数据库来保存元数据信息,包括站点domain、class、hots等;mogstored是存储节点(storgenode’),它其实是个WsbDAV服务,默认监听在7500 端口,接受客户端的文件存储请求。在Mogilefs安装完后,要运行mogadm工具将所有storge node注册到mogilefs的数据库里,mogilefs会对这些节点进行管理和监控。
2、utils(工具集):主要是Mogilefs的一些管理工具,例如mogadm等3、客户端API:mogilefs的客户端API很多,例如Perl、PHP、java、python等,用这个模块可以编写客户端程序,实现文件的备份管理功能等
四、MogileFS原理
术语解释
1、 tracker:借助数据库保存各个节点的元数据信息,便于检索定位数据位置并监控各个节点,告知客户端存储区的位置并指挥storage节点复制数据副本,进程为mogilefsd。调度器,是mogilefs的核心部分,MogileFSd 进程就是trackers进程程序,trackers 做了很多工作:Replication,Deletion,Query,Reaper,Monitor 等等,这个是基于事件的( event-based ) 父进程/消息总线来管理所有来之于客户端应用的交互(requesting operations to be performed),包括将请求负载平衡到多个“query workers”中,然后让 MogileFSd 的子进程去处理。
2、database:database存放mogilefs的元数据 (命名空间, 和文件在哪里),是Trackers来操作和管理它,可以用mogdbsetup程序来初始化数据库,因为数据库保存了MogileFS的所有元数据,建议做成HA架构。
3、storage:将指定域中的键转换我I特有的文件名存储与在特定的设备文件中,转换后文件名为值,storage自动维护键值之间的对应关系,storage节点使用http进行数据传输,依赖于perbl,进程为mogstored,perbal;storage是mogilefs的存储文件储存的地方,也是 mogstored 节点,也叫 Storage Server,一台存储要启动一个mogstored服务,扩容就是增加这些机器,扩大文件存放的地方。
客户端.连接到一个域,然后在域中拿着文件的 key 来查文件的位置,然后通过查到集群中的位置来打开这个文件.
图示如下:
数据存储结构:
Class:复制的最小单位,管理文件属性,定义文件存储在不同设备上的分数;
device:一个存储节点,可以有多个device,就是用来存放文件的目录,每个设备都有一个设备ID,需要在mogstored配置文件中docroot配置,设备不能删除,只能将设备的状态置为dead,置为dead之后数据就无法恢复了,并且设备ID也无法使用。(建议每个节点只有一个device,文件存储多份时,有多余数据备份在当前节点其他设备,等于没有备份,若只备份2份,节点发生故障,数据就会丢失);
五、Mogilefs架构图

1、 客户端在发起一次数据请求,假设请求banner.jpg,请求首先到达前端代理perbal(当然此处可利用Nginx实现)
2、 perbal或nginx会将请求代理至Mogilefs client(这里解释下,MogileFS本身就是一个Web服务可以提高返回数据信息,不过普通的浏览器或web客户端是不具备利用获取的Mogilefs返回的数据位置信息再次请求storage节点获取数据的,所以此处需要一个特定的客户端来访问Mogilefs,而此客户端在Nginx代理时,是nginx的特定的模块。)
3、 mogilefs client模块将请求发往trackers节点,trackers向DB server发起查询
4、 tracker将以banner.jpg为key查询到的vlaue值发给nginx。
5、 Nginx通过Mogilefs API向storage 节点请求数据。
这就是一次完整的数据获取过程。
六、MogileFS的安装:
常用的有两种安装方式:yum安装和perl程序安装。
方法1:yum安装(需要配置epel源):在线安装,好处是安装方式简单,不易出错;常用的安装yum源为epel。
解决依赖关系,需要安装perl-IO-AIO:yum install perl-Net-Netmask perl-IO-String perl-IO-AIO
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl- YAML perl-Time-HiRes
yum install perl-Net-Netmask perl-IO-String perl-IO-AIO
yum install -y "perl(Module::Find)"
cpan –I Sys::Syscall
[root@logicserver MogileFS]# ll
总用量
620
-rw-r--r--.
1
root root
1916
6
月
3
17
:
03
MogileFS-Server-
2.46
-
2
.el6.noarch.rpm
-rw-r--r--.
1
root root
176308
6
月
3
17
:
03
MogileFS-Server-mogilefsd-
2.46
-
2
.el6.noarch.rpm
-rw-r--r--.
1
root root
26872
6
月
3
17
:
03
MogileFS-Server-mogstored-
2.46
-
2
.el6.noarch.rpm
-rw-r--r--.
1
root root
75916
6
月
3
17
:
49
MogileFS-Utils-
2.19
-
1
.el6.noarch.rpm
-rw-r--r--.
1
root root
5880
6
月
3
18
:
04
Perlbal-
1.78
-
1
.el6.noarch.rpm
-rw-r--r--.
1
root root
1624
6
月
3
18
:
04
Perlbal-doc-
1.78
-
1
.el6.noarch.rpm
-rw-r--r--.
1
root root
30312
6
月
3
17
:
49
perl-MogileFS-Client-
1.14
-
1
.el6.noarch.rpm
-rw-r--r--.
1
root root
25140
6
月
3
17
:
49
perl-Net-Netmask-
1.9015
-
8
.el6.noarch.rpm
-rw-r--r--.
1
root root
268620
6
月
3
17
:
50
perl-Perlbal-
1.78
-
1
.el6.noarch.rpm
yum install *.rpm
下载本地安装的rpm包:网盘里已打包MogileFS-Server-2.46-2.el6.noarch.rpm #核心服务
perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm #socket
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm # tracker节点
perl-MogileFS-Client-1.14-1.el6.noarch.rpm #客户端
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm #Storage存储节点
MogileFS-Utils-2.19-1.el6.noarch.rpm #主要是MogileFS的一些管理工具,例如mogadm等。
方法2:perl程序源码包安装:
cpan –I Sys::Syscall
Sys::Syscall
Danga::socket
BSD::Resource
common::sense
IO::AIO
Perlbal
ExtUtils::MakeMaker
Test::Simple
DBI
Net::Netmask
IO::WrapTie
MogileFS::Client
DBD::mysql
MogileFS::Utils
Gearman::Client
Gearman::server
2:安装mogilef server
# wget http://search.cpan.org/CPAN/authors/id/D/DO/DORMANDO/MogileFS-Server-2.44.tar.gz# tar zxvf MogileFS-Server-2.44.tar.gz
# cd MogileFS-Server-2.44
# perl Makefile.PL
# make && make install
配置文件
1
2
3
|
[root@logicserver MogileFS]# cd /etc/mogilefs/
[root@logicserver mogilefs]# ls
mogilefsd.conf mogstored.conf
|
查看安装哪些包
1
2
3
4
5
6
|
[root@logicserver mogilefs]# rpm -qa | grep -i mogilefs
MogileFS-Server-mogstored-
2.46
-
2
.el6.noarch
MogileFS-Server-mogilefsd-
2.46
-
2
.el6.noarch
perl-MogileFS-Client-
1.14
-
1
.el6.noarch
MogileFS-Server-
2.46
-
2
.el6.noarch
MogileFS-Utils-
2.19
-
1
.el6.noarch
|
五、MogileFS程序路径:
主程序:/usr/bin/mogilefsd
命令行管理工具程序:/usr/bin/mogadm
主配置文件(Tracker):/etc/mogilefs/mogilefsd.conf
主配置文件(Storage Nodes):/etc/mogilefs/mogstored.conf
六、MogileFS的主配置文件解析:
6.1 tracker配置文件:/etc/mogilefs/mogilefsd.conf
【1】 daemonize = 1 #设置为1表示启动为守护进程【2】 db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
db_user = username
db_pass = password #配置数据库连接相关信息
【3】listen = 127.0.0.1:7001 #mogilefs监听地址,监听在127.0.0.1表示只允许从本机登录进行管理
【4】query_jobs = 10 #启动多少个查询工作线程
【5】delete_jobs = 1 #启动多少个删除工作线程
【6】replicate_jobs = 5 #启动多少个复制工作线程
【7】reaper_jobs = 1 #启动多少个用于回收资源的线程
storage配置文件:/etc/mogilefs/mogstored.conf
【1】maxconns = 10000 #存储系统的最大连接数
【2】httplisten = 0.0.0.0:7500 #可通过http访问的服务端口
【3】mgmtlisten = 0.0.0.0:7501 #mogilefs的管理端口
【4】docroot = /var/mogdata #该项决定了数据在storage上存储的实际位置,建议使用的是一个单独挂载使用的磁盘
6.2、确保pid文件属主,属组为mogilefs
1
2
|
[root@logicserver ~]# ls -ld /
var
/run/mogilefsd
drwxr-xr-x.
2
mogilefs mogilefs
4096
10
月
8
2013
/
var
/run/mogilefsd
|
6.3 启动mogilefsd并确定监听端口为7001
1
2
|
[root@logicserver ~]# /etc/init.d/mogilefsd start
Starting mogilefsd [确定]
|
1
|
[root@xenserver1 data0]# netstat -tlnp | grep
7001
|
七、安装MariaDB
1
2
3
4
5
6
|
[root@logicserver mogilefs]# vim /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http:
//yum.mariadb.org/5.5/centos6-amd64
gpkgkey=https:
//yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=
1
|
手动导入MariaDB的签署密钥
1
|
[root@logicserver mogilefs]# rpm --
import
https:
//yum.mariadb.org/RPM-GPG-KEY-MariaDB
|
开始yum安装并启动
1
|
[root@logicserver mogilefs]# yum install MariaDB-server MariaDB-client
|
1
|
[root@logicserver mogilefs]# /etc/init.d/mysql start
|
启动MogileFS前,设定数据库
在数据前授权
1
|
MariaDB [mogilefs]> grant all on mogilefs.* to moguser@
'10.1.%.%'
indentified by
'mog168'
;
|
设定数据库
1
2
3
4
5
6
7
8
|
[root@logicserver ~]# mogdbsetup --dbhost=
10.1
.
2.180
--dbport=
3306
--dbname=mogilefs --dbrootuser=root --dbrootpass=
168
--dbuser=moguser --dbpass=mog168
This will attempt to setup or upgrade your MogileFS database.
It won't destroy existing data.
Run
with
--help
for
more information. Run
with
--yes to shut up these prompts.
Continue? [N/y]: y
Create/Upgrade database name
'mogilefs'
? [Y/n]: y
Grant all privileges to user
'moguser'
, connecting from anywhere, to the mogilefs database
'mogilefs'
? [Y/n]: y
Failed to grant privileges: Access denied
for
user
'root'
@
'10.1.%.%'
to database
'mogilefs'
|
注意有错提示Failed to grant privileges: Access denied for user 'root'@'10.1.%.%' to database 'mogilefs'
去数据库查看,已经创建了,但没有tables
1
2
3
4
5
6
7
8
9
|
MariaDB [mysql]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mogilefs |
| mysql |
| performance_schema |
| test |
|
1
2
3
4
|
MariaDB [mysql]>
use
mogilefs;
Database changed
MariaDB [mogilefs]> show tables;
Empty
set
(
0.00
sec)
|
3.4手动创建用户moguser,并授权mogilefs的所有权限
1
2
3
4
|
MariaDB [mogilefs]> grant all on mogilefs.* to moguser@
'10.1.%.%'
identified by
'mog168'
;
Query OK,
0
rows affected (
0.00
sec)
MariaDB [mogilefs]> flush privileges;
Query OK,
0
rows affected (
0.00
sec)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@logicserver ~]# mogdbsetup --dbhost=
10.1
.
2.180
--dbport=
3306
--dbname=mogilefs --dbrootuser=root --dbrootpass=
168
--dbuser=moguser --dbpass=mog168
This will attempt to setup or upgrade your MogileFS database.
It won't destroy existing data.
Run
with
--help
for
more information. Run
with
--yes to shut up these prompts.
Continue? [N/y]: y
Create/Upgrade database name
'mogilefs'
? [Y/n]: y
Grant all privileges to user
'moguser'
, connecting from anywhere, to the mogilefs database
'mogilefs'
? [Y/n]: y
Failed to grant privileges: Access denied
for
user
'root'
@
'10.1.%.%'
to database
'mogilefs'
[root@logicserver ~]# mogdbsetup --dbhost=
10.1
.
2.180
--dbport=
3306
--dbname=mogilefs --dbrootuser=root --dbrootpass=
168
--dbuser=moguser --dbpass=mog168
This will attempt to setup or upgrade your MogileFS database.
It won't destroy existing data.
Run
with
--help
for
more information. Run
with
--yes to shut up these prompts.
Continue? [N/y]: y
|
去数库查看
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
MariaDB [mogilefs]> show tables;
+----------------------+
| Tables_in_mogilefs |
+----------------------+
| checksum |
|
class
|
| device |
| domain |
| file |
| file_on |
| file_on_corrupt |
| file_to_delete |
| file_to_delete2 |
| file_to_delete_later |
| file_to_queue |
| file_to_replicate |
| fsck_log |
| host |
| server_settings |
| tempfile |
| unreachable_fids |
+----------------------+
17
rows
in
set
(
0.00
sec)
|
1、数据库授权:
GRANT ALL PRIVILEGES ON *.* TO 'root' @'192.168.1.%' IDENTIFIED BY 'mogile';
create databases mogiles;
GRANT ALL PRIVILEGES ON mogiles.* TO 'mogile' @'192.168.1.%' IDENTIFIED BY 'mogile' WITH GRANT OPTION;
flush privileges;
【注:WITH GRANT OPTION 表示前面授权的mogile用户也可以对其他用户授权】
2、设定数据库:
mogdbsetup --help 查看帮助
mogdbsetup --dbhost=172.17.251.222 --dbpass=123456
用户名默认为:mogile
3、添加运行用户:
useradd -r mogilefs
mkdir /var/run/mogilefsd/
chown -R mogilefs.mogilefs /var/run/mogilefsd #yum安装的话已经完成
4、修改主配置文件:
Tracker配置文件:/etc/mogilefs/mogilefsd.conf
Storage配置文件:/etc/mogilefs/mogstored.conf
5、启动服务:
Tracker启动:/etc/init.d/mogilefsd start
Storage启动:/etc/init.d/mogstored start
八、Mogilefs的管理:
mogstored 程序的启动将使主机本身成为一个存储的节点,mogstored启动后,还需要使用mogadm来让当前的这个主机加入到MogileFS的系统中,这就是一个存储节点,注意存储节点中还需要添加设备,每个设备有一个uniq的ID号,同样也要使用mogadm 来加入到 MogileFS 的系统中。
八、Mogilefs的管理:
mogstored 程序的启动将使主机本身成为一个存储的节点,mogstored启动后,还需要使用mogadm来让当前的这个主机加入到MogileFS的系统中,这就是一个存储节点,注意存储节点中还需要添加设备,每个设备有一个uniq的ID号,同样也要使用mogadm 来加入到 MogileFS 的系统中。
MogileFS 中的存储主机(节点)管理:
1.添加“存储节点”到 trackers 中:
【mogadm host add --ip=127.0.0.1 --port=7500 --status=alive/down】 #添加主机,将主机信息注册到数据库中
2.修改添加到trackers中的“存储节点”:
【mogadm --tracker=172.17.17.222:7001 host modify node1 --ip=172.17.17.221 --port=7500 --status=alive/down】
3.检查这个主机是否加入到 MogileFS 的系统中:
【mogadm --tracker=172.17.17.222:7001 host list】或【mogadm --tracker=172.17.17.222:7001 check】
MogileFS 中的存储设备管理:
建一个目录(并且需要mount一个硬盘给这个目录)给这个"设备" 使用, 我们这的例子是使用dev1在主机中建一个目录,建目录使用 dev + ID 这种格式,记的所有系统中ID不能重复。也必须和配置文件中的路径一样。
1.【mkdir -p /data/mogdata/dev1】 *一定要注意, 给相对应用的块设备mount到这个点, 软链也行。不然写文件都会写到系统硬上,其它的硬盘都是空的
2.【mogadm device add ID】 #把"设备"加入”存储的节点“当中,相当于把每个设备加入MogileFS的存储系统
3.【mogadm device list】 #查看添加的设备
4.【mogadm device mark ID dead】 #标记失效的设备,当硬盘坏了,设备有问题时,这时会自动在一个域内复制到最小设置的保存份数,恢复上面一样在一次add设备就好了
MogileFS 中域,类的管理:
当上面的准备好了,MogileFS 是运行中时,接下来我们要建一个我们自己的'名字空间'和加入文件到存储当中。我们使用 mogadm 的工具来能创建一个"域"和"类",也可以使用这个来增加文件到"类"中。
1.建"域"
【mogadm domain add 】
2.检查"域",显示存在的域
【mogadm domain list】
3.在"域"中建"类",并加入最小保存份数
【mogadm class add --mindevcount=3】
MogileFS 中文件管理:
若没有在/etc/mogilefs/mogilefs.conf 中指定 trackers , 那么需要在下面的命令都加上--trackers来指定。
1.上传文件:
【mogupload --domain=magedu --key= --file=】
2.查询文件:
【mogfileinfo --trackers=host --domain= --key=】
3.删除指定文件:
【mogdelete --domain= --key=】
4.列出指定domain下面的所有的key,也可以指定的一个前缀, 来找特定前缀的所有文件的key。
【moglistkeys --domain= --key_prefix=】
5.列出指定 fid 的文件:
这个 fromfid 是指 mogileFS 内部的文件 id , 这个是自增的, 你可以指定一个开始的位置, 指定显示多少文件, 这个用于查询指定时间段内上传的文件时很有用. 比如我们在 8 点上传了一个文件, 是 100 的 id, 我们可以查询到从这个之后的所有的 id 的文件。
【moglistfids --fromfid= --count=<数量>】
暂时停止服务器:
如果你需要维护一个服务器,比如更新内存,升级操作系统之类的需要关机的操作,推荐你在操作之前先设置这些为 "down"。MogileFS 对这种偶然的故障可以很弹性的处理。
$ mogadm host mark mystorage down
$ mogadm host mark mystorage alive
添加新的硬盘设备编号:
添加新的硬盘设备需要给一个唯一的,增量的设备 ID(devid)。如果你用一个新的硬盘来更换坏掉的硬盘,总是需要给一个新的 devid。不能重用老的devid。之所以这样做的原因是可以让你从旧设备中给所有文件列表中的文件,重新复制到其它的Mogilefs 的硬盘中.不然容易引起文件不会复制到这个中和错误的更新,也不会重新复制的旧文件。
添加设备的命令如下:
【mogadm --tracker=172.17.xxx.xxx:7001 device add node 5 --status=alive】
【mogadm --tracker=172.17.xxx.xxx:7001 device add node 5 --status=down】
只读模式和耗尽(Drain) 模式:
如果你想要冻结设备上所有的文件,你要使用只读模式就行了。这将停掉 MogileFS 存放新文件到这个设备上,但它也将阻止删除文件。代替的删除的操作是会给这些内容放到队列中等待为您标记为'alive'着或'drain'。
【mogadm device mark mystorage 5 readonly】
【mogadm device mark mystorage 5 drain】
耗尽(Drain) 模式,在2.40和更高版本以上,告诉MogileFS不会有新的文件应写入设备。但是在耗尽(Drain) 模式,文件可能被删除。所以如果你不希望写文件到这个设备上,可以设置为drain的模式。
注:耗尽(Drain) 模式在MogileFS的早期版本,将会从设备删除 FIDS。现在它已经被重新均衡的功能取代。
重新复制文件:
如果有一个硬盘坏了MogileFS可以自动的让请求不在访问这个设备,但是不会自动的重新复制这个硬盘的文件,你必须通过 mogadm来手工来标志成 'dead'。只要你这样做,MogileFS将开始删除设备上的文件,并试图在集群间重新复制它们到其它的设备上。