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 -devel2~]# useradd www3~]# tar xf nginx_mogilefs_module-1.0.4.tar.gz4~]# tar xf nginx-1.12.0.tar.gz5~]# cd nginx-1.12.06~]# ./configure --add-module=../nginx_mogilefs_module-1.0.4 --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --user=www7~]# make && make installnginx配置
1server {2listen 80;3server_name 10.211.55.48;4upstream trackers {5server 10.211.55.24:7001;6server 10.211.55.28:7001;7}8location /images/ {9mogilefs_tracker trackers;10mogilefs_domain imgs;1112mogilefs_pass {13proxy_pass $mogilefs_path;14proxy_hide_header Content-Type;15proxy_buffering off;16}17}18location /files/ {19mogilefs_tracker trackers;20mogilefs_domain files;2122mogilefs_pass {23proxy_pass $mogilefs_path;24proxy_hide_header Content-Type;25proxy_buffering off;26}2728}上传文件
上传文件一般都是通过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功能了。