mogilefs,分布式文件系统,适合海量小文件的分布式存储,将数据分块存储,分别存储到不同的存储节点,每块数据存储多份,实现了数据的冗余备份,在数据访问时,降低了单个节点的I/O读写。


 mogilefs分五部分:


 1:数据库


 数据库存储着mogilefs的元数据,mogilefs的tracker节点就是根据数据库存储的元数据信息来告诉请求用户的资源存储位置。如果数据库出现了问题那么整个mogilefs文件系统将都会瘫掉。


 2:tracker 跟踪器 相应的进程是mogilefsd


 tracker的作用:

 * Replication:机器间复制文件

 * Deletion:从命名空间删除是立即的,从文件系统删除是异步的

 * QueryWorker:响应客户端的请求

 * Reaper:在磁盘失败后将文件复制请求重新放到队列中


 3:storage 存储节点 相应的进程是mogstored

 数据存都是存储在storage节点上,可以有多个,存储节点需要定义设备device,每个设备都有一个唯一的ID号


 4:工具


 主要就是mogadm,mogtool这两个工具了,用来在命令行下控制整个mogilefs系统以及查看状态等等。


 5:客户端


 客户端通过接口访问mogilefs系统,对整个系统进行文件读写操作。


 mogielfs的搭建:


 (1)数据库的安装


  参考博文http://aperson.blog.51cto.com/3480661/1393120


 (2)mogilefs的安装


首先要安装perl# yum install perl

  安装mogilefs相关模块

Sys-Syscall-0.25.tar.gz
BSD-Resource-1.2907.tar.gz
DateTime-HiRes-0.01.tar.gz
Danga-Socket-1.61.tar.gz
Net-Netmask-1.9019.tar.gz
IO-AIO-Util-0.09.tar.gz
Perlbal-1.74.tar.gz
String-CRC32-1.5.tar.gz
Gearman-1.09.tar.gz
Gearman-Client-Async-0.94.tar.gz
Gearman-Server-1.09.tar.gz
DBI-1.631.tar.gz
DBD-mysql-4.027.tar.gz
MogileFS-Client-1.17.tar.gz
mogilefs-server-2.07.tar.gz
IO-Compress-Base-2.015.tar.gz
Compress-Raw-Zlib-2.065.tar.gz
IO-Compress-Zlib-2.015.tar.gz
Bundle-Compress-Zlib-2.064.tar.gz
IO-stringy-2.110.tar.gz
Compress-Raw-Zlib-2.065.tar.gz

 安装方法:


# tar xf Sys-Syscall-0.25.tar.gz
# cd Sys-Syscall-0.25
# perl Makefile.PL
# make
# make install

 mogilefs stracker 的安装


# 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

 mogilefs storage 存储节点的安装

 除了DBD-mysql-4.027.tar.gz不需要安装,别的都要重新装一遍。如果在同一台主机,装一遍即可。


 mogilefs的配置:


 Mysql的配置:

 授权两个账号,root创建数据库mogilefs,moguser连接数据库mogilefs。

grant all on *.* to 'root'@'172.16.%.%' identified by 'redhat';
grant all on mogilefs.* to 'moguser'@'172.16.%.%' identified by 'mogpass';
flush privileges;


 tracker的配置:

 编辑配置文件/etc/mogilefs/mogilefsd.conf修改几个参数


db_dsn = DBI:mysql:mogilefs:host=172.16.249.81 ---修改数据库名为mogilefs,host为数据库所在的主机地址
db_user = moguser  连接数据库的用户名,必须是授权的那个
db_pass = mogpass  连接数据库的用户密码
listen = 172.16.249.77:7001 修改监听地址为tracker所在主机地址。


 创建数据库连接:


# mogdbsetup --dbhost=172.16.249.81 --dbport=3306 --dbname=mogilefs  --dbuser=moguser --dbpass=mogpass --yes

mogilefs的安装,配置,及基于Nginx的反向代理实现的_分布式文件系统

 mogilefs的启动与停止


由于mogilefs不能以root用户运行,创建mogile用户

 # Useradd mogile –s /sbin/nologin

 # su mogile –c “mogilefsd -c /etc/mogilefs/mogilefsd.conf --daemon”

 使用pkill mogilefsd 来停止mogilefs 服务

 也可以提供服务脚本启动

