实战nginx前端反代mogfilefs及负载均衡

===============================================================================

实验描述:

  • 使用Nginx代理请求至tackers,实现通过键就可以访问到文件;

  • 在配置nginx做反代将用户的请求调度至后端的MogileFS,此实验依赖于nginx-mogilefs-module模块,需在编译时加上此模块。

实验环境:

  • 再准备一台CentOS 7的虚拟主机,来作为前端nginx反代服务器,因为要想支持反代MogileFS需要

nginx-mogilefs-module模块,所以,要编译安装nginx;

  • node1节点仍作为tracker,mogstored和MySQL服务器;node2作为tracker和mogstored节点;

IP地址规划:

  • node1:192.168.1.112

  • node2:192.168.1.113

  • nginx:192.168.1.114

实验拓扑图:

实战nginx前端反代MogfileFS及负载均衡_第1张图片

实验步骤如下:

要实现Nginx代理tackers,需要在编译Nginx的时候加入第三方模块nginx_mogilefs_module.

下载地址:http://www.grid.net.ru/nginx/mogilefs.en.html


 1.准备开发环境,并解决依赖关系

yum groupinstall "Development Tools" "Server Platfrom Development" -y
yum install pcre-devel openssl-devel zlib-devel -y

 2.下载编译安装的nginx和第三方模块nginx_mogilefs_module.的程序包,如下:

[root@centos7 nginx-mogilefs]# ls
nginx-1.10.0.tar.gz  nginx_mogilefs_module-1.0.4.tar.gz

 3.编译安装Nginx,并且加入第三方模块nginx_mogilefs_module.

# 解压缩程序包
[root@centos7 nginx-mogilefs]# tar xf nginx-1.10.0.tar.gz 
[root@centos7 nginx-mogilefs]# tar xf nginx_mogilefs_module-1.0.4.tar.gz 
[root@centos7 nginx-mogilefs]# ls
nginx-1.10.0  nginx-1.10.0.tar.gz  nginx_mogilefs_module-1.0.4  nginx_mogilefs_module-1.0.4.tar.gz

 创建nginx用户,进入解压之后的nginx-1.10.0目录,执行编译,如下:

# 首先添加nginx用户
[root@centos7 nginx-mogilefs]# useradd -r nginx
[root@centos7 nginx-mogilefs]# cd nginx-1.10.0/
[root@centos7 nginx-1.10.0]# ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src

[root@centos7 nginx-1.10.0]# ./configure \
  --prefix=/usr/local/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-mogilefs/nginx_mogilefs_module-1.0.4  #指明第三方模块的位置即可

# [root@centos7 nginx-1.10.0]#  make && make install

 注意:

  在执行make时提示了一个错误,如下:

wKiom1hvc1TxRM3CAAA8qvzu_0c305.png

 通过在网上查询得知,找到nginx目录中/objs/Makefile文件,找到 -Werror 字段,去掉-Werror,重新编译,则问题解决!


  编译完成后为nginx提供PATH环境变量

[root@centos7 nginx-1.10.0]# cd /usr/local/nginx/
[root@centos7 nginx]# ls
html  sbin
[root@centos7 nginx]# cd sbin/
[root@centos7 sbin]# ./nginx  -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: [emerg] mkdir() "/var/tmp/nginx/client/" failed (2: No such file or directory)
nginx: configuration file /etc/nginx/nginx.conf test failed

[root@centos7 sbin]# mkdir -p /var/tmp/nginx/client/  # 创建文件
[root@centos7 sbin]# ./nginx  -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

#=======================================================================================
# 提供环境变量
[root@centos7 ~]# vim /etc/profile.d/nginx.sh
 export PATH=/usr/local/nginx/sbin:$PATH

[root@centos7 ~]# . /etc/profile.d/nginx.sh

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

 


   4.配置nginx可以支持mogilefs模块,在server块中添加location仅使p_w_picpaths向后端代理,编辑nginx的配置文件/etc/nginx/nginx.conf 如下:

实战nginx前端反代MogfileFS及负载均衡_第2张图片


  5.在node1或node2tracker节点上传文件

[root@centos7 ~]# mogupload --trackers=192.168.1.112 --domain=p_w_picpaths --key='man.jpg' --file='/root/man.jpg'
[root@centos7 ~]# mogupload --trackers=192.168.1.113 --domain=p_w_picpaths --key='new.jpg' --file='/root/new.jpg' 

[root@centos7 ~]# mogfileinfo --trackers=192.168.1.112 --domain=p_w_picpaths --key='man.jpg'
- file: man.jpg
     class:              default
  devcount:                    2
    domain:               p_w_picpaths
       fid:                   14
       key:              man.jpg
    length:              3401017
 - http://192.168.1.112:7500/dev1/0/000/000/0000000014.fid
 - http://192.168.1.113:7500/dev3/0/000/000/0000000014.fid

 [root@centos7 ~]# mogfileinfo --trackers=192.168.1.113 --domain=p_w_picpaths --key='new.jpg'
