分布式文件系统之MogileFS

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

MogileFS由3个部分组成:
(1)server:主要包括mogilefsd和mogstored两个应用程序。mogilefsd实现的是tracker,它通过数据库来保存元数据信息,包括站点domain、class、host等;mogstored是存储节点(store node),它其实是个WebDAV服务,默认监听在7500端口,接受客户端的文件存储请求。在MogileFS安装完后,要运行mogadm工具将所有的store node注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。
(2) utils(工具集):主要是MogileFS的一些管理工具,例如mogadm等。
(3)客户端API:MogileFS的客户端API很多,例如Perl、PHP、Java、Python等,用这个模块可以编写客户端程序,实现文件的备份管理功能等。

现在我们在做一个mogilefs集群分布式存储,节点设计如下:

192.168.42.150 node1 [Nginx,Tracker, Storage,DataBase]
192.168.42.151 node2 [Tracker, Storage]
192.168.42.152 node3 [Tracker, Storage]

1.准备这三台机器,初始化工作,时间同步,分别在这三台机器上安装mogilefs,我们这里用rpm安装

cd /usr/local/src  
#下载RPM安装包
wget http://192.168.42.26/install_package/down/mogilefs/MogileFS-Server-2.46-2.el6.noarch.rpm 
wget http://192.168.42.26/install_package/down/mogilefs/MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm
wget http://192.168.42.26/install_package/down/mogilefs/MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm
wget http://192.168.42.26/install_package/down/mogilefs/MogileFS-Utils-2.19-1.el6.noarch.rpm
wget http://192.168.42.26/install_package/down/mogilefs/perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm
wget http://192.168.42.26/install_package/down/mogilefs/perl-MogileFS-Client-1.14-1.el6.noarch.rpm
wget http://192.168.42.26/install_package/down/mogilefs/perl-Perlbal-1.78-1.el6.noarch.rpm

#安装依赖
yum install perl-Net-Netmask perl-IO-stringy perl-Sys-Syslog perl-IO-AIO -y


#安装rpm
yum install *.rpm -y

2.在node1节点上部署mariadb

yum install mariadb-server -y
vim /etc/my.cnf.d/server.cnf
[mysqld]
skip_name_resolve=1
innodb_file_per_table = 1

#启动mysql,做以下操作
systemctl start mariadb
mysql

MariaDB [(none)]> GRANT ALL ON *.* TO 'root'@'192.168.42.%' IDENTIFIED BY 'mageedu';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'moguser'@'192.168.42.%' IDENTIFIED BY 'mogpass' WITH GRANT OPTION;   
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> FLUSH   PRIVILEGES; 
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> CREATE DATABASE mogilefs;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> exit
Bye

#设定数据库,生成数据表
mogdbsetup --dbhost=192.168.42.150  --dbrootpass='mageedu'  --dbuser='moguser' --dbpass='mogpass'  --dbname=mogilefs  

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

3.配置mogilefsd

vim /etc/mogilefs/mogilefsd.conf

db_dsn = DBI:mysql:mogilefs:host=192.168.42.150
db_user = moguser
db_pass = mogpass
listen = 0.0.0.0:7001
conf_port = 7001

4.启动mogilefsd

service mogilefsd start

[root@node1 my.cnf.d]# service mogilefsd start
Starting mogilefsd (via systemctl):                        [  OK  ]
[root@node1 my.cnf.d]# ss -tnl
State      Recv-Q Send-Q  Local Address:Port                 Peer Address:Port              
LISTEN     0      128                 *:22                              *:*                  
LISTEN     0      1024                *:7001                            *:*                  
LISTEN     0      100         127.0.0.1:25                              *:*                  
LISTEN     0      50                  *:3306                            *:*                  
LISTEN     0      128                :::22                             :::*                  
LISTEN     0      100               ::1:25                             :::*

5.配置storage(可以是所有节点)

mkdir -pv /data/mogilefs/dev1 #创建设备目录
chown -R mogilefs.mogilefs /data/mogilefs/dev1 #权限
vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /data/mogilefs/

修改脚本
lockfile下添加
pidfile=/var/run/mogilefsd/mogstored.pid

start()修改
[ $RETVAL = 0 ] && success && touch ${lockfile} && echo $(pidof mogstored) > ${pidfile} || failure

stop()修改
[ $RETVAL = 0 ] && success && rm -f ${lockfile} ${pidfile} || failure

