分布式存储系统MogileFS(三)Nginx反向代理MogileFS

一、MogileFS简要说明

1、相关概念介绍

   MogileFS是一个开源的分布式文件存储系统,MogileFS适用于存储海量小文件的工作场景,由LiveJournal旗下的Danga Interactive公司开发,该团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。

  • tracker节点:借助数据库保存各节点文件的元数据信息保存每个域中所有键的存储位置分布,方便检索定位数据位置的同时监控各节点,告诉客户端存储区位置并指挥storage节点复制数据副本,进程名为mogilefsd(7001)。 

  • database节点:为tracker节点提供数据存取服务。 

  • storage节点:将指定域中的键转换为其特有的文件名存储在指定的设备文件中,转换后的文件名为值,storage节点自动维护键值的对应关系,storage节点由于使用http进行数据传输,因此依赖于perlbal,storage节点前端可以使用nginx进行反向代理,但需要安装nginx-mogilefs-module-master模块进行名称转换,进程名mogstored(7501),perbal(7500)。 

  • Domain:一个域中的键值是惟一的,一个MogileFS可以有多个域,域可以用来存储不同应用类型的数据的容器。

  • Host:每一个存储节点称为一个主机,一个主机上可以有多个存储设备(单独的硬盘),每个设备都有ID号,Domain+Fid用来定位文件。

  • Class:复制最小单位,文件属性管理,定义文件存储在不同设备上份数。

2、实验说明

   在前面的试验中我们发现在请求资源时的路径是以mogilefs系统的命名方式存储的,但是用户在请求资源时肯定不会使用此种方法输入URL,故需要一个反向代理来将其封装成与用户使用习惯一样的URL。故在其前端使用nginx做反代,但是使用nginx做反代时需要编译安装nginx并加上第三方模块nginx-mogilefs-module-master。同时试验中将各节点即当tracker又当storage,这样nginx就可以使用upstream来进行轮询调用后端存储节点的内容。

3、实验环境介绍

wKiom1YL7ynzj90UAAF4gefE93Y141.jpg

4、实验拓扑图

wKioL1YL7wuDrQxKAAGBLzjQdV0752.jpg

5、工作流程

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

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

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

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


二、搭建环境

1、同步时间

[root@hpf-linux ~]# ntpdate 202.120.2.101
[root@proxy ~]# ntpdate 202.120.2.101
[root@node1 ~]# ntpdate 202.120.2.101
[root@node2 ~]# ntpdate 202.120.2.101
[root@node3 ~]# ntpdate 202.120.2.101

2、数据库授权配置

[root@hpf-linux ~]# mysql
mysql> grant all privileges on *.* to 'root'@'192.168.%.%' identified by 'redhat';
Query OK, 0 rows affected (0.00 sec)

mysql> grant all on mogilefs.* to 'moguser'@'192.168.%.%' identified by 'mogpass';
Query OK, 0 rows affected (0.05 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.03 sec)

3、mogilefs安装配置

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

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
mgmtlisten = 0.0.0.0:7501
docroot = /mogdata

创建设备挂载点:

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

授权pid目录权限:

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

初始化数据库:

[root@node1 ~]# mogdbsetup --dbhost=192.168.1.6 --dbrootuser=root --dbrootpass=redhat --dbuser=moguser --dbpass=mogpass --dbname=mogilefs  --yes

查看数据库是否初始化成功:

mysql> use mogilefs
Database changed

mysql> 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)

启动服务:

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

查看服务是否启动:

[root@node1 ~]# ss -tnlp |grep mog
LISTEN     0      128                       *:7001                     *:*      users:(("mogilefsd",1602,6))
LISTEN     0      128                       *:7500                     *:*      users:(("mogstored",1565,4))
LISTEN     0      128                       *:7501                     *:*      users:(("mogstored",1565,9))

增加节点:

[root@node1 ~]# mogadm --trackers=192.168.1.9:7001 host add node1 --ip=192.168.1.9 --status=alive
[root@node1 ~]# mogadm --trackers=192.168.1.9:7001 host add node2 --ip=192.168.1.10 --status=alive
[root@node1 ~]# mogadm --trackers=192.168.1.9:7001 host add node3 --ip=192.168.1.11 --status=alive

添加设备:

[root@node1 ~]# mogadm --trackers=192.168.1.9:7001 device add node1 1
[root@node1 ~]# mogadm --trackers=192.168.1.9:7001 device add node2 2
[root@node1 ~]# mogadm --trackers=192.168.1.9:7001 device add node3 3
#添加设备时所使用的设备ID号必须要/mogdata中的dev编号一致

状态检查:

[root@node1 ~]# mogadm --trackers=192.168.1.9:7001 check
Checking trackers...
  192.168.1.9:7001 ... OK

Checking hosts...
  [ 1] node1 ... OK
  [ 2] node2 ... REQUEST FAILURE FETCHING: http://192.168.1.10:7500/
  [ 3] node3 ... REQUEST FAILURE FETCHING: http://192.168.1.11:7500/

Checking devices...
  host device         size(G)    used(G)    free(G)   use%   ob state   I/O%
  ---- ------------ ---------- ---------- ---------- ------ ---------- -----
  [ 1] dev1            11.990      2.860      9.130  23.86%  writeable   0.0
  ---- ------------ ---------- ---------- ---------- ------
             total:    11.990      2.860      9.130  23.86%

从上面看到还要两个节点未发现,下面就将node2、node3节点安装mogilefs。安装配置方法和node1节点一样这里就不介绍了。

将node2及node3安装mogilefs并启动后在检测:

[root@node1 ~]# mogadm --trackers=192.168.1.9:7001 check
Checking trackers...
  192.168.1.9:7001 ... OK

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

