分佈式文件系統之——mogilefs

本節我們將來認識下分佈式文件系統,不過我主要講的是關於其中的一個比較流行的mogilefs進行介紹,好了其他的不多說了,下面我們就開始吧。

什麼是分佈式文件系統?

什麼是分佈式文件系統(Distributed File System)?顧名思義,就是分佈式+文件系統。它包含了2方面,從文件系統的客戶端的角度來看,他就是一個標準的文件系統,提供了API,由此可以進行文件的創建、刪除、讀寫等操作;從內部來看的話,分佈式文件系統則與普通的文件系統不同,它不在是本地的磁盤中,它的內容和目錄都不是存儲在本地磁盤中,而是通過網絡傳輸到遠程主機上,並且同一個文件存儲在不只一臺遠程主機中,而是在一簇主機中進行分佈式存儲,協同提供服務。

 常見的分佈式文件系統

      GFS :Google File System

      HDFS:適合存儲大文件;

      TFS:在名稱節點上將元數據存儲於關係型數據中,文件數量不再受限於名稱節點的內存空間;可以存儲海量小文件;

      Lustre: 企業級應用,重量級;

      GlusterFS: 適用於存儲少量大文件 ,流媒體,雲

      MooseFS: 通用簡便,適用於存儲小文件,大文件也不錯

      Mogilefs: 使用Perl語言,FastDFS

      FastDFS:在內存中存儲

      Ceph:內核級別,支持PB級別存儲

 

 

MogileFS

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

 

MogileFS的特性:

  1、 應用層: 用戶空間文件系統,無須特殊的核心組件

  2、無單點:(tracker, mogstore, database(MySQL))

  3、自動文件複製:複製的最小單位不是文件,而class;

  4、傳輸中立,無特殊協議:可以通過NFS或HTTP進行通信;

  5、比RAID好多了

  6、簡單的命名空間: 每個文件對應一個key:用於domain定義名稱空間

  7、不共享任何數據:

MogileFS組件:

 

Tracker nodes: MogileFS的核心,是一個調度器;服務進程爲mogilefsd; 職責:刪除、複製、監控、查詢等;

storge nodes:mogstored進程: 數據存儲的位置,通常是一個HTTP(WebDAV)服務器,用來數據的創建、刪除、獲取;

Database nodes(MySQL):用於爲tracker存儲元數據信息,mogileFS

 

實驗:構建基於Nginx+mogilefs的分佈式文件系統

實驗拓撲圖:

image

總的實驗步驟如下:由於有些步驟連在一起做,所以做的時候可能並不是完全按照以下步驟進行:

安裝tracker:

  1、安裝相關的包:

  MogileFS-Server-2.46-2.el6.noarch.rpm

  MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm

  perl-Net-Netmask-1.9015-8.el6.noarch.rpm

  MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm

  perl-Perlbal-1.78-1.el6.noarch.rpm

  2、授權數據庫用戶,並初始mysql數據庫

  # mogdbsetup

  3、修改配置文件

  db_dsn = DBI:mysql:DBNAME:host=HOSTNAME

  4、啓動mogilefsd進程

安裝mogstord:

  1、安裝相關的包

  MogileFS-Server-2.46-2.el6.noarch.rpm

  MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm

  perl-Net-Netmask-1.9015-8.el6.noarch.rpm

  MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm

  perl-Perlbal-1.78-1.el6.noarch.rpm

  perl-IO-AIO

  2、準備存儲設備

   掛載至某路徑下,確認此路徑下存在文件devN

   此路徑的屬主和屬組爲mogilefs.mogilefs

  3、修改配置文件/etc/mogilefs/mogstored.conf

   docRoot=

   前面的掛載路徑;

 配置mogielfs:

  1、向tracker添加各mogstored主機

   mogadm --trackers=TRACKER_NODE host add

  2、向tracker添加各設備

   mogadm --trackers=TRACKER_NODE device add

  3、爲tracker定義名稱空間domain

   mogadm --trackers=TRACKER_NODE domain add

  4、爲domain添加一個或多個class

   mogadm --trackers=TRACKER_NODE class add

    可同時副本的最少個數;

 

好了下面就開始安裝了。

2個storage節點都裝上以下幾個包