#启动mogstored
[root@node1 init.d]# service mogstored start
Starting mogstored (via systemctl):                        [  OK  ]
[root@node1 init.d]# ss -tnl
State      Recv-Q Send-Q  Local Address:Port                 Peer Address:Port              
LISTEN     0      1024                *:7500                            *:*                  
LISTEN     0      1024                *:7501                            *:*                  
LISTEN     0      128                 *:22                              *:*                  
LISTEN     0      1024                *:7001                            *:*                  
LISTEN     0      100         127.0.0.1:25                              *:*                  
LISTEN     0      50                  *:3306                            *:*                  
LISTEN     0      128                :::22                             :::*                  
LISTEN     0      100               ::1:25                             :::*

6.node2,node3上分别创建设备目录和分发配置文件,脚本文件

node2上操作:
mkdir -pv /data/mogilefs/dev2 
chown -R mogilefs.mogilefs /data/mogilefs/dev2 

node3上操作:
mkdir -pv /data/mogilefs/dev3 
chown -R mogilefs.mogilefs /data/mogilefs/dev3


#分发脚本和配置文件
scp /etc/rc.d/init.d/mogstored     root@192.168.42.151:/etc/rc.d/init.d/ 
scp /etc/mogilefs/mogstored.conf   root@192.168.42.151:/etc/mogilefs/

scp /etc/rc.d/init.d/mogstored     root@192.168.42.152:/etc/rc.d/init.d/ 
scp /etc/mogilefs/mogstored.conf   root@192.168.42.152:/etc/mogilefs/

在node2,和node3启动mogstored
service mogstored start

7.node1节点上需要添加

#查看帮助
mogadm -help


[root@node1 init.d]# mogadm check
Checking trackers...
  127.0.0.1:7001 ... OK
Checking hosts...
No devices found on tracker(s).

我们还可以使用mogadm --trackers=192.168.42.150:7001 check 得到同样的结果


#添加主机
mogadm --trackers=192.168.42.150:7001 host add 192.168.42.150 --ip=192.168.42.150  --status=alive
mogadm --trackers=192.168.42.150:7001 host add 192.168.42.151 --ip=192.168.42.151  --status=alive
mogadm --trackers=192.168.42.150:7001 host add 192.168.42.152 --ip=192.168.42.152  --status=alive

[root@node1 init.d]# mogadm host list
192.168.42.150 [1]: alive
  IP:       192.168.42.150:7500

192.168.42.151 [2]: alive
  IP:       192.168.42.151:7500

192.168.42.152 [3]: alive
  IP:       192.168.42.152:7500

添加设备

(1).没有添加设备之前查看,是没有结果的

[root@node1 init.d]# mogadm device list
192.168.42.150 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)

192.168.42.151 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)

192.168.42.152 [3]: alive
                    used(G)    free(G)   total(G)  weight(%)

(2)添加设备的操作命令

mogadm device add 192.168.42.150 1
mogadm device add 192.168.42.151 2
mogadm device add 192.168.42.152 3

(3)此时查看有结果了

[root@node1 init.d]# mogadm device list 
192.168.42.150 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      1.688     15.298     16.986        100

192.168.42.151 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      1.557     15.430     16.986        100

192.168.42.152 [3]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev3:   alive      1.557     15.430     16.986        100

(4)此时查看mogadm check

[root@node1 init.d]# mogadm check
Checking trackers...
  127.0.0.1:7001 ... OK

Checking hosts...
  [ 1] 192.168.42.150 ... OK
  [ 2] 192.168.42.151 ... OK
  [ 3] 192.168.42.152 ... OK

Checking devices...
  host device         size(G)    used(G)    free(G)   use%   ob state   I/O%
  ---- ------------ ---------- ---------- ---------- ------ ---------- -----
  [ 1] dev1            16.986      1.689     15.297   9.95%  writeable   0.0
  [ 2] dev2            16.986      1.557     15.429   9.17%  writeable   0.0
  [ 3] dev3            16.986      1.557     15.429   9.17%  writeable   0.0
  ---- ------------ ---------- ---------- ---------- ------
             total:    50.959      4.803     46.156   9.43%

添加域

(1)查看没有添加域的状态
[root@node1 init.d]# mogadm domain list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
(2)添加域操作
mogadm domain add files
mogadm domain add images

