MogileFS基于Nginx反向代理实现分布式存储与访问

前言

随着信息社会的发展,越来越多的信息被数据化,尤其是伴随着大数据时代的来临,数据呈爆炸式增长。传统存储在面对海量数据存储表现出的力不从心已经是不争的事实,例如:纵向扩展受阵列空间限制,横向扩展受交换设备限制,节点受文件系统限制等。而分布式存储的出现在一定程度上有效的缓解了这一问题,目前比较流行的分布式文件系统有:GFS、HDFS、GlusterFS、MooseFS、Lustre、TFS、MogileFS和FastDFS等,本文带来的是MogileFS基于Nginx反向代理实现分布式存储与访问

相关介绍

分布式文件系统

分布式文件系统,顾名思义,就是分布式+文件系统。它包含这两个方面的内涵,从文件系统的客户使用的角度来看,它就是一个标准的文件系统,提供了一系列API,由此进行文件或目录的创建、移动、删除,以及对文件的读写等操作。从内部实现来看,分布式的系统则不再和普通文件系统一样负责管理本地磁盘,它的文件内容和目录结构都不是存储在本地磁盘上,而是通过网络传输到远端系统上。并且,同一个文件存储不只是在一台机器上,而是在一簇机器上分布式存储,协同提供服务。

MogileFS

MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群,目前使用MogileFS的公司非常多,就国内而言如yupoo,digg,土豆,豆瓣,1号店, 大众点评,搜狗,安居客等。

MogileFS组成部分

server端:包括mogilefsd和mogstored两个程序。mogilefsd即tracker,它将一些全局信息保存在数据库里,例如:站点domain,class,host等。mogstored即存储节点,默认侦听在7500端口,接受客户端的文件备份请求。在安装完后,要运行mogadm工具将所有的存储节点注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。

utils(工具集):主要是MogileFS的一些管理工具,例如mogadm等。

客户端API:目前只有Perl API(MogileFS.pm)、PHP,用这个模块可以编写客户端程序,实现文件的备份管理功能,提供MogileFS.pm。

实现过程

理想架构

MogileFS分布式文件系统架构设计.jpg

说明:因资源有限,本文主要讲解单点nginx和mariadb实现

实验拓扑

MogileFS分布式文件系统构建.jpg

#系统环境:CentOS6.6

工作流程

①客户端向服务器端发送请求

②nginx通过调度将请求转达给其中一个mogilefs的tracker

③tracker接收到请求向后端数据库获取存储位置并返回给nginx

④nginx接到存储位置再到mogilefs的存储上获取实际存储数据并返回给客户端

mariadb配置

数据库安装不再赘述

授权准备

MariaDB [(none)]> grant all on *.* to 'root'@'172.16.%.%' identified by 'scholar';
Query OK, 0 rows affected (0.18 sec)

MariaDB [(none)]> grant all on mogilefs.* to 'moguser'@'172.16.%.%' identified by 'mogpass';
Query OK, 0 rows affected (0.09 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.10 sec)

mogilefs配置

安装所需软件包

[root@node1 ~]# cd mogilefs/
[root@node1 mogilefs]# ls
MogileFS-Server-2.46-2.el6.noarch.rpm            Perlbal-1.78-1.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm  perl-MogileFS-Client-1.14-1.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  perl-Net-Netmask-1.9015-8.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm             perl-Perlbal-1.78-1.el6.noarch.rpm
[root@node1 mogilefs]# yum install MogileFS-* Perlbal-1.78-1.el6.noarch.rpm perl-* perl-IO-AIO -y

tracker配置

[root@node1 ~]# vim /etc/mogilefs/mogilefsd.conf

daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogilefs:host=172.16.10.211  #定义数据库名及主机
db_user = moguser                               #数据库用户名
db_pass = mogpass                               #数据库用户密码
listen = 0.0.0.0:7001                           #监听地址
conf_port = 7001
query_jobs = 10
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1

mogstored配置

[root@node1 ~]# vim /etc/mogilefs/mogstored.conf 

maxconns = 10000                                #最大连接数
httplisten = 0.0.0.0:7500                       #http监听地址
mgmtlisten = 0.0.0.0:7501                       #mgm监听地址
docroot = /mogdata                              #数据存放位置

将配置文件同步至另一节点

[root@node1 ~]# scp /etc/mogilefs/* node2:/etc/mogilefs/
mogilefsd.conf                                     100% 1463     1.4KB/s   00:00    
mogstored.conf                                     100%   88     0.1KB/s   00:00

创建设备挂载点

#最好将数据存放在独立磁盘设备中,这里就直接存放在本地了
[root@node1 ~]# mkdir /mogdata/dev1 -pv   #另一节点创建dev2
[root@node1 ~]# chown -R mogilefs.mogilefs /mogdata/

#两个节点都执行以上操作,另一节点创建为dev2

初始化数据库

[root@node1 ~]# mogdbsetup  --dbhost=172.16.10.211 --dbrootuser=root --dbrootpass=scholar 
--dbuser=moguser --dbpass=mogpass --dbname=mogilefs --yes
#在一个节点执行即可