#!/bin/bash
# Author: MageEdu <linuxedu@foxmail.com>
# mogilefsd - Startup script for the MogileFS tracker
#
# chkconfig: - 85 15
# description: MogileFS tracker
# processname: mogilefsd
# config: /etc/mogilefs/mogilefsd.conf
# pidfile: /var/run/mogilefsd/mogilefsd.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Path to the apachectl script, server binary, and short-form for messages.
lockfile=${LOCKFILE-/var/lock/subsys/mogilefsd}
RETVAL=0
prog=$(which mogilefsd)
start() {
        ulimit -n 65535
        echo -n $"Starting mogilefsd"
        su - mogilefs -c "$prog -c /etc/mogilefs/mogilefsd.conf --daemon" &> /dev/null
        RETVAL=$?
        [ $RETVAL = 0 ] && success && touch ${lockfile} || failure
        echo
        return $RETVAL
}
stop() {
        echo -n $"Stopping mogilefsd"
        netstat -nlp|grep "mogilefsd"|grep -v grep|awk '{print $7}'|awk -F"/" '{print $1}'|xargs kill -9
        RETVAL=$?
        [ $RETVAL = 0 ] && success && rm -f ${lockfile} || failure
        echo
}
reload() {
        echo -n $"Reloading mogilefsd: "
        killall mogilefsd -HUP
        RETVAL=$?
        [ $RETVAL = 0 ] && success || failure
        echo
}
case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        status)
                status mogilefsd
                RETVAL=$?
                ;;
        restart)
                stop
                sleep 1
                start
                ;;
        reload)
                reload
                ;;
        *)
                echo $"Usage: mogilefsd {start|stop|restart|reload|status}"
                exit 1
esac
exit $RETVAL



 mogilefs storage的配置:

# vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /var/mogdata
# mkdir /var/mogdata
# chown -R mogilefs.mogilefs /var/mogdata

 mogilefs storage 启动

Mogstored –daemon ---启动
pkill mogstored    ---停止


 提供服务脚本:

#!/bin/bash
# Author: MageEdu <linuxedu@foxmail.com>
# mogstored - Startup script for the MogileFS storage
#
# chkconfig: - 86 14
# description: MogileFS storage
# processname: mogstored
# config: /etc/mogilefs/mogstored.conf
# pidfile: /var/run/mogilefsd/mogstored.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Path to the apachectl script, server binary, and short-form for messages.
lockfile=${LOCKFILE-/var/lock/subsys/mogstored}
RETVAL=0
configfile='/etc/mogilefs/mogstored.conf'
prog=$(which mogstored)
start() {
        ulimit -n 65535
        echo -n $"Starting mogstored"
        su - mogilefs -c "$prog -c $configfile --daemon"  &> /dev/null
        RETVAL=$?
        [ $RETVAL = 0 ] && success && touch ${lockfile} || failure
        echo
        return $RETVAL
}
stop() {
        echo -n $"Stopping mogstored"
        netstat -nlp|grep "mogstored"|grep -v grep|awk '{print $7}'|awk -F"/" '{print $1}'|xargs kill -9
        RETVAL=$?
        [ $RETVAL = 0 ] && success && rm -f ${lockfile} || failure
        echo
}
reload() {
        echo -n $"Reloading mogstored: "
        killall mogstored -HUP
        RETVAL=$?
        [ $RETVAL = 0 ] && success || failure
        echo
}
case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        status)
                status mogstored
                RETVAL=$?
                ;;
        restart)
                stop
                sleep 1
                start
                ;;
        reload)
                reload
                ;;
        *)
                echo $"Usage: mogstored {start|stop|restart|reload|status}"
                exit 1
esac
exit $RETVAL

 mogilefs的管理配置

 先介绍几个命令:

 mogadm:


mogadm host ...                   ---添加存储节点到tracker
        host add ...              Add a host to MogileFS.
        host delete ...           Delete a host.
        host list                 List all hosts.
        host mark ...             Change the status of a host.  (equivalent to 'modify --status')
        host modify ...           Modify a host's properties.
 mogadm device ...                ---添加设备
        device add ...            Add a device to a host.
        device list ...           List all devices, for each host.
        device mark ...           Mark a device as {alive,dead,down,drain,readonly}
        device modify ...         Modify a device's properties.
        device summary ...        List the summary of devices, for each host.
 mogadm domain ...                添加域
        domain add ...            Add a domain (namespace)
        domain delete ...         Delete a domain.
        domain list               List all hosts.
 mogadm class ...                 添加class,mogilefs的最小复制单元
        class add ...             Add a file class to a domain.
        class delete ...          Delete a file class from a domain.
        class list                List all classes, for each domain.
        class modify ...          Mo

mogilefs的安装,配置,及基于Nginx的反向代理实现的_ mogilefs _02

 在添加device的时候,最好是先在存储节点创建ID号对应的存储单元。

mogilefs的安装,配置,及基于Nginx的反向代理实现的_分布式文件系统_03

mogilefs的安装,配置,及基于Nginx的反向代理实现的_ mogilefs _04


 修改属主属组:添加设备到trackers


