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

分布式 struggling 2227次浏览 0个评论

这篇文章继上篇 MogileFS分布式文件系统安装与配置,有看不懂的地方请看看上一篇!

一,环境准备

实验共有5台主机,nginx做为前端反向代理接收用户请求;mysql作为存储mogilefs元数据的数据库;剩下的三台主机分别安装tracker+mogstore。环境为 CentOS6.6 i686,架构图如下所示:

工作流程:

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

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

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

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

二,安装

以下安装Mogilefs都是使用rpm包安装的,想使用在线安装请看上一节。

1,首先安装数据库节点(192.168.0.3),首先安装Mogilefs,再使用yum安装mysql,并配置好数据库:

<code>
mysql> grant all on mogdb.*  to 'moguser'@'192.168.%.%'  identified by 'mogpass';   #授权moguser用户

mysql> grant all on *.* to 'root'@'192.168.%.%' identified by 'feiyu';   #授权root能远程连接所有主机

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

[root@localhost ~]# mogdbsetup --dbhost=192.168.0.47 --dbport=3306 --dbname=mogdb  --dbrootuser=root --dbrootpass=feiyu --dbuser=moguser --dbpass=mogpass   --yes
</code>

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

5

2,安装三个tracker&storged节点,使用的方法完全相同

第一个节点

<code>
[root@node1 mogilefs]# mkdir /dfs/mogdata/dev1 -pv

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

[root@node1 mogilefs]# cat  mogilefsd.conf|  grep -v '#'     #将mogilefs配置文件作以下修改
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogdb:host=192.168.0.3
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

[root@node1 mogilefs]# cat  mogstored.conf |  grep -v '#'   #mogstored配置文件
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /dfs/mogdata/        --------------------->文件存储位置

[root@node1 mogilefs]# service mogstored  start

[root@node1 mogilefs]# mogadm --trackers=192.168.0.47:7001  host add 192.168.0.47 --ip=192.168.0.47 --status=alive   #把自己加进来
</code>

第二个节点

<code>
[root@node2 mogilefs]# mkdir /dfs/mogdata/dev2 -pv

[root@node2 mogilefs]# chown   -R mogilefs.mogilefs /dfs/mogdata/  /var/run/mogilefsd  #修改属主属组

将node1的mogilefsd.conf 和 mogstored.conf 复制到node2。

[root@node2 mogilefs]# mogadm --trackers=192.168.0.212:7001  host add 192.168.0.212  --ip=192.168.0.212 --status=alive   #把自己加进来

[root@node2 mogilefs]# mogadm --trackers=192.168.0.212:7001 host list   #此命令读取的是数据库中的数据
</code>

第三个节点

<code>
[root@node3 mogilefs]# mkdir /dfs/mogdata/dev3 -pv

[root@node3 mogilefs]# chown   -R mogilefs.mogilefs /dfs/mogdata/  /var/run/mogilefsd  #修改属主属组

将node1的mogilefsd.conf 和 mogstored.conf 复制到node3。

[root@node3 mogilefs]# mogadm --trackers=192.168.0.213:7001  host add 192.168.0.213  --ip=192.168.0.213 --status=alive   #把自己加进来

[root@node3 mogilefs]# mogadm --trackers=192.168.0.213:7001 host list   #此命令读取的是数据库中的数据
192.168.0.212 [1]: alive
  IP:       192.168.0.212:7500

192.168.0.213 [2]: alive
  IP:       192.168.0.213:7500

192.168.0.47 [3]: alive
  IP:       192.168.0.47:7500
</code>

然后在任意一个节点添加设备:

<code>
[root@node1 mogdata]# mogadm --trackers=192.168.0.47:7001 device add 192.168.0.47 1
[root@node1 mogdata]# mogadm --trackers=192.168.0.47:7001 device add 192.168.0.212 2  #添加设备,任何一个tracker都行
[root@node1 mogdata]# mogadm --trackers=192.168.0.47:7001 device add 192.168.0.213 3
[root@node1 mogdata]# mogadm --trackers=192.168.0.47:7001 device list
192.168.0.212 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      4.781     11.665     16.446        100

192.168.0.213 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev3:   alive      4.763     11.684     16.446        100

192.168.0.47 [3]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      9.423      7.023     16.446        100
</code>

添加域:

<code>
[root@node1 mogdata]# mogadm --trackers=192.168.0.47:7001 domain  add images   #添加域
[root@node1 mogdata]# mogadm --trackers=192.168.0.47:7001 domain  add files

[root@node1 mogdata]# mogadm --trackers=192.168.0.47:7001 class add images class0 --mindevcount=2   #在域下建立类,并指定最小副本数,使用多个类可以提高传输效率
[root@node1 mogdata]# mogadm --trackers=192.168.0.47:7001 class add images class1 --mindevcount=2
[root@node1 mogdata]# mogadm --trackers=192.168.0.47:7001 class add images class2 --mindevcount=2
[root@node1 mogdata]# mogadm --trackers=192.168.0.47:7001 class add images class3 --mindevcount=2
[root@node1 mogdata]# mogadm --trackers=192.168.0.47:7001 class list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 files                default                   2        MultipleHosts() NONE   

 images               class0                    2        MultipleHosts() NONE   
 images               class1                    2        MultipleHosts() NONE   
 images               class2                    2        MultipleHosts() NONE   
 images               class3                    2        MultipleHosts() NONE   
 images               default                   2        MultipleHosts() NONE 
</code>