(3)再次查看列出
[root@node1 init.d]# mogadm domain list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 files                default                   2        MultipleHosts() NONE   

 images               default                   2        MultipleHosts() NONE

添加class

(1)查看一下class列表
[root@node1 init.d]# mogadm class list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 files                default                   2        MultipleHosts() NONE   

 images               default                   2        MultipleHosts() NONE   

(2).添加class操作(不知为什么这一步会导致只有一个副本)
需要这样添加 mogadm class add images jpeg --mindevcount=2 --replpolicy="MultipleHosts(2)"

mogadm class add images jpeg 
mogadm class add images png
mogadm class add images gif

(3).再次查看列表
[root@node1 init.d]# mogadm class  list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 files                default                   2        MultipleHosts() NONE   

 images               default                   2        MultipleHosts() NONE   
 images               gif                       2        MultipleHosts() NONE   
 images               jpeg                      2        MultipleHosts() NONE   
 images               png                       2        MultipleHosts() NONE

上传图片测试

(1)上传图片
mogupload --tracker=192.168.42.150:7001 --domain=images --key='1.gif' --file='/tmp/83e.gif' --class=gif

mogupload --tracker=192.168.42.150:7001 --domain=images --key='1.jpg' --file='/tmp/zhuoku194.jpg' --class=jpeg
mogupload --tracker=192.168.42.150:7001 --domain=images --key='2.jpg' --file='/tmp/1.jpg' --class=jpeg

(2)查看图片信息
mogfileinfo --tracker=192.168.42.150:7001 --domain=images --key='1.gif' 
[root@node1 init.d]# mogfileinfo --tracker=192.168.42.150:7001 --domain=images --key='1.gif' 
- file: /1.gif
     class:                  gif
  devcount:                    1
    domain:               images
       fid:                    2
       key:               /1.gif
    length:               499461
 - http://192.168.42.151:7500/dev2/0/000/000/0000000002.fid

mogfileinfo --tracker=192.168.42.150:7001 --domain=images --key='1.jpg' 
[root@node1 init.d]# mogfileinfo --tracker=192.168.42.150:7001 --domain=images --key='1.jpg' 
- file: /1.jpg
     class:                 jpeg
  devcount:                    1
    domain:               images
       fid:                    3
       key:               /1.jpg
    length:               374408
 - http://192.168.42.150:7500/dev1/0/000/000/0000000003.fid


(3)在浏览器访问
http://192.168.42.151:7500/dev2/0/000/000/0000000002.fid
http://192.168.42.150:7500/dev1/0/000/000/0000000003.fid
都是ok的


删除文件:
mogdelete --tracker=192.168.42.150:7001 --domain=images --key='1.jpg' 
mogdelete --tracker=192.168.42.150:7001 --domain=images --key='2.jpg' 
mogdelete --tracker=192.168.42.150:7001 --domain=images --key='1.gif' 
删除class:
mogadm class delete images jpeg
mogadm class delete images gitj
mogadm class delete images png
删除域:
mogadm domain delete files
mogadm domain delete images


#配置Nginx

nginx 的mogilefs模块的官方文档地址:
http://www.grid.net.ru/nginx/mogilefs.en.html
wget http://www.grid.net.ru/nginx/download/nginx_mogilefs_module-1.0.4.tar.gz

tar xvf nginx_mogilefs_module-1.0.4.tar.gz 
mv nginx_mogilefs_module-1.0.4 /usr/local/

cd /usr/local/src
wget http://192.168.42.26/nginx-1.11.8.tar.gz
tar xvf nginx-1.11.8.tar.gz
cd nginx-1.11.8
yum groupinstall "Development Tools" "Server Platform Developments" 
yum install pcre-devel openssl-devel  zlib-devel -y
groupadd -r nginx
useradd -r -g nginx nginx

我的编译安装方法
./configure --with-pcre  --user=nginx --group=nginx  --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module  --with-http_realip_module --add-module=/usr/local/nginx_mogilefs_module-1.0.4

make && make install