- file: new.jpg
     class:              default
  devcount:                    2
    domain:               p_w_picpaths
       fid:                   15
       key:              new.jpg
    length:              1267947
 - http://192.168.1.113:7500/dev3/0/000/000/0000000015.fid
 - http://192.168.1.112:7500/dev1/0/000/000/0000000015.fid

 使用浏览器访问nginx服务器,location后面跟key

注意:

  • 上传文件时, –key不能使用 –key='/man.jpg' ,要使用-key='man.jpg' 因为nginx配置文件中直接定义了 location 为 /p_w_picpaths/ ;如果,要使用-key='/man.jpg',则在配置文件中的location就要定义为/p_w_picpaths;

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


  6.配置upstream,开启负载均衡模式:

# 在http的配置段添加upstream
    upstream mogtrackers {
        server 192.168.1.112:7001;
   	server 192.168.1.113:7001;
    }
# 修改server配置段中定义的location /p_w_picpaths/
   location  /p_w_picpaths/ {
	    mogilefs_tracker mogtrackers;
	    mogilefs_domain p_w_picpaths;
	    mogilefs_methods GET;
            mogilefs_noverify on;

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

  模拟node1节点的tracker故障(killall mogilefsd),使用浏览器再次访问nginx服务器,发现也可以正常访问,如下:

实战nginx前端反代MogfileFS及负载均衡_第3张图片

 

  nginx 完整的配置文件如下:

[root@centos7 ~]# cat /etc/nginx/nginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


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

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;
    
    upstream mogtrackers {
        server 192.168.1.112:7001;
	       server 192.168.1.113:7001;
    }

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
        
	location  /p_w_picpaths/ {
	    mogilefs_tracker mogtrackers;
	    mogilefs_domain p_w_picpaths;
	    mogilefs_methods GET;
            mogilefs_noverify on;

	    mogilefs_pass {
	        proxy_pass $mogilefs_path;
		proxy_hide_header Content-Type;
		proxy_buffering off;
           }
	}
        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

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


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

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

}

 

如上,就是整个Nginx反代MogileFS的整个过程。。。



 补充一下mogadm命令的额外指令:

  • mogadm slave   //由于文件元数据信息是保存在MySQL中的,每次请求文件需要读取MySQL一旦请求量太大,MySQL必定会成为性能瓶颈,这时我们要给MySQL做主从,这个指令就是用来添加从节点的,可以实现tracker与主从架构的MySQL交互时,实现读写分离。

  • mogadm fsck    //文件系统检测,一般不要使用,除非集群意外断电,在上线时执行。

  • mogadm rebalance    // 重新平衡,当数据出现热区时使用,在执行之前需要定义平衡策略。

  • mogadm rebalance start    // 启动平衡策略。

  • mogadm rebalance policy  //定义平衡策略。

  • mogadm rebalance test     //用于测试是否出现数据不平衡的问题。

  • mogadm settings               //定义mogilefs工作属性。

  • mogadm class modify --mindevcount= //定义文件最小的副本份数

[root@centos7 ~]# mogadm --help
Usage:  (enter any command prefix, leaving off options, for further help)

  mogadm check                     Check the state of the MogileFS world.
  mogadm stats                     Show MogileFS system statistics.  (DEPRECATED: use mogstats instead)
  mogadm host ...
         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 next               Show the next available devid.
         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 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 ...          Modify properties of a file class.
  mogadm slave ...
         slave add ...             Add a slave node for store usage
         slave delete ...          Delete a slave node for store usage
         slave list                List current store slave nodes.
         slave modify ...          Modify a slave node for store usage
  mogadm fsck ...
         fsck clearlog             Clear the fsck log
         fsck printlog             Display the fsck log
         fsck reset ...            Reset fsck position back to the beginning
         fsck start                Start (or resume) background fsck
         fsck status               Show fsck status
         fsck stop                 Stop (pause) background fsck
         fsck taillog              Tail the fsck log
  mogadm rebalance ...
         rebalance policy ...      Add or adjust the current policy
         rebalance reset           Reset an existing policy
         rebalance settings        Display rebalance settings
         rebalance start           Start a rebalance job
         rebalance status          Show status of current rebalance job
         rebalance stop            Stop a rebalance job
         rebalance test            Show what devices the current policy would match
  mogadm settings ...
         settings list             List all server settings
         settings set ...          Set server setting 'key' to 'value'.




另附三篇相关博客,在我配置过程中给了我很大帮助:

  • http://tchuairen.blog.51cto.com/3848118/1543856

  • http://www.178linux.com/6124

  • http://www.tianfeiyu.com/?p=1196