MogileFS基于Nginx反向代理實現分布式存儲與訪問

前言

隨著信息社會的發展,越來越多的信息被數據化,尤其是伴隨著大數據時代的來臨,數據呈爆炸式增長。傳統存儲在面對海量數據存儲表現出的力不從心已經是不爭的事實,例如:縱向擴展受陣列空間限制,橫向擴展受交換設備限制,節點受文件系統限制等。而分布式存儲的出現在一定程度上有效的緩解了這一問題,目前比較流行的分布式文件系統有: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。

實現過程

理想架構

MogileFS分布式文件系統架構設計.jpg

說明:因資源有限,本文主要講解單點nginx和mariadb實現

實驗拓撲

MogileFS分布式文件系統構建.jpg

#系統環境: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
#在一個節點執行即可

查看是否執行成功

1.jpg

啟動服務

[root@node1 ~]# service mogilefsd start
Starting mogilefsd                                         [  OK  ]
[root@node1 ~]# service mogstored start
Starting mogstored                                         [  OK  ]

#兩個節點都啟動

查看監聽端口

2.jpg

添加節點

#在任一節點上執行
[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編號一致

進行狀態檢查

3.jpg

創建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信息

4.jpg

上傳測試

[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

獲取數據

5.jpg

客戶端通過fid查看數據

6.jpg

7.jpg

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  ]

訪問測試

8.jpg

9.jpg

由于版本bug上傳功能并不能實現,但是刪除功能是可以實現的,這里就不再演示,實際生產環境中應用程序都是通過調用API直接聯系mogilefs上傳的,故此處不必過于糾結

將其中一個mogilefs節點模擬故障

[root@node2 ~]# service mogilefsd stop
Stopping mogilefsd                                         [  OK  ]
[root@node2 ~]# service mogstored stop
Stopping mogstored                                         [  OK  ]

再次訪問測試

10.jpg

可見還是可以訪問的,至此,基于nginx反向代理實現mogilefs分布式文件系統訪問已實現

The end

好了,MogileFS基于Nginx反向代理實現小文件海量存儲實驗就先說到這里了,有余力的朋友可以實現nginx節點和mariadb節點的高可用,部署過程中遇到問題可隨時留言交流。以上僅為個人學習整理,如有錯漏,大神勿噴~~~

原創文章,作者:書生,如若轉載,請注明出處:http://www.www58058.com/6124

(0)
書生書生
上一篇 2015-07-08
下一篇 2015-07-08

相關推薦

  • shell腳本基礎

    shell腳本基礎 變量 bash的變量:  環境變量  本地變量  位置變量  特殊變量 本地變量:bash:作用域為整個bash進程 局部變量:作用域為當前代碼段 local VARNAME=VALUE 引用變量:${VARNAME} 環境變量:作用域為當前的shell進程及其子進程 export VARNAME=…

    Linux干貨 2017-04-16
  • LAMP運行環境搭建及部署php程序軟件

    前言     Linux+Apache+MySQL+PHP是大多數web服務器的運行環境,能熟練配置此運行環境是每個運維的必備基本技能,本文以安裝MySQL管理工具PHPmyadmin以及博客軟件wordpress為例,演示編譯安裝LAMP運行環境的過程。 一、實驗拓撲圖 二、安裝步驟 2.1 編譯安裝Apache h…

    2015-11-26
  • N25_第一周

    計算機組成 計算機通常由硬件和軟件組成1.硬件 CPU CPU通常由控制器和運算器組成。控制器:是整個計算機的中樞神經,其功能是對程序規定的控制信息進行解釋,根據其要求進行控制,調度程序、數據、地址,協調計算機各部分工作及內存與外設的訪問等。運算器:是對數據進行各種算術運算和邏輯運算,即對數據進行加工處理。 存儲 存儲器的功能是存儲程序、…

    Linux干貨 2016-12-03
  • 第一周博客作業

    1、描述計算機的組成及其功能。
    2、按系列羅列Linux的發行版,并描述不同發行版之間的聯系與區別。
    3、描述Linux的哲學思想,并按照自己的理解對其進行解釋性描述。
    4、說明Linux系統上命令的使用格式;詳細介紹ifconfig、echo、tty、startx、export、pwd、history、shutdown、poweroff、reboot、hwclock、date命令的使用,并配合相應的示例來闡述。
    5、如何在Linux系統上獲取命令的幫助信息,請詳細列出,并描述man文檔的章節是如何劃分的。
    6、請羅列Linux發行版的基礎目錄名稱命名法則及功用規定

    Linux干貨 2018-03-13
  • LINUX HASH命令

    LINUX:Hash命令 介紹:linux系統下會有一個hash表,剛開始這個hash表為空,每執行過一條命令hash表會緩存下這條命令。Shel優先會查看hash表。 hash緩存表可大大提高命令的調用速率 下面介紹幾個hash常用選項 剛進入系統使用Hash命令 哈希表為空 使用過命令后使用Hash命令 使用過命令后,Hash可顯示緩存的命令 Hash …

    Linux干貨 2017-04-03
  • 用戶和組管理類命令的使用

    1.列出當前系統所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示以此即可; who | cut -d' ' -f1 | sort | uniq 2.取出最后登錄到當前系統的用戶的相關信息; who | head&nb…

    Linux干貨 2016-11-21

評論列表(1條)

欧美性久久久久