[root@localhost mogilefs]# ls    
MogileFS-Server-2.46-2.el6.noarch.rpm            MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  perl-MogileFS-Client-1.14-1.el6.noarch.rpm  perl-Perlbal-1.78-1.el6.noarch.rpm    
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm  MogileFS-Utils-2.19-1.el6.noarch.rpm             perl-Net-Netmask-1.9015-8.el6.noarch.rpm    
[root@localhost mogilefs]# yum install -y * perl-IO-AIO

各自創建存儲目錄(2個節點分別爲dev{1,2})

第一個節點:

[root@www mog]# mkdir -pv /mogdata/data/dev1    
mkdir: created directory `/mogdata'    
mkdir: created directory `/mogdata/data'    
mkdir: created directory `/mogdata/data/dev1'

第二個節點:

[root@localhost mog]# mkdir -pv /mogdata/data/dev2    
mkdir: created directory `/mogdata'    
mkdir: created directory `/mogdata/data'    
mkdir: created directory `/mogdata/data/dev2'

修改文件夾權限

[root@www ~]# chown -R mogilefs.mogilefs /mogdata/data/

數據庫授權

mysql節點安裝並啓動mysqld

[root@localhost mog]# yum install mysql mysql-server

[root@localhost mog]# service mysqld start

Please report any problems with the /usr/bin/mysqlbug script!

                                                           [  OK  ]    
Starting mysqld:                                           [  OK  ]

 

進入mysql進行授權

mysql> grant all on mogilefs.* to 'moguser'@'172.16.%.%' identified by 'mogpass';    
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;    
Query OK, 0 rows affected (0.00 sec)

mysql> grant all on *.* to 'root'@'172.16.%.%' identified by 'mageedu';    
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;    
Query OK, 0 rows affected (0.00 sec)

 

OK,下面到storage端進行數據庫初始化

image

初始化完成可以在數據庫中查看

image

 

 

修改配置文件

注意2個節點中都要修改

[root@www mog]# vim /etc/mogilefs/mogilefsd.conf

image

然後就可以啓動服務了

[root@www mog]# service mogilefsd start    
Starting mogilefsd                                         [  OK  ]

查看端口是否開啓

image

 

下面修改mogstored的配置文件並啓動服務(2個節點都要改)

[root@localhost mog]# vim /etc/mogilefs/mogstored.conf

image

[root@www ~]# service mogstored start    
Starting mogstored                                         [  OK  ]

查看端口是否啓動

image

 

添加節點

[root@www ~]# mogadm --trackers=172.16.6.20:7001 host add 172.16.6.20 --ip=172.16.6.20 --status=alive    
[root@www ~]# mogadm --trackers=172.16.6.20:7001 host add 172.16.6.30 --ip=172.16.6.30 --status=alive

查看是否添加成功

image 

image

 

添加設備

 

[root@www ~]# mogadm --trackers=172.16.6.20:7001,172.16.6.30:7001 device add 172.16.6.20 1    
[root@www ~]# mogadm --trackers=172.16.6.20:7001,172.16.6.30:7001 device add 172.16.6.30 2

查看是否添加成功

image

發現剛剛的文件目錄的權限沒給。注:修改權限的步驟我沒寫在這裏,我放到了上面的修改權限

修改之後就OK :

image

 

創建domain:實現名稱空間

[root@www ~]# mogadm --trackers=172.16.6.20:7001,172.16.6.30:7001 domain add files

[root@www ~]# mogadm --trackers=172.16.6.20:7001,172.16.6.30:7001 domain add images

 

查看生成的domain

image

創建class:複製文件的最小單位

image

解釋下這裏的幾個參數意思:

mindevcount:最小複製文件的份數

replpolicy :複製份數

hashtype:採用的hash的類型

 

好了下面就可以上傳一下文件試一下看看了

上傳圖片文件

[root@www ~]# mogupload --trackers=172.16.6.20:7001 --domain=images --key='/a.jepg' --file='/root/75b4519340.jpg'

上傳文本文件

[root@www ~]# mogupload --trackers=172.16.6.20:7001 --domain=files --key='/init.html' --file='/etc/inittab'

 

查看文件的fid進行訪問

[root@www ~]# mogfileinfo --trackers=172.16.6.20:7001 --domain=images --key='/a.jepg'    

