前言
隨著信息社會的發展,越來越多的信息被數據化,尤其是伴隨著大數據時代的來臨,數據呈爆炸式增長。傳統存儲在面對海量數據存儲表現出的力不從心已經是不爭的事實,例如:縱向擴展受陣列空間限制,橫向擴展受交換設備限制,節點受文件系統限制等。而分布式存儲的出現在一定程度上有效的緩解了這一問題,目前比較流行的分布式文件系統有:GFS、HDFS、GlusterFS、MooseFS、Lustre、TFS、MogileFS和FastDFS等,本文帶來的是MogileFS基于Nginx反向代理實現分布式存儲與訪問
相關介紹
分布式文件系統
分布式文件系統,顧名思義,就是分布式+文件系統。它包含這兩個方面的內涵,從文件系統的客戶使用的角度來看,它就是一個標準的文件系統,提供了一系列API,由此進行文件或目錄的創建、移動、刪除,以及對文件的讀寫等操作。從內部實現來看,分布式的系統則不再和普通文件系統一樣負責管理本地磁盤,它的文件內容和目錄結構都不是存儲在本地磁盤上,而是通過網絡傳輸到遠端系統上。并且,同一個文件存儲不只是在一臺機器上,而是在一簇機器上分布式存儲,協同提供服務。
MogileFS
MogileFS是一個開源的分布式文件系統,用于組建分布式文件集群,目前使用MogileFS的公司非常多,就國內而言如yupoo,digg,土豆,豆瓣,1號店, 大眾點評,搜狗,安居客等。
MogileFS組成部分
server端:包括mogilefsd和mogstored兩個程序。mogilefsd即tracker,它將一些全局信息保存在數據庫里,例如:站點domain,class,host等。mogstored即存儲節點,默認偵聽在7500端口,接受客戶端的文件備份請求。在安裝完后,要運行mogadm工具將所有的存儲節點注冊到mogilefsd的數據庫里,mogilefsd會對這些節點進行管理和監控。
utils(工具集):主要是MogileFS的一些管理工具,例如mogadm等。
客戶端API:目前只有Perl API(MogileFS.pm)、PHP,用這個模塊可以編寫客戶端程序,實現文件的備份管理功能,提供MogileFS.pm。
實現過程
理想架構
說明:因資源有限,本文主要講解單點nginx和mariadb實現
實驗拓撲
#系統環境:CentOS6.6
工作流程
①客戶端向服務器端發送請求
②nginx通過調度將請求轉達給其中一個mogilefs的tracker
③tracker接收到請求向后端數據庫獲取存儲位置并返回給nginx
④nginx接到存儲位置再到mogilefs的存儲上獲取實際存儲數據并返回給客戶端
mariadb配置
數據庫安裝不再贅述
授權準備
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)
mogilefs配置
安裝所需軟件包
[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
tracker配置
[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
mogstored配置
[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 #數據存放位置
將配置文件同步至另一節點
[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
創建設備掛載點
#最好將數據存放在獨立磁盤設備中,這里就直接存放在本地了 [root@node1 ~]# mkdir /mogdata/dev1 -pv #另一節點創建dev2 [root@node1 ~]# chown -R mogilefs.mogilefs /mogdata/ #兩個節點都執行以上操作,另一節點創建為dev2
初始化數據庫
[root@node1 ~]# mogdbsetup --dbhost=172.16.10.211 --dbrootuser=root --dbrootpass=scholar --dbuser=moguser --dbpass=mogpass --dbname=mogilefs --yes #在一個節點執行即可
查看是否執行成功
啟動服務
[root@node1 ~]# service mogilefsd start Starting mogilefsd [ OK ] [root@node1 ~]# service mogstored start Starting mogstored [ OK ] #兩個節點都啟動
查看監聽端口
添加節點
#在任一節點上執行 [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
添加設備
[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編號一致
進行狀態檢查
創建domain
[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
查看domain信息
上傳測試
[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'
查看是否上傳成功
[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
獲取數據
客戶端通過fid查看數據
mogilefs集群配置完成,接下來需要配置nginx反向代理
nginx配置
編譯安裝nginx及mogilefs拓展模塊
#解決依賴關系 [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
提供腳本
[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
為腳本賦予執行權限
[root@scholar ~]# chmod +x /etc/rc.d/init.d/nginx
添加至服務管理列表,并讓其開機自動啟動
[root@scholar ~]# chkconfig --add nginx [root@scholar ~]# chkconfig nginx on
配置nginx
[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; } } }
測試語法,啟動服務
[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 ]
訪問測試
由于版本bug上傳功能并不能實現,但是刪除功能是可以實現的,這里就不再演示,實際生產環境中應用程序都是通過調用API直接聯系mogilefs上傳的,故此處不必過于糾結
將其中一個mogilefs節點模擬故障
[root@node2 ~]# service mogilefsd stop Stopping mogilefsd [ OK ] [root@node2 ~]# service mogstored stop Stopping mogstored [ OK ]
再次訪問測試
可見還是可以訪問的,至此,基于nginx反向代理實現mogilefs分布式文件系統訪問已實現
The end
好了,MogileFS基于Nginx反向代理實現小文件海量存儲實驗就先說到這里了,有余力的朋友可以實現nginx節點和mariadb節點的高可用,部署過程中遇到問題可隨時留言交流。以上僅為個人學習整理,如有錯漏,大神勿噴~~~
原創文章,作者:書生,如若轉載,請注明出處:http://www.www58058.com/6124
http://www.it165.net/admin/html/201405/3056.html