# chown -R mogilefs.mogilefs /var/mogdata/dev1/
# mogadm --trackers=172.16.249.77:7001 device add 172.16.249.77 001 --status=alive
# chown -R mogilefs.mogilefs /var/mogdata/dev2/
# mogadm --trackers=172.16.249.77:7001 device add 172.16.249.46 002 --status=alive


 查看:

mogilefs的安装,配置,及基于Nginx的反向代理实现的_分布式文件系统_05

 domain的创建

mogilefs的安装,配置,及基于Nginx的反向代理实现的_ mogilefs _06

 class的创建:

mogilefs的安装,配置,及基于Nginx的反向代理实现的_分布式文件系统_07

 上传文件:

# mogupload --trackers=172.16.249.77:7001 --domain=p_w_picpaths -key='/tupian/1.png' -file='/usr/share/backgrounds/default.png'
# mogupload --trackers=172.16.249.77:7001 --domain=html --key='/wenjian/fstab' --file='/etc/fstab'
查看key
# moglistkeys --trackers=172.16.249.77:7001 --domain=html
/wenjian/fstab
查看上传的文件信息:
# mogfileinfo --trackers=172.16.249.46:7001 --domain=html --key='/wenjian/fstab'

mogilefs的安装,配置,及基于Nginx的反向代理实现的_ mogilefs _08

 编译安装Nginx,需添加一个模块Nginx_mogilefs_module

  下载此模块,并unzip解压,编译nginx的时候需要指定解压目录


http://www.grid.net.ru/nginx/download/nginx_mogilefs_module-1.0.4.zip

 编译:记得要先安装pcre-devel


./configure \
  --prefix=/usr \
  --sbin-path=/usr/sbin/nginx \
  --conf-path=/etc/nginx/nginx.conf \
  --error-log-path=/var/log/nginx/error.log \
  --http-log-path=/var/log/nginx/access.log \
  --pid-path=/var/run/nginx/nginx.pid  \
  --lock-path=/var/lock/nginx.lock \
  --user=nginx \
  --group=nginx \
  --with-http_ssl_module \
  --with-http_flv_module \
  --with-http_stub_status_module \
  --with-http_gzip_static_module \
  --http-client-body-temp-path=/var/tmp/nginx/client/ \
  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
  --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
  --http-scgi-temp-path=/var/tmp/nginx/scgi \
  --with-pcre \
  --with-debug \
  --add-module=/usr/local/nginx-mogilefs-module-master


 为nginx提供配置脚本 加到服务中:chkconfig --add nginx

 参考博文http://aperson.blog.51cto.com/3480661/1403805


 测试:

mogilefs的安装,配置,及基于Nginx的反向代理实现的_ mogilefs _09

 编辑Nginx的配置文件:

location / {
            root   html;
            index  index.html index.htm;
        }
        location /p_w_picpaths/ {
            mogilefs_tracker 172.16.249.77:7001;
            mogilefs_domain p_w_picpaths;
            mogilefs_noverify on;
            mogilefs_pass {
               proxy_pass $mogilefs_path;
               proxy_hide_header Content-type;
               proxy_buffering off;
                           }
        }
        location ~* ^(/wenjian/.*)$ {
            mogilefs_tracker 172.16.249.46:7001;
            mogilefs_domain html;
            mogilefs_noverify on;
            mogilefs_pass $1 {
               proxy_pass $mogilefs_path;
               proxy_hide_header Content-type;
               proxy_buffering off;
                           }
        }

 两种访问方式是不一样的,第一个访问图片的时候是把/p_w_picpaths/作为起始目录,也是最终目录,其后面直接跟请求资源,不可以在跟别的目录下的资源


mogilefs的安装,配置,及基于Nginx的反向代理实现的_ mogilefs _10

mogilefs的安装,配置,及基于Nginx的反向代理实现的_分布式文件系统_11

 如果/p_w_picpaths后面没有/即:


location /p_w_picpaths {
            mogilefs_tracker 172.16.249.77:7001;
            mogilefs_domain p_w_picpaths;
            mogilefs_noverify on;
            mogilefs_pass {
               proxy_pass $mogilefs_path;
               proxy_hide_header Content-type;
               proxy_buffering off;
                           }
        }


mogilefs的安装,配置,及基于Nginx的反向代理实现的_分布式文件系统_12


mogilefs的安装,配置,及基于Nginx的反向代理实现的_分布式文件系统_13  第二个是匹配文件访问的location配置:是将/后的所有url做为Key传递给mogilefs.而且是以/wenjian/开头的文件才可以被访问到

]# mogupload --trackers=172.16.249.77:7001 --domain=html --key='/wenjian/a.html' --file='/etc/issue'


  OK,mogilefs的部署,以及基于Nginx的代理访问都已实现,不足之处很多,希望大家多多提出宝贵的意见。一起学习。