今天我们来认识一个新的存储系统——MogileFS(分布式文件存储系统)。

(一)MogileFS是什么

  MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发。Danga团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。目前使用MogileFS 的公司非常多,如日本排名先前的几个互联公司及国内的yupoo(又拍)、digg、豆瓣、1号店、大众点评、搜狗和安居客等,分别为所在的组织或公司管理着海量的图片,以大众点评为例,用户全部图片均有mogileFS存储,数据量已经达到500TB级别以上。

(二)MogileFS有什么特性

  1、支持多节点冗余
  2、可实现自动的文件复制
  3、使用名称空间(命名空间),每个文件通过key来确定
  4、不需要RAID,应用层可以直接实现RAID,不共享任何东西,通过“集群”接口提供服务
  5、工作于应用层,没有特殊的组件要求
  6、不共享任何数据,MogileFS不需要依靠昂贵的SAN来共享磁盘,每个机器只用维护好自己的磁盘。

(三)MogileFS的架构

  mogileFS主要由三部分构成:tracker节点,database节点,storage节点
  1、Tracker(MogileFSd 进程):这个是 MogileFS 的核心部分,他是一个调度器, MogileFSd 进程就是trackers进程程序,trackers 做了很多工作:Replication,Deletion,Query,Reaper,Monitor 等等,这个是基于事件的( event-based ) 父进程/消息总线来管理所有来之于客户端应用的交互(requesting operations to be performed), ,包括将请求负载平衡到多个“query workers”中,然后让 MogileFSd 的子进程去处理;
  2、Database(MySQL):用来存放 MogileFS 的元数据 (命名空间, 和文件在哪里),是Trackers 来操作和管理它,可以用mogdbsetup程序来初始化数据库,因为数据库保存了MogileFS的所有元数据,建议做成HA架构;
  3、Storage Nodes:这个是 MogileFS 存储文件存放在这些机器上,也是 mogstored 节点,也叫 Storage Server,一台存储主要都要启动一个 mogstored 服务.扩容就是增加这些机器,实际文件存放的地方。

(四)MogileFS的工作机制

    基于MogileFS的分布式存储系统_第1张图片
  每次文件的上传和读取,都经过前端TrackerServer服务器,trackerServer服务器受到client端的请求,查询数据库,返回 一个上传或者是读取的可用的后端StorageServer的地址,然后由client端直接操作后端StorageServer服务器。upload操 作返回就是成功或者失败的结果,read操作就是返回对应的查询数据。

(五) 具体的安装和实现

  通常情况下有两种安装方式:yum安装和源码安装,这里我们就以yum安装为例。
1、首先要安装下列相关包

yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO  -y
yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker -y
本地安装的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 #客户端 
ogileFS-Server-mogstored-2.46-2.el6.noarch.rpm #Storage存储节点 
MogileFS-Utils-2.19-1.el6.noarch.rpm #主要是MogileFS的一些管理工具,例如 mogadm等。

2、 在tracker上进行以下配置
  1.安装完mogilefs相关包后,安装mariadb数据库,然后对用户进行授权:

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'mogile' @'172.17.%.%' IDENTIFIED BY 'mogile' WITH GRANT OPTION;

  2.设定数据库(MogileFS 中文件管理,我们可以简单的使用 mog 开头的系列 Linux 命令, 来进行管理, 当然也可以用 Client 的 API 来管理. 新的 MogileFS 的工具, 拆分成多个了. 下面这些命令, 都需要在 /etc/mogilefs/mogilefs.conf 中指定 trackers , 不然就需要在下面的命令都加上 –trackers 来指定.)

mogdbsetup --help 
mogdbsetup --dbhost=127.0.0.1 --dbpass=mogile 用户名默认为:mogile

  3.修该tracker的主配置文件

db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
db_user = mogile
db_pass = mogile
listen = 172.17.253.210:7001

  4.用自带脚本启动该服务,可以看到7001端口已经打开

/etc/init.d/mogilefsd start

  5.登录MySQL,查看mogilefs库是否生成

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mogilefs           |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

MariaDB [(none)]> use mogilefs;
Database changed
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)

3、配置storage文件
  1.修改storage配置文件(由于两个storage节点配置一样,这里就以storage1节点为例。storage1:172.17.254.222,storage2:172.17.254.224)

vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /data/mogstorage

  2.MogileFS 中的存储设备管理
  建一个目录并修改目录权限 ( 并且需要 mount 一个硬盘给这个目录 ) 给这个"设备" 使用, 我们这的例子是使用 dev1在主机中建一个目录,建目录使用 dev + ID 这种格式,记的所有系统中 ID 不能重复.也必 须和配置文件中的路径一样. 如下: mkdir -p /data/mogstorage/dev1 一定要注意, 给相对应用的块设备 mount 到这个点, 软链也行. 不然写文件都会写到系统硬上, 其它的硬盘都是空的

mkdir -p /data/mogstorage/dev1
 chown mogilefs.mogilefs /data/mogstorage/ -R

  3.启动服务,可以看到7500端口已打开

/etc/init.d/mogstored start

4、在tracker节点上进行mogilefs存储主机的管理:
   1.现在加入“存储节点”到 trackers 中.告诉注册自己到 trackers.相当于为每个主机 加入 MogileFS 的存储系统

mogadm host add node1 --ip=172.17.254.222 --port=7500 --status=alive #添加主机,将主机信息注册到数据库中 
mogadm host list #检查这个主机是否加入到 MogileFS 的系统中
[root@localhost mysql]#mogadm host list
node1 [1]: alive
  IP:       172.17.254.222:7500

node2 [2]: alive
  IP:       172.17.254.224:7500
mogadm host modify node1 --ip=123.xxx.xxx.70 --status=alive #可以修改主机IP

  2.给"设备"加入”存储的节点“当中,相当于为每个设备加入 MogileFS 的存储系统

mogadm device add node1 1
mogadm device add node2 2
mogadm device list
[root@localhost mysql]#mogadm device list
node1 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      3.780     46.195     49.976        100

node2 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      3.410     46.565     49.976        100

  标记失效的设备,当硬盘坏了,设备有问题时,这时会自动在一个域内复制到最小设置的保存份数. 恢复上面一样再一次 add 设备就好了 mogadm device mark node_name ID dead
  3.当上面的准备好了,MogileFS 是运行中时,接下来我们要建一个我们自己的'名字空间'和加入文 件到存储当中. 我们使用 mogadm 的工具来能创建一个"域"和"类".也可以使用这个来增加文件到"类"中.

建"域" 
mogadm domain add imgs
检查"域",显示存在的域 
mogadm domain list 
在"域"中建"类",并加入最小保存份数
mogadm class add imgs class1 --mindevcount=3
[root@localhost mysql]#mogadm domain list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 imgs                 class1                    3        MultipleHosts() NONE   
 imgs                 default                   2        MultipleHosts() NONE   

  4.上传文件进行测试

mogupload --domain=imgs --key=test1 --file=test1.png
mogupload --domain=imgs --key=test2 --file=test2.jpg
[root@localhost mysql]#mogfileinfo --domain=imgs --key=test1#查询文件
- file: test1
     class:              default
  devcount:                    2
    domain:                 imgs
       fid:                   11
       key:                test1
    length:                72825
 - http://172.17.254.224:7500/dev2/0/000/000/0000000011.fid
 - http://172.17.254.222:7500/dev1/0/000/000/0000000011.fid
[root@localhost mysql]#mogfileinfo --domain=imgs --key=test2
- file: test2
     class:              default
  devcount:                    2
    domain:                 imgs
       fid:                   10
       key:                test2
    length:                87170
 - http://172.17.254.222:7500/dev1/0/000/000/0000000010.fid
 - http://172.17.254.224:7500/dev2/0/000/000/0000000010.fid

  在两个存储节点可以看到文件已经都存在了:
基于MogileFS的分布式存储系统
  这里有一个bug,如果不解决这个bug会导致这两个存储节点的数据不同步,来看一下bug存在的情况下:
基于MogileFS的分布式存储系统_第2张图片
  这个0的目录下只在storage1节点存在,而另一边没有,然而这个问题就是由于我们安装的这个Sys-Syscall的版本存在的问题,由于我们目前的版本是0.25的版本,所以这里我们就需要降级,降到0.23的版本,这里我们就需要去Sys-Syscal官网下载0.23的版本,然后编译安装。之后就看到了两边文件同步的状况。

tar xf Sys-Syscall-0.23.tar.gz 
cd Sys-Syscall-0.23/
perl Makefile.PL 
make
mkae install

5、在网页上访问任意路径,可以看到能正常访问我们上传的图片。
基于MogileFS的分布式存储系统_第3张图片