Jusene's Blog

Nginx反向代理MogileFS实现海量小文件存储

字数统计: 1k阅读时长: 4 min
2017/07/20 Share

MogileFS

MogileFS是一个开源的分布式文件存储系统,适用于海量存储小文件的工作场景,MogileFS不能对文件进行切分,所以理论上只要不超过挂载的device的文件系统的大小就可以,且MogileFS的class至少会保持两个副本,且会自动平衡存储节点的class节点,所以理论上只要存在足够的数据存储节点,数据存储在整个MogileFS中是很可靠的,唯一需要的担心的就是database节点的单点故障,因为这属于外部应用,整个的高可用性需要自行解决。

为什么需要nginx来反代MogileFS

根据前面我们做的MogileFS的分布式存储,我们可以得到访问的url:

1
~]# mogfileinfo --trackers=10.211.55.24 --domain=files --key='/fstab.txt'
2
- file: /fstab.txt
3
     class:              default
4
  devcount:                    2
5
    domain:                files
6
       fid:                    2
7
       key:           /fstab.txt
8
    length:                  860
9
 - http://10.211.55.26:7500/dev1/0/000/000/0000000002.fid
10
 - http://10.211.55.27:7500/dev2/0/000/000/0000000002.fid
11
~]# curl http://10.211.55.26:7500/dev1/0/000/000/0000000002.fid
12
#
13
# /etc/fstab
14
# Created by anaconda on Tue May 16 10:41:16 2017
15
#
16
# Accessible filesystems, by reference, are maintained under '/dev/disk'
17
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
18
#
19
/dev/mapper/vg_node1-lv_root /                       ext4    defaults        1 1
20
UUID=923aa778-65ee-4938-a72b-5213c92037af /boot                   ext4    defaults        1 2
21
/dev/mapper/vg_node1-lv_home /home                   ext4    defaults        1 2
22
/dev/mapper/vg_node1-lv_swap swap                    swap    defaults        0 0
23
tmpfs                   /dev/shm                tmpfs   defaults        0 0
24
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
25
sysfs                   /sys                    sysfs   defaults        0 0
26
proc                    /proc                   proc    defaults        0 0

这样的url在实际生产的环境中是不可能使用的,所以我们需要修改,但是MogileFS只提供了一个API,所以我们需要访问这个系统我们必须是可以调用这个API的客户端,所以单纯的url重写是不可能完成的,所以我们需要第三方模块支持,下面我们会用到 nginx_mogilefs_module。

还有通过nginx反代可以解决tracker的负载均衡的问题,在加上database的高可用,所以在整个MogileFS的存储系统中就没有存在单点故障的问题存在,是一个相对稳定的系统。

架构设计

nginx_mogilefs_module模块下载链接:http://www.grid.net.ru/nginx/mogilefs.en.html

承接前面的架构:
tracker1: 10.211.55.24
tracker2: 10.211.55.28
storage node1: 10.211.55.26
storage node2: 10.211.55.27
storage node3: 10.211.55.29
database: 10.211.55.25
nginx: 10.211.55.48

mysql高可用架构以前的博文已经讲了很多遍了,增加一个storage node和tracker,按照前面的博文应该都不是难事。

nginx

  • 编译nginx_mogilefs_module

    1
    ~]# yum install -y pcre-devel openssl -devel
    2
    ~]# useradd www
    3
    ~]# tar xf nginx_mogilefs_module-1.0.4.tar.gz
    4
    ~]# tar xf nginx-1.12.0.tar.gz
    5
    ~]# cd nginx-1.12.0
    6
    ~]# ./configure --add-module=../nginx_mogilefs_module-1.0.4 --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --user=www
    7
    ~]# make && make install
  • nginx配置

    1
    server {
    2
    	listen 80;
    3
    	server_name 10.211.55.48;
    4
    	upstream trackers {
    5
    		server 10.211.55.24:7001;
    6
    		server 10.211.55.28:7001;
    7
    	}
    8
    	location /images/ {
    9
    		mogilefs_tracker trackers;
    10
    		mogilefs_domain imgs;
    11
    12
    		mogilefs_pass {
    13
    			proxy_pass $mogilefs_path;
    14
    			proxy_hide_header Content-Type;
    15
    			proxy_buffering off;
    16
    		}
    17
    	}
    18
    	location /files/ {
    19
    		mogilefs_tracker trackers;
    20
    		mogilefs_domain files;
    21
    22
    		mogilefs_pass {
    23
    			proxy_pass $mogilefs_path;
    24
    			proxy_hide_header Content-Type;
    25
    			proxy_buffering off;
    26
    	}
    27
    28
    }
  • 上传文件
    上传文件一般都是通过api完成,这里我用工具完成

    1
    ~]# mogupload --trackers=10.211.55.24 --domain=imgs --key='logo.jpg' --file='logo.jpg'
    2
    ~]# mogupload --trackers=10.211.55.24 --domain=files --key='fstab.txt' --file='/etc/fstab'
    3
    ~]# mogupload --trackers=10.211.55.24 --domain=files --key='index.html' --file='index.html'
  • 测试

注:由于nginx的mogilefs模块的作者不再维护该模块的原因,所以如果要使用该模块的上传功能,需要使用nginx的0.7.1到0.8之间的版本,高版本的nginx由于API的变化而不支持PUT功能了。

CATALOG
  1. 1. MogileFS
  2. 2. 为什么需要nginx来反代MogileFS
  3. 3. 架构设计
  4. 4. nginx