查看是否执行成功

1.jpg

启动服务

[root@node1 ~]# service mogilefsd start
Starting mogilefsd                                         [  OK  ]
[root@node1 ~]# service mogstored start
Starting mogstored                                         [  OK  ]

#两个节点都启动

查看监听端口

2.jpg

添加节点

#在任一节点上执行
[root@node1 ~]# mogadm --trackers=172.16.10.123:7001 host add node1 --ip=172.16.10.123 --status=alive
[root@node1 ~]# mogadm --trackers=172.16.10.123:7001 host add node2 --ip=172.16.10.124 --status=alive

添加设备

[root@node1 ~]# mogadm --trackers=172.16.10.123:7001 device add node1 1
[root@node1 ~]# mogadm --trackers=172.16.10.123:7001 device add node2 2

#添加设备时所使用的设备ID号必须要/mogdata中的dev编号一致

进行状态检查

3.jpg

创建domain

[root@node1 ~]# mogadm --trackers=172.16.10.123:7001 domain add files
[root@node1 ~]# mogadm --trackers=172.16.10.123:7001 domain add html
[root@node1 ~]# mogadm --trackers=172.16.10.123:7001 domain add images

查看domain信息

4.jpg

上传测试

[root@node1 ~]# mogupload --trackers=172.16.10.123:7001 --domain=html --key='fstab.html' --file='/etc/fstab'
[root@node1 ~]# mogupload --trackers=172.16.10.123:7001 --domain=images --key='test.jpg' --file='/root/test.jpg'

查看是否上传成功

[root@node1 ~]# moglistkeys --trackers=172.16.10.123:7001 --domain=html
fstab.html
[root@node1 ~]# moglistkeys --trackers=172.16.10.123:7001 --domain=images
test.jpg

获取数据

5.jpg

客户端通过fid查看数据

6.jpg

7.jpg

mogilefs集群配置完成,接下来需要配置nginx反向代理

nginx配置

编译安装nginx及mogilefs拓展模块

#解决依赖关系
[root@scholar ~]# yum groupinstall "Development Tools" "Server Platform Development" -y
[root@scholar ~]# yum install openssl-devel pcre-devel -y
[root@scholar ~]# groupadd -r nginx
[root@scholar ~]# useradd -r -g nginx nginx
[root@scholar ~]# tar xf nginx_mogilefs_module-1.0.4.tar.gz 
[root@scholar ~]# tar xf nginx-1.6.3.tar.gz 
[root@scholar ~]# cd nginx-1.6.3
[root@scholar nginx-1.6.3]# ./configure \
> --prefix=/usr/local/nginx \
> --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=/usr/local/nginx/client/ \
> --http-proxy-temp-path=/usr/local/nginx/proxy/ \
> --http-fastcgi-temp-path=/usr/local/nginx/fcgi/ \
> --http-uwsgi-temp-path=/usr/local/nginx/uwsgi \
> --http-scgi-temp-path=/usr/local/nginx/scgi \
> --with-pcre \
> --with-debug \
> --add-module=../nginx_mogilefs_module-1.0.4
[root@scholar nginx-1.6.3]# make && make install

提供脚本

[root@scholar ~]# vim /etc/rc.d/init.d/nginx 
#新建文件/etc/rc.d/init.d/nginx,内容如下:
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15 
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid
  
# Source function library.
. /etc/rc.d/init.d/functions
  
# Source networking configuration.
. /etc/sysconfig/network
  
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
  
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
  
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
  
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
  
lockfile=/var/lock/subsys/nginx
  
make_dirs() {
   # make required directories
   user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
       if [ `echo $opt | grep '.*-temp-path'` ]; then
           value=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating" $value
               mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}
  
start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}
  
stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}
  
restart() {
    configtest || return $?
    stop
    sleep 1
    start
}
  
reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}
  
force_reload() {
    restart
}
  
configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}
  
rh_status() {
    status $prog
}
  
rh_status_q() {
    rh_status >/dev/null 2>&1
}
  
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
    echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

为脚本赋予执行权限

[root@scholar ~]# chmod +x /etc/rc.d/init.d/nginx

添加至服务管理列表,并让其开机自动启动

[root@scholar ~]# chkconfig --add nginx
[root@scholar ~]# chkconfig nginx on

配置nginx

[root@scholar ~]# vim /etc/nginx/nginx.conf

upstream trackers {

    server 172.16.10.123:7001;
    server 172.16.10.124:7001;
    
 }

