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功能了。