3,安装nginx节点,nginx这个程序具有第三方模块mogilefs就可以实现将url转为存储设备中的fid文件,也可以将fid数据转为url.所以我们只需要基于http协议在浏览器上直接访问数据的url就可以直观的查看到数据文件了。nginx需要支持第三方模块的话需要自己编译nginx将第三方模块添加进来。模块可以在这 Nginx-mogilefs-module下载并有详细的使用说明。下面的安装过程使用 nginx-1.8.0.tar.gz和 nginx_mogilefs_module-1.0.4.tar.gz。

3,1、解决依赖关系

<code>
[root@localhost ~]# yum groupinstall "Development Tools" "Server Platform Deveopment"  -y
[root@localhost ~]# yum install openssl-devel pcre-devel  -y
</code>

3,2、安装

首先添加用户nginx,实现以之运行nginx服务进程:

<code>
[root@localhost ~]# groupadd -r nginx
[root@localhost ~]# useradd -r -g nginx nginx
</code>

接着开始编译和安装:

<code>
[root@localhost ~]# ./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=/root/nginx/nginx_mogilefs_module-1.0.4       -------------------->模块路径
[root@localhost ~]# make && make install
</code>

说明:

1、Nginx可以使用Tmalloc(快速、多线程的malloc库及优秀性能分析工具)来加速内存分配,使用此功能需要事先安装gperftools,而后在编译nginx添加–with-google_perftools_module选项即可。

2、如果想使用nginx的perl模块,可以通过为configure脚本添加–with-http_perl_module选项来实现,但目前此模块仍处于实验性使用阶段,可能会在运行中出现意外,因此,其实现方式这里不再介绍。如果想使用基于nginx的cgi功能,也可以基于FCGI来实现,具体实现方法请参照网上的文档。

3,3、为nginx提供SysV init脚本:

<code>
新建文件/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
</code>

而后为此脚本赋予执行权限:

<code>
[root@localhost ~]# chmod +x /etc/rc.d/init.d/nginx
</code>

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

<code>
[root@localhost ~]# chkconfig --add nginx

[root@localhost ~]# chkconfig nginx on

[root@localhost nginx-1.8.0]# service nginx  configtest

[root@localhost nginx-1.8.0]# mkdir /var/tmp/nginx/client/ -p
</code>

而后就可以启动服务并测试了:

<code>
[root@localhost ~]# service nginx start
</code>

配置nginx可以支持mogilefs模块,在server块中添加下面的配置:

<code>	
	location /files/ {                                             
		mogilefs_tracker <font color="#FF0000">192.168.0.47:7001</font> ;     #此处只使用一个节点
		mogilefs_domain  files;                          #反代files域中的文件
		mogilefs_pass {
			proxy_pass <font color="#FF0000">$mogilefs_path</font>;
			proxy_hide_header Content-Type;
			proxy_buffering off;
		}
</code>

开启负载均衡功能:

<code>	
    upstream mogcluster {         #定义upstream
        server 192.168.0.47:7001;
        server 192.168.0.212:7001;
        server 192.168.0.213:7001;

    }
        location /images/ {
                mogilefs_tracker <font color="#FF0000">mogcluster </font>;           #此处使用upstream
                mogilefs_domain  images;                #使用images域
                mogilefs_noverify    on;                     #验证影响效率
                #mogilefs_class  default class0 class1 class2 class3;
                #
                mogilefs_pass {
                        proxy_pass $mogilefs_path;
                        proxy_hide_header Content-Type;
                        proxy_buffering off;
                }
        }
</code>

上传文件

<code>
[root@node1 mogdata]# mogupload --trackers=192.168.0.47:7001 --domain=images --key="2.png" --file='/usr/share/backgrounds/default_1920x1440.png'

[root@node1 mogdata]# mogupload --trackers=192.168.0.47:7001 --domain=images --key="1.png" --file='/usr/share/backgrounds/default.png'

[root@node1 ~]# mogupload --trackers=192.168.0.47:7001 --domain=files --key='fstab.html' --file='/etc/fstab'
</code>

然后再浏览器中测试,http://192.168.0.3/images/1.png

23

访问 :http://192.168.0.3/files/fstab.html

QQ图片20150919231153

注意:上传文件时 –key不能使用 –key=”/images/2.png” ,因为nginx配置文件中直接定义了 location 为 /images/ .

如果想要将完整的URL传递到后端,则作如下配置:

<code>
        location ~*   ^(/files/.*)$ {    
                mogilefs_tracker 192.168.0.47:7001 ;
                mogilefs_domain  files;
                mogilefs_noverify    on;  #验证影响效率
                #mogilefs_class  default class0 class1 class2 class3;
                #
                mogilefs_pass  $1{    
                        proxy_pass $mogilefs_path;
                        proxy_hide_header Content-Type;
                        proxy_buffering off;
                }
</code>

则上传文件时的key也要使用 key=’/files/fstab.html’ ,然后再浏览器中访问 http://192.168.0.3/files/fstab.html也能显示文件。

获取状态信息

<code>
[root@node1 ~]# mogstats  --config=/etc/mogilefs/mogilefsd.conf 


[root@node1 ~]# mogstats  --config=/etc/mogilefs/mogilefsd.conf  --stats="domains"  #只显示domain信息
Fetching statistics... (domains)
Can't connect to data source '' because I can't work out what driver to use (it doesn't seem to contain a 'dbi:driver:' prefix and the DBI_DRIVER env var is not set) at /usr/bin/mogstats line 312
[root@node2 ~]# mogstats --config=/etc/mogilefs/mogilefsd.conf  --stats="domains"
Fetching statistics... (domains)

Statistics for domains...
  domain               class           files
  -------------------- ----------- ----------
  files                default             2
  images               default             4
  -------------------- ----------- ----------

done

</code>


DevOps-田飞雨 》》转载请注明源地址
喜欢 (0)or分享 (0)
发表我的评论
取消评论
*

表情 贴图 加粗 链接 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址