- file: /a.jepg     

     class:              default     

  devcount:                    2     

    domain:               images     

       fid:                    4     

       key:              /a.jepg     

    length:               432441     

- 
http://172.16.6.30:7500/dev2/0/000/000/0000000004.fid
     

- 
http://172.16.6.20:7500/dev1/0/000/000/0000000004.fid

image

[root@www ~]# mogfileinfo --trackers=172.16.6.20:7001 --domain=files --key='/init.html'    

- file: /init.html     

     class:              default     

  devcount:                    2     

    domain:                files     

       fid:                    5     

       key:           /init.html     

    length:                  884     

- 
http://172.16.6.20:7500/dev1/0/000/000/0000000005.fid
     

- http://172.16.6.30:7500/dev2/0/000/000/0000000005.fid

image

OK,成功了。

 

但是如果是通過fid來訪問的方式實在是太過拙劣,我們能不能通過直接訪問如172.16.6.20/a.jpeg這種方式來訪問呢

沒錯,那這就是用nginx來反向代理的意義了,我們可以通過nginx上的mogilefs模塊來實現這種功能,那麼下面就來讓我們安裝配置吧

 

 

nginx的編譯安裝

由於yum安裝的nginx不支持mogilefs這個模塊,因此我們只能編譯安裝了

編譯之前確保編譯環境準備就緒

# yum groupinstall "Development Tools" "Server Platform Deveopment"    
# yum install openssl-devel pcre-devel

下面我們需要編譯安裝的包已經模塊包

這裏我已經下載好了

[root@localhost ~]# ls  
anaconda-ks.cfg  install.log  install.log.syslog  mogilefs  nginx-1.6.1.tar.gz  nginx_mogilefs_module-1.0.4.tar.gz  

創建系統用戶nginx

[root@localhost nginx-1.6.1]# groupadd -r nginx    
[root@localhost nginx-1.6.1]# useradd -g nginx -r nginx

 

2個包都進行解壓

[root@localhost ~]# tar xf nginx-1.6.1.tar.gz    
[root@localhost ~]# tar xf nginx_mogilefs_module-1.0.4.tar.gz

編譯安裝nginx

[root@localhost ~]# cd nginx-1.6.1

image

[root@localhost nginx-1.6.1]# make && make install

ok,安裝完畢

 

修改配置文件使nginx進行反向代理

[root@localhost nginx-1.6.1]# vim /etc/nginx/nginx.conf

以下yellow字體爲加入的配置

worker_processes  1;

events {    
    worker_connections  1024;    
}

http {    
    include       mime.types;    
    default_type  application/octet-stream;

      sendfile        on;    
    #tcp_nopush     on;

    #keepalive_timeout  0;    
    keepalive_timeout  65;

    #gzip  on;    
    upstream trackers {                                           定義上流服務器集羣      
       server 172.16.6.20:7001;      
       server 172.16.6.30:7001;      
}      
    server {    
        listen       80;    
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {    
            root   html;    
            index  index.html index.htm;    
        }    
       location ~* ^(/img/.*)$ {                 注意爲了方便起見,這裏我只是對圖片這個區域進行了定義,    

           mogilefs_tracker trackers;     這裏 並沒有對其他區域定義,對其他區域定義的方式也一樣      
           mogilefs_domain images;     指定區域        
           mogilefs_noverify on;

          mogilefs_pass $1{

              proxy_pass $mogilefs_path;      
              proxy_hide_header Content-Type;      
              proxy_buffering off;      
                }      
          }   
            

        error_page   500 502 503 504  /50x.html;    
        location = /50x.html {    
            root   html;    
                  }

            }

   }

 

爲nginx提供類似service的啓動腳本

[root@localhost nginx-1.6.1]# vim /etc/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@localhost nginx-1.6.1]# chmod +x /etc/init.d/nginx

啓動服務

root@localhost nginx-1.6.1]# service nginx start    
Starting nginx:                                            [  OK  ]

 

OK,下面我們就可以測試下了

先傳一張圖片到服務器上

[root@www ~]# mogupload --trackers=172.16.6.20:7001 --domain=images --key='/img/a.jpg' --file='/root/75b4519340.jpg'

OK,下面我們直接用key的路徑進行訪問

image

OK,實驗完成。

 

那麼本節的內容就講到這裏,歡迎大家的批評指正,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章