分佈式文件系統Mogilefs

MogileFS簡介:html

MogileFS是一個開源的分佈式文件存儲系統,由LiveJournal旗下的Danga Interactive公司開發。Danga團隊開發了包括 Memcached、MogileFS、Perlbal 等多個知名的開源項目。目前使用MogileFS 的公司很是多,如日本排名先前的幾個互聯公司及國內的yupoo(又拍)、digg、豆瓣、1號店、大衆點評、搜狗和安居客等,分別爲所在的組織或公司管理着海量的圖片。node

 

MogileFS特性
    1   工在於應用層
    2   無單點,三大組件(tracker,mogstore,database)皆可實現高可用;
    3   自動完成文件複製,制的最小單位不是文件,而是class;基於不一樣的class,文件能夠被自動的複製到多個有足夠存儲空間的存儲節點上;
    4   傳輸無需特殊協議,能夠經過NFS或HTTP協議進行通訊;
    5   名稱安間簡單,文件經過一個給定的key來肯定,是一個全局的命名空間;沒有目錄,基於域實現文件隔離;
    6   不共享任何數據,每一個存儲節點只需維護本身所屬的存儲設備(device)便可;mysql

 

 MogileFS由部分組成:
  (1) server:主要包括mogilefsd和mogstored兩個應用程序。
    mogilefsd實現的是tracker,它經過數據庫來保存元數據信息,包括站點domain、class、host等;
    mogstored是存儲節點(store node),它實際上是個WebDAV服務,默認監聽在7500端口,接受客戶端的文件存儲請求。
  (2) utils(工具集):主要是MogileFS的一些管理工具,例如mogadm等。
    在MogileFS安裝完後,要運行mogadm工具將全部的store node註冊到mogilefsd的數據庫裏,mogilefsd會對這些節點進行管理和監控。
  (3) 客戶端API:MogileFS的客戶端API不少,例如Perl、PHP、Java、Python等,用這個模塊能夠編寫客戶端程序,實現文件的備份管理功能等。linux

  

存儲主機(節點)
    這個是 MogileFS 存儲文件存放在這些機器上,也是 mogstored 節點,也叫 Storage Server,一臺存儲主要都要啓動一個 mogstored 服務.擴容就是增長這些機器.nginx

 

設備(device)
    一個存儲節點,以就是上面的主機,能夠有多個 device, 就是用來存放文件的目錄(例如掛載的目錄),每一個設備都有一個設備id,須要在 mogstored 的配置文件中的 docroot 配置的項目 指定的目錄下面建立相應的設備的目錄,目錄名爲 $docroot/dev$id,設備是不能刪除的.只能將其設備的狀態的值置爲dead,當一個設備 dead 以後,就真的 dead了,裏面的數據也沒法恢復了,且這個dead了的設備的 id 也不能再用.git

 

MogileFS架構github

  tracker     追蹤元數據
    mogilefsd 守護進程
    它的主要職責
        replication     節點之間文件得複製
        deletion        刪除文件
        queryworker     響應客戶請求的文件元數據訪問請求
        reaper          在存儲失敗後將文件複製請求從新放置於隊列中
        monitor         監主機和設備的健康狀態
  database    存儲元數據
       存儲mogilefs的元數據,通常使用MySQL ,建議使用冗餘方案以保證其可用性:(MMM,MHA)
       mogilefs專門提供了數據結構管理工具mogdbsetup
  storage     存儲數據
        mogstored 守護進程,一個準備好的mogstored節點可經過mogadm命令添加至如今的集羣中。
        存儲節點須要定義"設備" 用做存儲空間 每一個"設備"在當前集羣都須要經過一個唯一的DevID來標識
  Client
        客戶端用於與mogilefs創建通訊,完成數據存取;sql

 wKiom1ZlA9ay40szAADpAhQZH8E871.png

 工做流程數據庫

wKiom1ZlA9zhOg73AAHfHf_iyGU027.png

高可用架構apache

