Loading... <p style="text-indent: 2em"><strong>前言</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">随着信息社会的发展,越来越多的信息被数据化,尤其是伴随着大数据时代的来临,数据呈爆炸式增长。传统存储在面对海量数据存储表现出的力不从心已经是不争的事实,例如:纵向扩展受阵列空间限制,横向扩展受交换设备限制,节点受文件系统限制等。而分布式存储的出现在一定程度上有效的缓解了这一问题,目前比较流行的分布式文件系统有:GFS、HDFS、GlusterFS、MooseFS、Lustre、TFS、MogileFS和FastDFS等,本文带来的是MogileFS基于Nginx反向代理实现分布式存储与访问</p> <p style="text-indent: 2em"><strong>相关介绍</strong></p> <p style="text-indent: 2em"><strong>分布式文件系统</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">分布式文件系统,顾名思义,就是分布式+文件系统。它包含这两个方面的内涵,从文件系统的客户使用的角度来看,它就是一个标准的文件系统,提供了一系列API,由此进行文件或目录的创建、移动、删除,以及对文件的读写等操作。从内部实现来看,分布式的系统则不再和普通文件系统一样负责管理本地磁盘,它的文件内容和目录结构都不是存储在本地磁盘上,而是通过网络传输到远端系统上。并且,同一个文件存储不只是在一台机器上,而是在一簇机器上分布式存储,协同提供服务。</p> <p style="text-indent: 2em"><strong>MogileFS</strong></p> <p style="text-indent: 2em">MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群,目前使用MogileFS的公司非常多,就国内而言如yupoo,digg,土豆,豆瓣,1号店, 大众点评,搜狗,安居客等。</p> <p style="text-indent: 2em">MogileFS组成部分</p> <p style="text-indent: 2em">server端:包括mogilefsd和mogstored两个程序。mogilefsd即tracker,它将一些全局信息保存在数据库里,例如:站点domain,class,host等。mogstored即存储节点,默认侦听在7500端口,接受客户端的文件备份请求。在安装完后,要运行mogadm工具将所有的存储节点注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。</p> <p style="text-indent: 2em">utils(工具集):主要是MogileFS的一些管理工具,例如mogadm等。</p> <p style="text-indent: 2em">客户端API:目前只有Perl API(MogileFS.pm)、PHP,用这个模块可以编写客户端程序,实现文件的备份管理功能,提供MogileFS.pm。</p> <p style="text-indent: 2em"><strong>实现过程</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><strong>理想架构</strong></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163733-93.jpg" title="1436240537199390.jpg" alt="MogileFS分布式文件系统架构设计.jpg" /><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">说明:因资源有限,本文主要讲解单点nginx和mariadb实现<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><strong>实验拓扑</strong></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163733-56.jpg" title="1436240558160347.jpg" alt="MogileFS分布式文件系统构建.jpg" /><br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">#系统环境:CentOS6.6</pre> <p style="text-indent: 2em"><strong>工作流程</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">①客户端向服务器端发送请求</p> <p style="text-indent: 2em">②nginx通过调度将请求转达给其中一个mogilefs的tracker</p> <p style="text-indent: 2em">③tracker接收到请求向后端数据库获取存储位置并返回给nginx</p> <p style="text-indent: 2em">④nginx接到存储位置再到mogilefs的存储上获取实际存储数据并返回给客户端</p> <p style="text-indent: 2em"><strong>mariadb配置</strong></p> <p style="text-indent: 2em">数据库安装不再赘述<br style="text-indent: 2em" /></p> <p style="text-indent: 2em">授权准备</p> <pre class="brush:bash;toolbar:false">MariaDB [(none)]> grant all on *.* to 'root'@'172.16.%.%' identified by 'scholar'; Query OK, 0 rows affected (0.18 sec) MariaDB [(none)]> grant all on mogilefs.* to 'moguser'@'172.16.%.%' identified by 'mogpass'; Query OK, 0 rows affected (0.09 sec) MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.10 sec)</pre> <p style="text-indent: 2em"><strong>mogilefs配置</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">安装所需软件包</p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# cd mogilefs/ [root@node1 mogilefs]# ls MogileFS-Server-2.46-2.el6.noarch.rpm Perlbal-1.78-1.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm [root@node1 mogilefs]# yum install MogileFS-* Perlbal-1.78-1.el6.noarch.rpm perl-* perl-IO-AIO -y</pre> <p style="text-indent: 2em">tracker配置</p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# vim /etc/mogilefs/mogilefsd.conf daemonize = 1 pidfile = /var/run/mogilefsd/mogilefsd.pid db_dsn = DBI:mysql:mogilefs:host=172.16.10.211 #定义数据库名及主机 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</pre> <p style="text-indent: 2em">mogstored配置</p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# vim /etc/mogilefs/mogstored.conf maxconns = 10000 #最大连接数 httplisten = 0.0.0.0:7500 #http监听地址 mgmtlisten = 0.0.0.0:7501 #mgm监听地址 docroot = /mogdata #数据存放位置</pre> <p style="text-indent: 2em">将配置文件同步至另一节点<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# scp /etc/mogilefs/* node2:/etc/mogilefs/ mogilefsd.conf 100% 1463 1.4KB/s 00:00 mogstored.conf 100% 88 0.1KB/s 00:00</pre> <p style="text-indent: 2em">创建设备挂载点</p> <pre class="brush:bash;toolbar:false">#最好将数据存放在独立磁盘设备中,这里就直接存放在本地了 [root@node1 ~]# mkdir /mogdata/dev1 -pv #另一节点创建dev2 [root@node1 ~]# chown -R mogilefs.mogilefs /mogdata/ #两个节点都执行以上操作,另一节点创建为dev2</pre> <p style="text-indent: 2em">初始化数据库</p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# mogdbsetup --dbhost=172.16.10.211 --dbrootuser=root --dbrootpass=scholar --dbuser=moguser --dbpass=mogpass --dbname=mogilefs --yes #在一个节点执行即可</pre> <p style="text-indent: 2em">查看是否执行成功</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163733-64.jpg" title="1436240587550668.jpg" alt="1.jpg" /></p> <p style="text-indent: 2em">启动服务<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# service mogilefsd start Starting mogilefsd [ OK ] [root@node1 ~]# service mogstored start Starting mogstored [ OK ] #两个节点都启动</pre> <p style="text-indent: 2em">查看监听端口</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163733-30.jpg" title="1436240703994568.jpg" alt="2.jpg" /></p> <p style="text-indent: 2em">添加节点</p> <pre class="brush:bash;toolbar:false">#在任一节点上执行 [root@node1 ~]# mogadm --trackers=172.16.10.123:7001 host add node1 --ip=172.16.10.123 --status=alive [root@node1 ~]# mogadm --trackers=172.16.10.123:7001 host add node2 --ip=172.16.10.124 --status=alive</pre> <p style="text-indent: 2em">添加设备</p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# mogadm --trackers=172.16.10.123:7001 device add node1 1 [root@node1 ~]# mogadm --trackers=172.16.10.123:7001 device add node2 2 #添加设备时所使用的设备ID号必须要/mogdata中的dev编号一致</pre> <p style="text-indent: 2em">进行状态检查<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163733-44.jpg" title="1436240719734475.jpg" alt="3.jpg" /></p> <p style="text-indent: 2em">创建domain<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# mogadm --trackers=172.16.10.123:7001 domain add files [root@node1 ~]# mogadm --trackers=172.16.10.123:7001 domain add html [root@node1 ~]# mogadm --trackers=172.16.10.123:7001 domain add images</pre> <p style="text-indent: 2em">查看domain信息<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163733-70.jpg" title="1436240735431558.jpg" alt="4.jpg" /></p> <p style="text-indent: 2em">上传测试<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# mogupload --trackers=172.16.10.123:7001 --domain=html --key='fstab.html' --file='/etc/fstab' [root@node1 ~]# mogupload --trackers=172.16.10.123:7001 --domain=images --key='test.jpg' --file='/root/test.jpg'</pre> <p style="text-indent: 2em">查看是否上传成功<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@node1 ~]# moglistkeys --trackers=172.16.10.123:7001 --domain=html fstab.html [root@node1 ~]# moglistkeys --trackers=172.16.10.123:7001 --domain=images test.jpg</pre> <p style="text-indent: 2em">获取数据<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163733-30-1.jpg" title="1436240751130790.jpg" alt="5.jpg" /></p> <p style="text-indent: 2em">客户端通过fid查看数据<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163733-17.jpg" title="1436240765302671.jpg" alt="6.jpg" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163733-6.jpg" title="1436240780114486.jpg" alt="7.jpg" /></p> <p style="text-indent: 2em">mogilefs集群配置完成,接下来需要配置nginx反向代理</p> <p style="text-indent: 2em"><strong>nginx配置</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">编译安装nginx及mogilefs拓展模块<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">#解决依赖关系 [root@scholar ~]# yum groupinstall "Development Tools" "Server Platform Development" -y [root@scholar ~]# yum install openssl-devel pcre-devel -y [root@scholar ~]# groupadd -r nginx [root@scholar ~]# useradd -r -g nginx nginx [root@scholar ~]# tar xf nginx_mogilefs_module-1.0.4.tar.gz [root@scholar ~]# tar xf nginx-1.6.3.tar.gz [root@scholar ~]# cd nginx-1.6.3 [root@scholar nginx-1.6.3]# ./configure \ > --prefix=/usr/local/nginx \ > --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=/usr/local/nginx/client/ \ > --http-proxy-temp-path=/usr/local/nginx/proxy/ \ > --http-fastcgi-temp-path=/usr/local/nginx/fcgi/ \ > --http-uwsgi-temp-path=/usr/local/nginx/uwsgi \ > --http-scgi-temp-path=/usr/local/nginx/scgi \ > --with-pcre \ > --with-debug \ > --add-module=../nginx_mogilefs_module-1.0.4 [root@scholar nginx-1.6.3]# make && make install</pre> <p style="text-indent: 2em">提供脚本<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@scholar ~]# vim /etc/rc.d/init.d/nginx #新建文件/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</pre> <p style="text-indent: 2em">为脚本赋予执行权限</p> <pre class="brush:bash;toolbar:false">[root@scholar ~]# chmod +x /etc/rc.d/init.d/nginx</pre> <p style="text-indent: 2em">添加至服务管理列表,并让其开机自动启动</p> <pre class="brush:bash;toolbar:false">[root@scholar ~]# chkconfig --add nginx [root@scholar ~]# chkconfig nginx on</pre> <p style="text-indent: 2em">配置nginx<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@scholar ~]# vim /etc/nginx/nginx.conf upstream trackers { server 172.16.10.123:7001; server 172.16.10.124:7001; } server { listen 80; location ~* /images/ { mogilefs_tracker trackers; mogilefs_domain images; mogilefs_pass { proxy_pass $mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; } } location ~* /html/ { mogilefs_tracker trackers; mogilefs_domain html; mogilefs_pass { proxy_pass $mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; } } location ~* /files/ { allow 172.16.0.0/16; deny all; mogilefs_tracker trackers; mogilefs_domain files; mogilefs_methods PUT DELETE; mogilefs_pass { proxy_pass $mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; } } }</pre> <p style="text-indent: 2em">测试语法,启动服务<br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">[root@scholar ~]# nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful [root@scholar ~]# service nginx start Starting nginx: [ OK ]</pre> <p style="text-indent: 2em"><strong>访问测试</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163733-87.jpg" title="1436240806141348.jpg" alt="8.jpg" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163733-75.jpg" title="1436240828109217.jpg" alt="9.jpg" /></p> <p style="text-indent: 2em">由于版本bug上传功能并不能实现,但是删除功能是可以实现的,这里就不再演示,实际生产环境中应用程序都是通过调用API直接联系mogilefs上传的,故此处不必过于纠结</p> <p style="text-indent: 2em">将其中一个mogilefs节点模拟故障</p> <pre class="brush:bash;toolbar:false">[root@node2 ~]# service mogilefsd stop Stopping mogilefsd [ OK ] [root@node2 ~]# service mogstored stop Stopping mogstored [ OK ]</pre> <p style="text-indent: 2em">再次访问测试</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703163733-79.jpg" title="1436240843277942.jpg" alt="10.jpg" /></p> <p style="text-indent: 2em">可见还是可以访问的,至此,基于nginx反向代理实现mogilefs分布式文件系统访问已实现</p> <p style="text-indent: 2em"><span style="font-size: 18px"><strong>The end</strong></span></p> <p style="text-indent: 2em">好了,MogileFS基于Nginx反向代理实现小文件海量存储实验就先说到这里了,有余力的朋友可以实现nginx节点和mariadb节点的高可用,部署过程中遇到问题可随时留言交流。以上仅为个人学习整理,如有错漏,大神勿喷~~~</p> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信