mogilefs是一个开源的分布式文件存储系统。

mogilefs的工作原理:每次文件的上传和读取,都经过前端trackerserver服务器,trackerserver服务器收到客户端的请求,查询数据库,返回一个上传或者是读取可用的后端storageserver的地址,然后由客户端直接操作后端storageserver服务器,下载操作返回就是成功或者失败的果,read操作就是返回对应的查询数据。

它支持多节点冗余。

可实现自动的文件复制。

使用名称空间,每个文件通过key来确定

工作于应用层,没有特殊的组件要求。

不共享任何数据,mogilefs不需要依靠昂贵的SAN来共享磁盘,每个机器只用维护好自己的磁盘。

mogilefs主要有三部分构成:tracker节点,database节点,storage节点。

tracker节点:这个是mogilefs的核心部分,它是一个调度器。借助数据库保存各节点文件的元数据信息,保存每个域中所有键的存储位置分布,方便检索定位数据位置的同时监控各节点,告诉客户端存储区位置并指挥storage节点复制数据副本。除此之外,它还负责数据的删除,复制,监控,查询等,可以作为负载均衡。

mysql节点:用来存放mogilefs的元数据,是trackers来操作和管理它,可以用mogdbsetup程序来初始化数据库。

storage节点:这个是mogilefs存储文件存放在这些机器上,每一台存储都要启动一个mogstored服务,扩容就是增加这些机器。

MogileFS管理的几个概念:
1、Domain:一个MogileFS可以有多个Domain,用来存放不同文件(大小,类型),同一个Domain内key必须唯一,不同Domain内,key可以相同;
2、每一个存储节点称为一个主机host,一个主机上可以有多个存储设备dev(单独的硬盘),每个设备都有ID号,Domain+Fid用来定位文件。
3、Class:文件属性管理,定位文件存储在不同设备上的份数;

mogilefs安装方式

mogilefs安装常用两种方式,yum安装和perl程序安装
yum 安装:通常是在线安装,好处是安装方式简单,不易出错;常用的安装yum源为epel
yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO

本地安装的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等。

分别在tracker节点和storage节点上安装以上软件包,为了节省资源,我的tracker节点和mysql

数据库放在一台机器上。

perl程序源码包安装:通过perl的包管理命令cpanm进行安装
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes
cpanm安装
wget http://xrl.us/cpanm -O /usr/bin/cpanm; sudo chmod +x
/usr/bin/cpanm
#cpanm DBD::mysql
#cpanm MogileFS::Server
#cpanm MogileFS::Utils
#cpanm MogileFS::Client
#cpanm IO::AIO

mogilefs程序路径

主程序:/usr/bin/mogilefsd
命令行管理工具程序:/usr/bin/mogadm
主配置文件(Tracker):/etc/mogilefs/mogilefsd.conf
主配置文件(Storage Nodes):/etc/mogilefs/mogstored.conf

mogilefs程序功能的配置文件介绍
daemonize = 1
设置为1表示启动为守护进程
db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
db_user = username
db_pass = password
#配置数据库连接相关信息
listen = 127.0.0.1:7001
mogilefs监听地址,监听在127.0.0.1表示只允许从本机登录进行管理
query_jobs = 10
启动多少个查询工作线程
delete_jobs = 1
启动多少个删除工作线程
replicate_jobs = 5
启动多少个复制工作线程
reaper_jobs = 1
启动多少个用于回收资源的线程

mogilefs服务初始化

授权给用户,使授权的用户可以登录到数据库
MariaDB [(none)]> grant all privileges on mogilefs.* to 'mogile'@'127.0.0.1' identified by '123456'with grant option;
Query OK, 0 rows affected (0.08 sec)
刷新授权表
MariaDB [(none)]> flush  privileges;
Query OK, 0 rows affected (0.00 sec)
使用mogdbsetup命令安装mogilefs数据库
[root@centos7 ~]# mogdbsetup  --dbpass=123456

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 'mogile', connecting from anywhere, to the mogilefs database 'mogilefs'? [Y/n]: y
验证初始化数据库的结果
[root@centos7 ~]# mysql -umogile -p123456
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 5.5.52-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

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