wKioL1ZlBFTTmf7XAAQPsH-Xuq0921.png

 

 MogileFS管理的幾個概念:
  Domain
    一個MogileFS 能夠有多個Domain,    用來存放不一樣文件(大小,類型)
    同一個Domain內,key必須惟一
    不一樣Domain內,Key能夠相同
  Class
    最小複製單元
    文件屬性管理
    定義文件存儲在不一樣設備上份數據
  每一個設備都有ID號,Domain+Fid用來定位文件

 

實驗準備

安裝Mariadb

https://mariadb.org/  網站下載 mariadb-5.5.46-linux-x86_64.tar.gz

 1.準備

groupadd -r -g 306 mysql
useradd -r -g 306 -u 306 mysql
mkdir -pv /mydata/data
chown -R mysql.mysql /mydata

  2.安裝Mariadb

tar zxf mariadb-5.5.46-linux-x86_64.tar.gz -C /usr/local/
cd /usr/local/
ln -sv mariadb-5.5.46-linux-x86_64 mysql
cd mysql
chown -R root.mysql ./*
scripts/mysql_install_db --user=mysql --datadir=/mydata/data
mkdir /etc/mysql
cp support-files/my-large.cnf  /etc/mysql/my.cnf

  3.配置Mariadb

vim /etc/mysql/my.cnf
datadir = /mydata/data
innodb_file_per_table = on
skip_name_resolve = on

  4.將Mariadb加到服務項

cp support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
service mysqld start

  5.將Mariadb客戶端程序加到環境變量

vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
source /etc/profile.d/mysql.sh

源碼安裝MogileFS

去官方下載http://www.danga.com/的源碼

MogileFS-Server         MogileFS-Server-2.72.zip
MogileFS-Utils          MogileFS-Utils-2.29.zip
perl-MogileFS-Client    perl-MogileFS-Client-1.17.zip
Perlbal                 Perlbal-1.80.zip                  #Tracker不用安裝,storage必須安裝

 1.安裝epel

wget 
http://mirrors.aliyun.com/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm

 2.安裝MogileFs 用到的依賴包

yum install  perl-IO-stringy perl-DBD-MySQL  perl-BSD-Resource      #base源
yum install  perl-Danga-Socket perl-IO-AIO perl-Net-Netmask         #epel源

 3 安裝MogileFS-Client

unzip perl-MogileFS-Client-1.17.zip
cd perl-MogileFS-Client-1.17
perl Makefile.PL
make
make test
make install

  4.安裝MogileFS-Utils

unzip MogileFS-Utils-2.29.zip
cd MogileFS-Utils-2.29  
perl Makefile.PL  
make  
make install

 5.安裝MogileFS-Server

unzip MogileFS-Server-2.72.zip 
cd MogileFS-Server-2.72
perl Makefile.PL
make 
make test 
make install

 6.安裝Perlbal (Tracker不用安裝,storage必須安裝)

unzip Perlbal-1.80.zi
cd Perlbal-1.80.zip
perl Makefile.PL
make
make test
make install

 7.添加mogilefs系統服務啓動帳號

groupadd -r mogilefs
useradd -r -g mogilefs  mogilefs

8.複製mogilefs的配置文件到/etc/mogilefs/ ,並建立用到的目錄

mkdir /etc/mogilefs/
cp /root/MogileFS-Server-2.72/conf/* /etc/mogilefs/
mkdir /var/run/mogilefsd/
chown mogilefs.mogilefs /var/run/mogilefsd/

 9添加mogilefsd的服務啓動腳本

vim /etc/rc.d/init.d/mogilefsd
#!/bin/bash
# Author: MageEdu <linuxedu@foxmail.com>
# mogilefsd - Startup script for the MogileFS tracker
#
# chkconfig: - 85 15
# description: MogileFS tracker 
# processname: mogilefsd
# config: /etc/mogilefs/mogilefsd.conf 
# pidfile: /var/run/mogilefsd/mogilefsd.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Path to the apachectl script, server binary, and short-form for messages.
lockfile=${LOCKFILE-/var/lock/subsys/mogilefsd} 
RETVAL=0
prog=/usr/local/bin/mogilefsd
#prog=$(which mogilefsd)
start() { 
        ulimit -n 65535
        echo -n $"Starting mogilefsd"
        su - mogilefs -c "$prog -c /etc/mogilefs/mogilefsd.conf --daemon" &> /dev/null
        RETVAL=$?
        [ $RETVAL = 0 ] && success && touch ${lockfile} || failure
        echo
        return $RETVAL
}
stop() {
        echo -n $"Stopping mogilefsd" 
        netstat -nlp|grep "mogilefsd"|grep -v grep|awk '{print $7}'|awk -F"/" '{print $1}'|xargs kill -9 
        RETVAL=$?
        [ $RETVAL = 0 ] && success && rm -f ${lockfile} || failure
        echo
}
reload() {
        echo -n $"Reloading mogilefsd: " 
        killall mogilefsd -HUP 
        RETVAL=$?
        [ $RETVAL = 0 ] && success || failure
        echo
}
case "$1" in
        start) 
                start
                ;; 
        stop)
                stop
                ;; 
        status) 
                status mogilefsd 
                RETVAL=$?
                ;;
        restart)
                stop
                sleep 1
                start
                ;;
        reload)
                reload
                ;; 
        *) 
                echo $"Usage: mogilefsd {start|stop|restart|reload|status}" 
                exit 1
esac
exit $RETVAL

 

10.設置mogstored 的服務啓動腳本

vim /etc/rc.d/init.d/mogstored
 
#!/bin/bash
# Author: MageEdu <linuxedu@foxmail.com>
# mogstored - Startup script for the MogileFS storage
#
# chkconfig: - 86 14
# description: MogileFS storage 
# processname: mogstored
# config: /etc/mogilefs/mogstored.conf 
# pidfile: /var/run/mogilefsd/mogstored.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Path to the apachectl script, server binary, and short-form for messages.
lockfile=${LOCKFILE-/var/lock/subsys/mogstored} 
RETVAL=0
configfile='/etc/mogilefs/mogstored.conf'
prog=/usr/local/bin/mogstored
#prog=$(which mogstored)
start() { 
        ulimit -n 65535
        echo -n $"Starting mogstored"
        su - mogilefs -c "$prog -c $configfile --daemon"  &> /dev/null
        RETVAL=$?
        [ $RETVAL = 0 ] && success && touch ${lockfile} || failure
        echo
        return $RETVAL
}
stop() {
        echo -n $"Stopping mogstored" 
        netstat -nlp|grep "mogstored"|grep -v grep|awk '{print $7}'|awk -F"/" '{print $1}'|xargs kill -9 
        RETVAL=$?
        [ $RETVAL = 0 ] && success && rm -f ${lockfile} || failure
        echo
}
reload() {
        echo -n $"Reloading mogstored: " 
        killall mogstored -HUP 
        RETVAL=$?
        [ $RETVAL = 0 ] && success || failure
        echo
}
case "$1" in
        start) 
                start
                ;; 
        stop)
                stop
                ;; 
        status) 
                status mogstored 
                RETVAL=$?
                ;;
        restart)
                stop
                sleep 1
                start
                ;;
        reload)
                reload
                ;; 
        *) 
                echo $"Usage: mogstored {start|stop|restart|reload|status}" 
                exit 1
esac
exit $RETVAL

11.將mogilefsd和mogstored 添加到服務項

chmod +x /etc/init.d/mogilefsd
chmod +x /etc/init.d/mogstored
chkconfig --add mogilefsd
chkconfig --add mogstored

 

實驗一   單tracker + 雙 storage

10.10.10.54    tracker + database

10.10.10.55    storage

10.10.10.56    storage

分別在三臺服安裝mogilefs ,並在10.10.10.54安裝mariadb

準備mysql受權10.10.10.0/24段的IP 所有能夠鏈接MySQL

GRANT ALL ON *.* TO 'root'@'10.10.10.%' IDENTIFIED BY 'root' WITH GRANT OPTION;
FLUSH PRIVILEGES;
SHOW GRANTS;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+

初始化Mogilefs 數據庫,使用mogdbsetup

mogdbsetup --dbhost=10.10.10.54 --dbrootuser=root --dbrootpass=root --dbname=mogilefs --dbuser=mogilefs --dbpass=mogilefs
This will attempt to setup or upgrade your MogileFS database.
It won't destroy existing data.
Run with --help for more information.  Run with --yes to shut up these prompts.
Continue? [N/y]: y
Create/Upgrade database name 'mogilefs'? [Y/n]: y
Grant all privileges to user 'mogilefs', connecting from anywhere, to the mogilefs database 'mogilefs'? [Y/n]: y

 

配置10.10.10.54  tracker

vim /etc/mogilefs/mogilefsd.conf 
# Enable daemon mode to work in background and use syslog
daemonize = 1
# Where to store the pid of the daemon (must be the same in the init script)
pidfile = /var/run/mogilefsd/mogilefsd.pid
# Database connection information
db_dsn = DBI:mysql:mogilefs:host=10.10.10.54
db_user = mogilefs
db_pass = mogilefs
# IP:PORT to listen on for mogilefs client requests
listen = 0.0.0.0:7001

 啓動

service mogilefsd start

檢查監聽的7001端口

ss -tnl 
State       Recv-Q Send-Q                   Local Address:Port        Peer Address:Port 
LISTEN      0      128                                  *:7001                   *:*

 

配置10.10.10.55 和10.10.10.56   storage

mkdir -pv /mogdata/dev2         #10.10.10.55  storage2
mkdir -pv /mogdata/dev3         #10.10.10.56  storage3
chown -R mogilefs.mogilefs /mogdata
vim /etc/mogilefs/mogstored.conf 
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogdata

 

開啓storage(若是啓動失敗安裝Perlbal 和perl-BSD-Resource)

service mogstored start

檢查7500 和7501端口是否存在

ss -tnl
State       Recv-Q Send-Q             Local Address:Port    Peer Address:Port 
LISTEN      0      128                            *:7500               *:*     
LISTEN      0      128                            *:7501               *:*

 

使用mogadm 進行管理

1  add host

 mogadm --trackers=10.10.10.54:7001 host add 10.10.10.55 --ip 10.10.10.55 --status=alive
mogadm --trackers=10.10.10.54:7001 host add 10.10.10.56 --ip 10.10.10.56 --status=alive
mogadm --trackers=10.10.10.54:7001 host list
10.10.10.55 [1]: alive
  IP:       10.10.10.55:7500
10.10.10.56 [2]: alive
  IP:       10.10.10.56:7500

2  add device

mogadm --trackers=10.10.10.54:7001 device add 10.10.10.55 2
mogadm --trackers=10.10.10.54:7001 device add 10.10.10.56 3
mogadm --trackers=10.10.10.54:7001 device list
10.10.10.55 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      1.885     44.705     46.590        100
10.10.10.56 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev3:   alive      1.886     44.704     46.590        100
mogadm --trackers=10.10.10.54:7001 check
Checking trackers...
  10.10.10.54:7001 ... OK
Checking hosts...
  [ 1] 10.10.10.55 ... OK
  [ 2] 10.10.10.56 ... OK
Checking devices...
  host device         size(G)    used(G)    free(G)   use%   ob state   I/O%
  ---- ------------ ---------- ---------- ---------- ------ ---------- -----
  [ 1] dev2            46.590      1.917     44.674   4.11%  writeable   0.0
  [ 2] dev3            46.590      1.917     44.674   4.11%  writeable   0.0
  ---- ------------ ---------- ---------- ---------- ------
             total:    93.181      3.834     89.347   4.11%
3  add domain
 mogadm --trackers=10.10.10.54:7001 domain add pic
mogadm --trackers=10.10.10.54:7001 domain add conf
mogadm --trackers=10.10.10.54:7001 domain list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 conf                 default                   2        MultipleHosts() NONE  
 pic                  default                   2        MultipleHosts() NONE 
4  add class
mogadm --trackers=10.10.10.54:7001 class add pic test1 --mindevcount=2
mogadm --trackers=10.10.10.54:7001 class list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 conf                 default                   2        MultipleHosts() NONE  
 pic                  default                   2        MultipleHosts() NONE   
 pic                  test1                     2        MultipleHosts() NONE

檢查數據庫內容(要上傳一次文件刷新纔有內容)

mogstats --db_dsn="DBI:mysql:mogilefs:host=10.10.10.54" --db_user="mogilefs" --db_pass="mogilefs" --stats="all"
Fetching statistics... (all)
Statistics for devices...
  device     host                   files     status
  ---------- ---------------- ------------ ----------
  dev2       10.10.10.55          1      alive
  dev3       10.10.10.56          1      alive
  ---------- ---------------- ------------ ----------
Statistics for file ids...
  Max file id: 3
Statistics for files...
  domain               class           files    size (m)  fullsize (m)
  -------------------- ----------- ---------- ----------- -------------
  pic                  default             1           0             0
  -------------------- ----------- ---------- ----------- -------------
Statistics for replication...
  domain               class        devcount      files
  -------------------- ----------- ---------- ----------
  pic                  default             2          1
  -------------------- ----------- ---------- ----------
Statistics for replication queue...
  status                      count
  -------------------- ------------
  -------------------- ------------
Statistics for delete queue...
  status                      count
  -------------------- ------------
  -------------------- ------------
Statistics for general queues...
  queue           status                      count
  --------------- -------------------- ------------
  --------------- -------------------- ------------

測試

mogupload 上傳文件

(注意文件大小寫,Could not stat    at /usr/local/bin/mogupload line 77. 文件名寫錯,找不到要上傳的文件)

mogupload --trackers=10.10.10.54:7001  --domain=pic --key='mog1.PNG' --file='./mog1.PNG'
mogfileinfo 獲取文件的信息
mogfileinfo --trackers=10.10.10.54:7001  --domain=pic --key='mog1.PNG'       
- file: mog1.PNG
     class:              default
  devcount:                    2
    domain:                  pic
       fid:                    3
       key:             mog1.PNG
    length:               299456
 - http://10.10.10.55:7500/dev2/0/000/000/0000000003.fid
 - http://10.10.10.56:7500/dev3/0/000/000/0000000003.fid

流覽器打開查到的連接測試

wKiom1ZmT23y2eoAAACevFzUqak007.png

mogfetch 下載文件

格式

/usr/bin/mogfetch --trackers=host --domain=foo --key='/hello.jpg' --file='./output'

 

實驗二  三臺服務器同時爲tracker 和storage

10.10.10.54    tracker + database + storage

10.10.10.55    tracker + storage

10.10.10.56    tracker + storage

mysql 另外實現,本實驗爲mysql單實例

複製tracker的配置文件到另外兩臺storage服務器

scp /etc/mogilefs/mogilefsd.conf  10.10.10.55:/etc/mogilefs/
scp /etc/mogilefs/mogilefsd.conf  10.10.10.56:/etc/mogilefs/

複製storage的配置文件到tracker服務器

scp /etc/mogilefs/mogstored.conf 10.10.10.54:/etc/mogilefs/

 

在三臺服務器上所有開啓 tracker 和 storage(若是storage啓動失敗,安裝Perlbal 和perl-BSD-Resource))

service mogilefsd start
service mogstored start

 

檢查狀態 7500 7501  7001 都處於監聽狀態

ss -tnl
State       Recv-Q Send-Q             Local Address:Port               Peer Address:Port 
LISTEN      0      128                            *:7500                          *:*     
LISTEN      0      128                            *:7501                          *:*     
LISTEN      0      128                            *:7001                          *:*

 

添加tracker 服務器的host 和 device

mogadm --trackers=10.10.10.54:7001 host add 10.10.10.54 --ip 10.10.10.54 --status=alive
mogadm --trackers=10.10.10.54:7001 device add 10.10.10.54 1

查看信息

[root@node4 ~]# mogadm --trackers=10.10.10.54:7001 host  list
10.10.10.55 [1]: alive
  IP:       10.10.10.55:7500
10.10.10.56 [2]: alive
  IP:       10.10.10.56:7500
10.10.10.54 [3]: alive
  IP:       10.10.10.54:7500
 
[root@node4 ~]# mogadm --trackers=10.10.10.54:7001 device list
10.10.10.55 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      1.917     44.673     46.590        100
10.10.10.56 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev3:   alive      1.917     44.673     46.590        100
10.10.10.54 [3]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      2.932     43.658     46.590        100
[root@node4 ~]# mogadm --trackers=10.10.10.54:7001 device list
10.10.10.55 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      1.917     44.673     46.590        100
10.10.10.56 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev3:   alive      1.917     44.673     46.590        100
10.10.10.54 [3]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      2.932     43.658     46.590        100
[root@node4 ~]# mogadm --trackers=10.10.10.55:7001 device list 
10.10.10.55 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      1.917     44.673     46.590        100
10.10.10.56 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev3:   alive      1.917     44.673     46.590        100
10.10.10.54 [3]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      2.932     43.658     46.590        100
[root@node4 ~]# mogadm --trackers=10.10.10.56:7001 device list 
10.10.10.55 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      1.917     44.673     46.590        100
10.10.10.56 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev3:   alive      1.917     44.673     46.590        100
10.10.10.54 [3]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      2.932     43.658     46.590        100

 

檢查三臺服務器顯示數據徹底一到

上傳文件測試

mogupload --trackers=10.10.10.54:7001,10.10.10.55:7001,10.10.10.56:7001  --domain=pic --key='mog2.PNG' --file='mog2.PNG'
mogupload --trackers=10.10.10.54:7001,10.10.10.55:7001,10.10.10.56:7001  --domain=pic --key='mog3.PNG' --file='mog3.PNG'

查看文件信息

mogfileinfo --trackers=10.10.10.54:7001,10.10.10.55:7001,10.10.10.56:7001  --domain=pic --key='mog2.PNG' 
- file: mog2.PNG
     class:              default
  devcount:                    2
    domain:                  pic
       fid:                    6
       key:             mog2.PNG
    length:               526096
 - http://10.10.10.55:7500/dev2/0/000/000/0000000006.fid
 - http://10.10.10.56:7500/dev3/0/000/000/0000000006.fid
mogfileinfo --trackers=10.10.10.54:7001,10.10.10.55:7001,10.10.10.56:7001  --domain=pic --key='mog3.PNG'                 
- file: mog3.PNG
     class:              default
  devcount:                    2
    domain:                  pic
       fid:                    7
       key:             mog3.PNG
    length:               945124
 - http://10.10.10.54:7500/dev1/0/000/000/0000000007.fid
 - http://10.10.10.55:7500/dev2/0/000/000/0000000007.fid

 

 

流覽器打開測試

wKioL1ZmWGXzKnDIAAFM4S52Kq8096.png

 

實驗三  nginx 反向代理,使用真實URL地址鏈接mogilefs(上傳文件失敗)

10.10.10.51    nginx 反向代理mogilefs

10.10.10.54    tracker + database + storage

10.10.10.55    tracker + storage

10.10.10.56    tracker + storage

 

  1. 安裝nginx 和 nginx_mogilefs_module

  下載nginx

wget http://nginx.org/download/nginx-1.8.0.tar.gz

下載nginx_mogilefs_module

https://www.nginx.com/resources/wiki/modules/ 

Mogilefs    Implements a MogileFS client    Download

nginx 提供的版本爲nginx_mogilefs_module-1.0.2.tar.gz

能夠去開方者提供的下載地址下載

http://www.grid.net.ru/nginx/download/nginx_mogilefs_module-1.0.4.tar.gz

https://github.com/pyh/nginx-mogilefs-module/tree/1.0.4

注:因爲nginx的mogilefs模塊的做者再也不維護該模塊的緣由,因此若是要使用該模塊的上傳功能,
須要使用nginx的0.7.1到0.8之間的版本,高版本的nginx因爲API的變化而不支持PUT功能了。有個用戶寫了個這個模塊的補丁,測試一樣不能用curl put上傳文件

引用http://mailman.nginx.org/pipermail/nginx/2010-September/022700.html

http://nginx.org/pipermail/nginx/p_w_uploads/20100928/8dd35bf7/p_w_upload-0001.bin

diff --git a/ngx_http_mogilefs_module.c b/ngx_http_mogilefs_module.c

index e229f47..a4d249d 100644

--- a/ngx_http_mogilefs_module.c

+++ b/ngx_http_mogilefs_module.c

@@ -483,6 +483,9 @@ ngx_http_mogilefs_put_handler(ngx_http_request_t *r)

         case FETCH:

             spare_location = mgcf->create_close_spare_location;

             ctx->state = CREATE_CLOSE;

+#if defined nginx_version && nginx_version >= 8011

+            r->main->count++;

+#endif

             break;

         case CREATE_CLOSE:

             r->headers_out.content_length_n = 0;

使用方法 ,編輯ngx_http_mogilefs_module.c.c

在483行case FETCH: 修改成

        case FETCH:
            spare_location = mgcf->create_close_spare_location;
            ctx->state = CREATE_CLOSE;
            #if defined nginx_version && nginx_version >= 8011
            r->main->count++;
            #endif
            break;

2.編譯nginx

yum install gcc openssl-devel pcre-devel
tar zxf nginx-1.8.0.tar.gz
tar zxf nginx_mogilefs_module-1.0.4.tar.gz
cd nginx-1.8.0
./configure \
  --prefix=/usr/local/nginx \
  --sbin-path=/usr/local/nginx/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=/var/tmp/nginx/client/ \
  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
  --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
  --http-scgi-temp-path=/var/tmp/nginx/scgi \
  --with-pcre \
  --add-module=../nginx_mogilefs_module-1.0.4
make
make install

 3.添加nginx服務帳號

groupadd -r nginx
useradd -r -g nginx nginx
mkdir -pv /var/tmp/nginx/client/

4.建立啓動項文件/etc/rc.d/init.d/nginx,內容以下:

vim /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/local/nginx/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

5.將nginx加入到服務

chmod +x /etc/rc.d/init.d/nginx
chkconfig --add nginx
service nginx start

6.配置nginx鏈接mogilefs

vim /etc/nginx/nginx.conf
    upstream mogtrackers {
        server 10.10.10.54:7001;
        server 10.10.10.55:7001;
        server 10.10.10.56:7001;
    }
        location /pic/ {
            mogilefs_tracker mogtrackers;
            mogilefs_domain pic;
            mogilefs_pass {
                proxy_pass $mogilefs_path;
                proxy_hide_header Content-Type;
                proxy_buffering off;
            }
        }

從新加載nginx 配置

service nginx reload

使用瀏覽器打開直接URL http://10.10.10.51/pic/mog1.png 測試

wKiom1Zmo7uxtxQcAACkG5xhCJs439.png

 

 7.nginx上傳圖片 (測試失敗)
注:因爲nginx的mogilefs模塊的做者再也不維護該模塊的緣由,因此若是要使用該模塊的上傳功能,
須要使用nginx的0.7.1到0.8之間的版本,高版本的nginx因爲API的變化而不支持PUT功能了。

vim /etc/nginx/nginx.conf   
     location /upload/ {
            allow 10.10.10.0/24;
            deny all;
            mogilefs_tracker mogtrackers;
            mogilefs_domain pic;
            mogilefs_methods PUT DELETE;
            mogilefs_pass {
                proxy_pass $mogilefs_path;
                proxy_hide_header Content-Type;
                proxy_buffering off;
            }
        }

nginx  使用 curl直接上傳,特修改

curl -X PUT -T '1.png' http://10.10.10.51/upload/

相關文章
相關標籤/搜索