编译会可能报错:
cc1: all warnings being treated as errors
make[1]: *** [objs/addon/nginx_mogilefs_module-1.0.4/ngx_http_mogilefs_module.o] Error 1
make[1]: Leaving directory `/usr/local/src/nginx-1.11.8'
make: *** [build] Error 2

解决办法:
我们这里打开
vim  objs/Makefile
#去掉警告
-Werror 

#编辑nginx配置文件

user   nginx;
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;

    keepalive_timeout  65;
    upstream trackers {
           server 192.168.42.150:7001 weight=1;
           server 192.168.42.151:7001 weight=1;
        server 192.168.42.152:7001 weight=1;
        check interval=1000 rise=2 fall=5 timeout=1000;
    }


    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }

       location  /images/ {
          mogilefs_tracker trackers;
          mogilefs_domain images;
          mogilefs_methods GET;
          mogilefs_noverify on;

          mogilefs_pass {
                  proxy_pass $mogilefs_path;
                  proxy_hide_header Content-Type;
                  proxy_buffering off;
          }
      }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


    }


}

浏览器访问:

http://192.168.42.150/images/2.jpg
http://192.168.42.150/images/1.gif
都OK

此时我们的trackers其实只有一个,但我们在nginx配置文件中写了三个,所以我们需要把另外两个节点也要 安装tracker

scp /etc/mogilefs/mogilefsd.conf 192.168.42.151:/etc/mogilefs/
scp /etc/mogilefs/mogilefsd.conf 192.168.42.152:/etc/mogilefs/

启动mogilefsd:(两台节点)
service mogilefsd start

三个节点都能查看内容列表

[root@node1 conf]# moglistkeys --trackers=192.168.42.150:7001 --domain=images
1.gif
1.jpg
2.jpg
[root@node1 conf]# moglistkeys --trackers=192.168.42.151:7001 --domain=images
1.gif
1.jpg
2.jpg
[root@node1 conf]# moglistkeys --trackers=192.168.42.152:7001 --domain=images
1.gif
1.jpg
2.jpg

原创文章,作者:srayban,如若转载,请注明出处:http://www.178linux.com/78103

(0)
上一篇 2017-06-15 22:26
下一篇 2017-06-16 19:24

相关推荐

  • 初识LINUX

    初识LINUX 一、计算机的组成 二、Linux的发行版本 发行版:数百种之多,主要分为: Debian分支:ubuntu、mint、knopix Slackware分支:S.u.S.E–>SLES、OpenSUSE RedHat分支: Redhat–>Centos   Fedora Core Gent…

    Linux干货 2016-09-17
  • linux命令 kill命令详则

    kill命令 kill用来删除执行中的程序或工作。kill可将指定的信息送至程序。预设的信息(默认)为SIGTERM(15),可经指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或job指令查看。 语法 kill(选项)(参数) 选项 -a:当处理当前进程时,不限制命令名和进程号的对应关系; &…

    2017-08-21
  • 文件元数据信息详解

    文件元数据信息详解 文件的元数据是什么? 文件的数据分为两类:一类为数据,即文件的实际内容;另一类为元数据,用来描述文件的特征。 元数据内容: 文件名 文件大小 文件所在数据块 数据块的大小 文件类型 文件所在的Inode 硬链接次数 权限 属主id 属组id 最近一次访问时间戳 最近一次更改文件内容的时间戳 最近一次更改文件元数据的时间戳 查看文件的元数据…

    Linux干货 2017-07-09
  • lvm逻辑卷 练习题

    创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小为16MB, 而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录;在/users下创建一个test.txt文件。扩展testlv至7G,要求archlinux用户的文件不能丢失;收缩testlv至3G,要求archlinux用户的文件不能丢失;对testlv创建…

    Linux干货 2017-03-16
  • Centos6上安装cobbler及cobbler常见参数详解

    前言 Cobbler是一个自动化和简化系统安装的工具,通过使用网络引导来控制和启动安装。Cobbler的特性包括存储库镜像、Kickstart模板和连接电源管理系统。使用Cobbler之前需要先了解下PXE和Kickstart的基本原理,文章包含了Cobbler工作原理和Cobbler部署实践两部分内容,交叉关联性的内容还是蛮多的,遇到报错也不要怕,都会一步…

    Linux干货 2016-11-11
  • tomcat优化

    安装过程就不多说了,本次主要说明我在实际工作中的一些优化。    1,修改tomcat的运行模式,常见的有 bio,nio, apr三种    我选择的apr模式,这种对tomcat的性能有较大提高. a:可以根据压力测试工具来进行测试观察。(其实我没对修改apr模式后压测,我直接问百度的) b:重新启动tomcat后…

    Linux干货 2016-06-28

评论列表(1条)

  • PowerMichael
    PowerMichael 2017-07-18 22:19

    不错,很详细,干货。