MariaDB [(none)]> use mogilefs;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

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     |
| zzz                  |
+----------------------+
18 rows in set (0.00 sec)


配置tracker文件

修改以下四项即可,其他的根据具体的工作环境而定

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


安装好tracker后会在/var/run/生成该目录,改变目录的属主和属组

[root@centos7 ~]# chown -R mogilefs.mogilefs  /var/run/mogilefsd


启动mogilefsd服务

[root@centos7 ~]# cd /etc/mogilefs/
[root@centos7 mogilefs]# /etc/init.d/mogilefsd  start
Starting mogilefsd (via systemctl):                        [  OK  ]
[root@centos7 mogilefs]# ss -ntl|grep 7001
LISTEN     0      128    172.17.252.15:7001                     *:*


配置storage节点的文件

maxconns = 10000(存储系统最大连接数)
httplisten = 0.0.0.0:7500(可通过http访问服务端口)
mgmtlisten = 0.0.0.0:7501(mogilefs的管理端口)
docroot = /data/mogdata(数据存储的实际位置,建议使用的是一个单独挂载使用的磁盘)
~


因为进程都是以mogilefs的身份运行的,所以我们要把文件存储的路径的属主和属组改为mogilefs

root@centos7 data]# ll
total 0
drwxr-xr-x. 3 mogilefs mogilefs 18 Nov 28 21:24 mogdata
[root@centos7 mogilefs]# /etc/init.d/mogstored  start
Starting mogstored (via systemctl):                        [  OK  ]
[root@centos7 mogilefs]# ss -ntl|grep 75*
LISTEN     0      128          *:7500                     *:*                  
LISTEN     0      128          *:7501                     *:*

现在加入"存储节点"到trackers中,相当于为每个主机加入mogilefs的存储系统

[root@centos7 mogilefs]# mogadm --tracker=172.17.252.15:7001 host add node1 --ip=172.17.252.16 --port=7500 --status=alive
[root@centos7 mogilefs]# mogadm --tracker=172.17.252.15:7001 host add node2 --ip=172.17.252.17 --port=7500 --status=alive
查看已经添加的主机
[root@centos7 mogilefs]# mogadm --tracker=172.17.252.15:7001 check
Checking trackers...
  172.17.252.15:7001 ... OK

Checking hosts...
  [ 1] node1 ... REQUEST FAILURE FETCHING: http://172.17.252.16:7500/
  [ 2] node2 ... REQUEST FAILURE FETCHING: http://172.17.252.17:7500/
No devices found on tracker(s).

[root@centos7 mogilefs]# mogadm --tracker=172.17.252.15:7001 check
Checking trackers...
  172.17.252.15:7001 ... OK

Checking hosts...
  [ 1] node1 ... OK(节点已经检测成功)
  [ 2] node2 ... OK

Checking devices...(devices设备尚未加入)
  host device         size(G)    used(G)    free(G)   use%   ob state   I/O%
  ---- ------------ ---------- ---------- ---------- ------ ---------- -----
  ---- ------------ ---------- ---------- ---------- ------
             total:     0.000      0.000      0.000   0.00%

mogilefs中的存储设备管理

建目录使用dev+ID这种格式,注意所有系统中的ID不能重复,也必须和配置文件中的路径一样

分别在两个storage节点的主机上建目录dev1 和dev2

mkdir -p /data/mogdata/dev1
mkdir -p /data/mogdata/dev2

给设备加入存储的节点当中,相当于为每个设备加入mogilefs的存储系统

[root@centos7 mogilefs]# mogadm --tracker=172.17.252.15:7001  device add node1  1
[root@centos7 mogilefs]# mogadm --tracker=172.17.252.15:7001  device add node2  2
[root@centos7 mogilefs]# mogadm --tracker=172.17.252.15:7001 check
Checking trackers...
  172.17.252.15:7001 ... OK