server {
    listen       80;
    location ~* /images/  {

       mogilefs_tracker trackers;
       mogilefs_domain images;
       mogilefs_pass  {
            proxy_pass $mogilefs_path;
            proxy_hide_header Content-Type;
            proxy_buffering off;
       }
     }
    location ~* /html/ {

        mogilefs_tracker trackers;
        mogilefs_domain html;
        mogilefs_pass  {
             proxy_pass $mogilefs_path;
             proxy_hide_header Content-Type;
             proxy_buffering off;
        }
     }
     location ~* /files/ {

            allow 172.16.0.0/16;
            deny all;

            mogilefs_tracker trackers;
            mogilefs_domain files;
            mogilefs_methods PUT DELETE;

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

测试语法,启动服务

[root@scholar ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@scholar ~]# service nginx start
Starting nginx:                                            [  OK  ]

访问测试

8.jpg

9.jpg

由于版本bug上传功能并不能实现,但是删除功能是可以实现的,这里就不再演示,实际生产环境中应用程序都是通过调用API直接联系mogilefs上传的,故此处不必过于纠结

将其中一个mogilefs节点模拟故障

[root@node2 ~]# service mogilefsd stop
Stopping mogilefsd                                         [  OK  ]
[root@node2 ~]# service mogstored stop
Stopping mogstored                                         [  OK  ]

再次访问测试

10.jpg

可见还是可以访问的,至此,基于nginx反向代理实现mogilefs分布式文件系统访问已实现

The end

好了,MogileFS基于Nginx反向代理实现小文件海量存储实验就先说到这里了,有余力的朋友可以实现nginx节点和mariadb节点的高可用,部署过程中遇到问题可随时留言交流。以上仅为个人学习整理,如有错漏,大神勿喷~~~

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

(0)
书生书生
上一篇 2015-07-08 09:32
下一篇 2015-07-08 09:37

相关推荐

  • Linux终端类型

    前言 终端是一个很重要的外设,用过终端设备的人都知道如果设备类型不对就会有乱字符,也可用仿真终端软件如netterm试验一下,Linux的终端信息放在 /usr/share/terminfo下,在这个目录的子目录v下就有许多的如vt100,vt102,vt200等,看一下就知道了。 终端类型的区别与概念 1、 pty(虚拟终端): 但是如果我们远程telne…

    Linux干货 2016-10-14
  • N28-第三周

    1. 列出當前系統上所有已經登入的用戶的用戶名,注意:同一個用戶登入多次,則只顯示一次即可。
    2. 取出最後登入到當前系統的用戶的相關信息。
    3. 取出當前系統上被用戶當做其默認shell的最多的那個shell。
    4. 將/etc/passwd中的第三個字段數值最大的後10個用戶的信息全部改為大寫後保存至/tmp/maxusers.txt文件中。
    5. 取出當前主機的IP地址,提示:對ifconfig命令的結果進行切分。
    6. 列出/etc目錄下所有以.conf結尾的文件的文件名,並將其名字轉換為大寫後保存至/tmp/etc.conf文件中。
    7. 顯示/var目錄下一級子目錄或文件的總各數。
    8. 取出/etc/group文件中第三個字段數值最小的10個組的名字。
    9. 將/etc/fstab和/etc/issue文件的內容合併為同一個內容後保存至/tmp/etc.test文件中。
    10. 請總結描述用戶和組管理類命令的使用方法並完成以下練習:
    (1) 創建組distro,其GID為2016。
    (2) 創建用戶mandriva,其ID號為1005,基本組為distro。
    (3) 創建用戶mageia,其ID號為1100,家目錄為/home/linux。
    (4) 給用戶mageia添加密碼,密碼為mageedu。
    (5) 刪除mandriva,但保留其家目錄。
    (6) 創建用戶slackware,其ID號為2002,基本組為distro,附加組peguin。
    (7) 修改slackware的默認shell為/bin/tcsh。
    (8) 為用戶slackware新增附加組admins。

    2017-12-19
  • 磁盘管理

    1、拿到一块硬盘,通常来讲,第一步是分区,然后是文件系统的创建,管理文件系统,第三步是挂载设备。 2、linux(准确的说是UNIX)哲学,whindows一切皆窗口,一切皆图形。 3、磁盘是一个硬件设备,存放在/dev/目录下,会有相应的文件来对应的表示这些设备文件,在这个目录下存放的全是设备。 4、在/dev目录下和设备相关的有两种,一种是c开头为字符,…

    Linux干货 2017-04-22
  • Linux的硬链接与软链接

    Linux 的硬链接与软链接 文件由文件名与数据组成,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode…

    Linux干货 2016-10-25
  • 编程能力与编程年龄

    程序员这个职业究竟可以干多少年,在中国这片神奇的土地上,很多人都说只能干到30岁,然后就需要转型,就像《程序员技术练级攻略》这篇文章很多人回复到这种玩法会玩死人的一样。我在很多面试中,问到应聘者未来的规划都能听到好些应聘都说程序员是个青春饭。因为,大多数程序员都认为,编程这个事只能干到30岁,最多35岁吧。每每我听到这样的言论,都让我感到相当的无语,大家都希…

    Linux干货 2016-08-15
  • 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力。当对象们连接在一起时,它们就可以相互提供服务和信息。 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信。但是出于各种原因,你也许并不愿意因为代码环境的改变而对代码做大的修改。也许,你只想根据你的具体应用环境而改进通信代码。或者,你只想简单的重新构造通信代码来避免类和类…

    Linux干货 2015-07-24

评论列表(1条)