Checking devices...
  host device         size(G)    used(G)    free(G)   use%   ob state   I/O%
  ---- ------------ ---------- ---------- ---------- ------ ---------- -----
  [ 1] dev1            11.990      2.863      9.127  23.87%  writeable   0.0
  [ 2] dev2            11.990      2.862      9.128  23.87%  writeable   0.0
  [ 3] dev3            11.990      2.862      9.127  23.87%  writeable   0.0
  ---- ------------ ---------- ---------- ---------- ------
             total:    35.970      8.587     27.382  23.87%

创建domain:

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

查看domain信息:

[root@node1 ~]# mogadm --trackers=192.168.1.9:7001 domain list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 files                default                   2        MultipleHosts() NONE   

 html                 default                   2        MultipleHosts() NONE   

 images               default                   2        MultipleHosts() NONE

上传文件:

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

查看是否上传成功:

[root@node1 ~]# moglistkeys --trackers=192.168.1.9:7001 --domain=html
fsttab.html
issue.html
[root@node1 ~]# moglistkeys --trackers=192.168.1.9:7001 --domain=images
test.jpeg
[root@node1 ~]# mogfileinfo --trackers=192.168.1.9:7001 --domain=html --key='issue.html'
- file: issue.html
     class:              default
  devcount:                    2
    domain:                 html
       fid:                    4
       key:           issue.html
    length:                   47
 - http://192.168.1.11:7500/dev3/0/000/000/0000000004.fid
 - http://192.168.1.9:7500/dev1/0/000/000/0000000004.fid
[root@node1 ~]# mogfileinfo --trackers=192.168.1.9:7001 --domain=images --key='test.jpeg'
- file: test.jpeg
     class:              default
  devcount:                    2
    domain:               images
       fid:                    5
       key:            test.jpeg
    length:                49770
 - http://192.168.1.9:7500/dev1/0/000/000/0000000005.fid
 - http://192.168.1.11:7500/dev3/0/000/000/0000000005.fid
[root@node1 ~]#  mogfileinfo --trackers=192.168.1.9:7001 --domain=html --key='fsttab.html'
- file: fsttab.html
     class:              default
  devcount:                    2
    domain:                 html
       fid:                    8
       key:          fsttab.html
    length:                  961
 - http://192.168.1.10:7500/dev2/0/000/000/0000000008.fid
 - http://192.168.1.9:7500/dev1/0/000/000/0000000008.fid

状态信息查看:

[root@node1 ~]#  mogstats --config=/etc/mogilefs/mogilefsd.conf
Fetching statistics... (all)

Statistics for devices...
  device     host                   files     status
  ---------- ---------------- ------------ ----------
  dev1       node1               3      alive
  dev2       node2               1      alive
  dev3       node3               2      alive
  ---------- ---------------- ------------ ----------

Statistics for file ids...
  Max file id: 7

Statistics for files...
  domain               class           files    size (m)  fullsize (m)
  -------------------- ----------- ---------- ----------- -------------
  html                 default             2           0             0
  images               default             1           0             0
  -------------------- ----------- ---------- ----------- -------------

Statistics for replication...
  domain               class        devcount      files
  -------------------- ----------- ---------- ----------
  html                 default             2          2
  images               default             2          1
  -------------------- ----------- ---------- ----------

Statistics for replication queue...
  status                      count
  -------------------- ------------
  -------------------- ------------

Statistics for delete queue...
  status                      count
  -------------------- ------------
  -------------------- ------------

Statistics for general queues...
  queue           status                      count
  --------------- -------------------- ------------
  --------------- -------------------- ------------

done

浏览器测试:

wKioL1YL73vT9I8FAACJvbT7LDQ737.jpg

wKiom1YL72-gkSGTAAH3Gg-T7ls964.jpg

wKioL1YL75XByliyAAI0gekXIew484.jpg

4、安装配置nginx

[root@proxy ~]# groupadd -r nginx
[root@proxy ~]# useradd -r -g nginx nginx
[root@proxy ~]# tar xf nginx-1.8.0.tar.gz 
[root@proxy ~]# unzip nginx-mogilefs-module-master.zip 
[root@proxy ~]# cd nginx-1.8.0
[root@proxy nginx-1.8.0]# ./configure   --prefix=/usr/local/   --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=../nginx-mogilefs-module-master
[root@proxy nginx-1.8.0]# make && make install

查看nginx是否安装成功:

[root@proxy nginx-1.8.0]# nginx -v
nginx version: nginx/1.8.0

提供启动脚本:

[root@proxy nginx-1.8.0]# vim /etc/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@proxy nginx-1.8.0]# chmod +x /etc/init.d/nginx[root@proxy nginx-1.8.0]# chkconfig --add nginx[root@proxy nginx-1.8.0]# chkconfig nginx on

配置nginx:

[root@proxy ~]# cat /etc/nginx/nginx.conf
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.1.9:7001;
    server 192.168.1.10:7001;
    server 192.168.1.11: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 192.168.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@proxy ~]# mkdir /var/tmp/nginx/client -pv
[root@proxy ~]# chown -R nginx.nginx /var/tmp/nginx/

测试配置文件是否正确:

[root@proxy ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

启动服务:

[root@proxy ~]# service nginx start
正在启动 nginx:           [确定]

浏览器测试:

wKioL1YL78Kh37AnAAMZ7NPzUp0409.jpg

模拟节点故障:

[root@node1 ~]# service mogilefsd stop
Stopping mogilefsd            [确定]
[root@node1 ~]# service mogstored stop
Stopping mogstored            [确定]

wKiom1YL78zCe2LIAAL7xL8uMm0409.jpg




你可能感兴趣的:(mogilefs)