Checking hosts...
  [ 1] node1 ... OK
  [ 2] node2 ... OK

Checking devices...(已经成功加入设备)
  host device         size(G)    used(G)    free(G)   use%   ob state   I/O%
  ---- ------------ ---------- ---------- ---------- ------ ---------- -----
  [ 1] dev1            97.609      6.321     91.287   6.48%  writeable   0.0
  [ 2] dev2            97.609      6.429     91.179   6.59%  writeable   0.0
  ---- ------------ ---------- ---------- ---------- ------
             total:   195.217     12.750    182.467   6.53%

也可以使用另一种方式查看device
[root@centos7 mogilefs]# mogadm --tracker=172.17.252.15:7001 device list
node1 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      6.321     91.287     97.608        100

node2 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      6.429     91.180     97.608        100


添加域:域用来存储不同应用类型数据的容器

创建图片存放的域
[root@centos7 ~]# mogadm --tracker=172.17.252.15:7001 domain add imgs
创建html等文件存放的域
[root@centos7 ~]# mogadm --tracker=172.17.252.15:7001 domain add files
root@centos7 ~]# mogadm --tracker=172.17.252.15:7001 domain list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 files                default                   2        MultipleHosts() NONE  
 imgs                 default                   2        MultipleHosts() NONE


添加类:

[root@centos7 ~]# mogadm --tracker=172.17.252.15:7001 class add imgs img1 --mindevcount=3
[root@centos7 ~]# mogadm --tracker=172.17.252.15:7001 class add imgs img2 --mindevcount=3
[root@centos7 ~]# mogadm --tracker=172.17.252.15:7001 class add files file1 --mindevcount=4
[root@centos7 ~]# mogadm --tracker=172.17.252.15:7001 class add files file2 --mindevcount=4
[root@centos7 ~]# mogadm --tracker=172.17.252.15:7001 class list
domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 files                default                   2        MultipleHosts() NONE   
 files                file1                     4        MultipleHosts() NONE   
 files                file2                     4        MultipleHosts() NONE  
 imgs                 default                   2        MultipleHosts() NONE   
 imgs                 img1                      3        MultipleHosts() NONE   
 imgs                 img2                      3        MultipleHosts() NONE

上传文件

root@centos7 ~]# mogupload --domain=imgs --key=jpg1 --file=timg.jpg
--key指定上传后的键
--file指定要上传的文件

查询文件

[root@centos7 ~]# mogfileinfo --domain=imgs --key=jpg1
- file: jpg1
     class:              defa
  devcount:                    2
    domain:                 imgs
       fid:                   12
       key:                 jpg1
    length:                60918
 - http://172.17.252.17:7500/dev2/0/000/000/0000000012.fid
 - http://172.17.252.16:7500/dev1/0/000/000/0000000012.fid

通过它给出的路径,我们进行访问

mogilefs实现分布式存储_第1张图片

删除指定的文件

[root@centos7 ~]# mogdelete --domain=imgs --key=jpg1
再次查看
[root@centos7 ~]# mogfileinfo --domain=imgs --key=jpg1
Error fetching file info: unknown_key unknown_key at /usr/bin/mogfileinfo line 60,  line 1.

列出所有文件的key

[root@centos7 ~]# moglistkeys --domain=imgs

暂时停止服务器

如果需要维护一个服务器,比如更新内存,升级操作之类的需要关机的操作,可以在操作之前将主机设置为"down".

 [root@centos7 ~] mogadm host mark  node1  down
 恢复
  [root@centos7 ~] mogadm host mark  node1  alive

mogilefs有一个小bug,就是默认的情况下它是不会复制的,为了实现自动复制,我们需要安装Syscall模块、

可以到http://search.cpan.org/网站下载如下包,并在tarcker节点和storage节点进行编译

mogilefs实现分布式存储_第2张图片