分佈式文件系統--MogileFS

一、分佈式文件系統簡介

1、分佈式系統定義?

分佈式系統沒有統一的定義,各說紛紜。

從服務器角度來說具有以下特點:

1、系統中的各個組件分佈於網路上的多個計算機;

2、各個組件彼此之間通過消息傳遞來通信並協調行動。

但是從客戶端來說,看不出這些特性,不影響用戶體驗。

2、爲什麼要使用分佈式系統?

一般使用向外擴展,來提高系統的性能,主要是解決了單機存在的故障。

1、向上擴展的性價比越來越低;

2、單機擴展存在臨界點;

3、從穩定性和可用性考慮,單機會存在多方面問題。

3、分佈式文件系統

常見的數據的種類有結構化、半結構化、非結構化數據。分佈式存儲是利用分佈式系統來存儲這些數據,最終實現這些數據存儲的文件系統稱之爲分佈式文件系統。

分佈式文件系統要實現的功能有:節點之間的通信、數據存儲、文件系統的支持 。

目前常見的分佈式文件系統:

  • GlusterFS: 適用於存儲單個(少量)大文件 。適用雲環境,流媒體文件  例如:用友公司

  • MogileFS: 適用於存儲海量小文件。將元數據存放在Mysql中,並不是內存中,對性能有影響

  • FastDFS: 適用於存儲海量小文件。將元數據存放在內存中,使用perl語言研發

  • MooseFS: 適用於小文件 大文件都可以

  • Ceph: 內核級別 支持PB級別級別的存儲

  • GFS(Google FS):提供了MapReduce對分佈式數據的處理方式;提供bigtable對數據的存儲

  • HDFS: MapReduce + HDFS = Hadoop(平臺) ,Hadoop是一個平臺,提供存儲大量數據的平臺;Hbase實現對數據的存儲

  • TFS: 對HDFS改進的實現海量小文件存儲

  • Luster: Oracle的開源分佈式文件系統

比較流行的 HDFS MogileFS TFS

二、MogileFS(開源的分佈式存儲)

由LiveJournal旗下:Danga Interactive研發的,該公司著名的項目:memcached MoglieFS Perlbal(同Nginx)。

MogileFS特性

1、工作於應用層(用戶空間文件系統)

2、無單點失敗

3、自動文件複製

4、比“RAID”好

5、傳輸中立 無特殊協議

6、密命名空間簡單 每個文件名稱對應一個key。使用全局文件結構。可以使用domain來模擬實現目錄的作用。

7、不依賴於如何共享設備

MogileFS的工作架構:

wKioL1Q4xm7SX4A6AAKuRYDOEvM798.jpg

三、MogileFS的實現

1、手動實現MogileFS的上傳和下載

試驗原理圖如下:

2

實驗步驟:

在172.16.10.77:

### 1、安裝配置mysql
yum install mysql-server -y
service mysqld start

## 授權用戶
mysql> GRANT ALL ON mogdb.* TO moguser@'172.16.10.%' IDENTIFIED BY 'mogpass';
mysql> GRANT ALL ON *.* TO root@'172.16.10.%' IDENTIFIED BY 'rootpass';
mysql> FLUSH PRIVILEGES;

### 2、安裝配置 MogileFS 的tracker端
## 依賴於 epel 源
yum install MogileFS-Server-2.46-2.el6.noarch.rpm \
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm \
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm \
 perl-Perlbal-1.78-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm  -y

### 3、初始化,主要是創建數據庫和表信息
mogdbsetup --dbhost=172.16.10.77 --dbuser=moguser --dbpass=mogpass \
   --dbrootuser=root --dbrootpass=rootpass --dbname=mogdb 

### 4、配置 tracker端(mogilefsd)
### 配置文件 /etc/mogilefs/mogilefsd.conf,主要的配置選項如下: 
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogdb:host=172.16.10.77
db_user = moguser
db_pass = mogpass
listen = 172.16.10.77:7001
conf_port = 7001
query_jobs = 10
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1
###################

service mogilefsd start

### 5、配置mogstared
### 配置文件 /etc/mogilefs/mogstared.conf,主要的配置選項如下:
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogdata/data 
###################
mkdir -p /mogdata/data
chown mogilefs.mogilefs /mogdata/data/ -R
service mogstored start

3

4

在172.16.10.51:

### 1、安裝配置 MogileFS 的 storage 端
## 依賴於 epel 源
yum install MogileFS-Server-2.46-2.el6.noarch.rpm \
MogileFS-Server-mogilefsd.noarch-0:2.46-2.el6 \
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  \
perl-Perlbal-1.78-1.el6.noarch.rpm \
perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-IO-AIO -y

### 2、配置mogstared
### 配置文件 /etc/mogilefs/mogstared.conf,主要的配置選項如下:
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogdata/data 
###################
mkdir -p /mogdata/data
chown mogilefs.mogilefs /mogdata/data/ -R
service mogstored start

5

安裝配置,到此基本完成。注意,以上安裝的軟件都是perl語言的模塊。可以使用cpan命令在線安裝。

6

接下來就是要配置mogielfs:

## 配置時,需要安裝perl-MogileFS-Client MogileFS-Utils
## 在172.16.10.77上進行配置:
yum install perl-MogileFS-Client-1.14-1.el6.noarch.rpm \
MogileFS-Utils-2.19-1.el6.noarch.rpm 

1、向tracker添加各mogstored主機
mogadm --trackers=172.16.10.77:7001 host add node1 --ip=172.16.10.51 --status=alive
mogadm --trackers=172.16.10.77:7001 host add node2 --ip=172.16.10.77 --status=alive

2、向tracker添加各設備
mogadm --trackers=172.16.10.77:7001 device add node1 1 --status=alive
mogadm --trackers=172.16.10.77:7001 device add node2 2 --status=alive
在172.16.10.51:
mkdir /mogdata/data/dev1
chown -R mogilefs.mogilefs /mogdata/data
在172.16.10.77:
mkdir /mogdata/data/dev2
chown -R mogilefs.mogilefs /mogdata/data

3、爲tracker定義名稱空間domain
mogadm --trackers=172.16.10.77:7001 domain add images
mogadm --trackers=172.16.10.77:7001 domain add files 

4、爲domain添加一個或多個class # 非必需的
mogadm --trackers=TRACKER_NODE class add 可同時副本的最少個數;

7 

上傳文件:mogupload

mogupload  --trackers=172.16.10.77:7001 --domain=files --key='/issue.file' \
   --file='/etc/issue'
mogupload  --trackers=172.16.10.77:7001 --domain=images --key='/linux.png' \
   --file='/root/linux.png'

查看文件信息:mogfileinfo

8

9

列出domain中的文件:moglistkeys

11

文件下載:mogfetch

10

2、使用Nginx作爲反向代理

實驗原理圖如下:

13

在192.16.10.9上安裝配置 Tracker和Storaged:

在以上配置的基礎上,繼續配置:

### 1、安裝配置 MogileFS 的tracker端
## 依賴於 epel 源
yum install MogileFS-Server-2.46-2.el6.noarch.rpm \
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm \
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm \
perl-Perlbal-1.78-1.el6.noarch.rpm \
perl-Net-Netmask-1.9015-8.el6.noarch.rpm  -y

### 2、初始化,主要是創建數據庫和表信息
mogdbsetup --dbhost=172.16.10.77 --dbuser=moguser --dbpass=mogpass \
    --dbrootuser=root --dbrootpass=rootpass --dbname=mogdb 

### 3、配置 tracker端(mogilefsd)
### 配置文件 /etc/mogilefs/mogilefsd.conf,主要的配置選項如下: 
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogdb:host=172.16.10.77
db_user = moguser
db_pass = mogpass
listen = 172.16.10.9:7001
conf_port = 7001
query_jobs = 10
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1
###################
service mogilefsd start

### 4、配置mogstared
### 配置文件 /etc/mogilefs/mogstared.conf,主要的配置選項如下:
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogdata/data 
###################
mkdir -p /mogdata/data
chown mogilefs.mogilefs /mogdata/data/ -R
service mogstored start

## 在172.16.10.77上進行配置:
1、向tracker添加各mogstored主機 mogadm --trackers=172.16.10.77:7001 host add \
   node3 --ip=172.16.10.9 --status=alive
2、向tracker添加各設備 mogadm --trackers=172.16.10.77:7001 device add node3 3 \
   --status=alive
在172.16.10.9:
mkdir /mogdata/data/dev3 chown -R mogilefs.mogilefs /mogdata/data

14

配置ngnix端:

在172.16.10.51:

## 編譯安裝nginx,編譯時要編譯 nginx-mogilefs模塊
## ngnix和nginx-mogilefs模塊在nginx的官網 nginx.org上,就可以下載到
useradd -r nginx
tar xf nginx_mogilefs_module-1.0.4.tar.gz
tar xf nginx-1.6.2.tar.gz
cd nginx-1.6.2
 ./configure --prefix=/usr --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=/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 --with-debug \
  --add-module=../nginx_mogilefs_module-1.0.4
make && make install

## 添加服務腳本:

#!/bin/sh
#
# nginx        Startup script for nginx
#
# chkconfig: - 85 15
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx/nginx.pid
# description: nginx is an HTTP and reverse proxy server
#
### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: start and stop nginx
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

if [ -L $0 ]; then
    initscript=`/bin/readlink -f $0`
else
    initscript=$0
fi

sysconfig=`/bin/basename $initscript`

if [ -f /etc/sysconfig/$sysconfig ]; then
    . /etc/sysconfig/$sysconfig
fi

nginx=${NGINX-/usr/sbin/nginx}
prog=`/bin/basename $nginx`
conffile=${CONFFILE-/etc/nginx/nginx.conf}
lockfile=${LOCKFILE-/var/lock/subsys/nginx}
pidfile=${PIDFILE-/var/run/nginx/nginx.pid}
SLEEPMSEC=${SLEEPMSEC-200000}
UPGRADEWAITLOOPS=${UPGRADEWAITLOOPS-5}
RETVAL=0

start() {
    echo -n $"Starting $prog: "

    daemon --pidfile=${pidfile} ${nginx} -c ${conffile}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && touch ${lockfile}
    return $RETVAL
}

stop() {
    echo -n $"Stopping $prog: "
    killproc -p ${pidfile} ${prog}
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}

reload() {
    echo -n $"Reloading $prog: "
    killproc -p ${pidfile} ${prog} -HUP
    RETVAL=$?
    echo
}

upgrade() {
    oldbinpidfile=${pidfile}.oldbin

    configtest -q || return
    echo -n $"Starting new master $prog: "
    killproc -p ${pidfile} ${prog} -USR2
    echo

    for i in `/usr/bin/seq $UPGRADEWAITLOOPS`; do
        /bin/usleep $SLEEPMSEC
        if [ -f ${oldbinpidfile} -a -f ${pidfile} ]; then
            echo -n $"Graceful shutdown of old $prog: "
            killproc -p ${oldbinpidfile} ${prog} -QUIT
            RETVAL=$?
            echo
            return
        fi
    done

    echo $"Upgrade failed!"
    RETVAL=1
}

configtest() {
    if [ "$#" -ne 0 ] ; then
        case "$1" in
            -q)
                FLAG=$1
                ;;
            *)
                ;;
        esac
        shift
    fi
    ${nginx} -t -c ${conffile} $FLAG
    RETVAL=$?
    return $RETVAL
}

rh_status() {
    status -p ${pidfile} ${nginx}
}

# See how we were called.
case "$1" in
    start)
        rh_status >/dev/null 2>&1 && exit 0
        start
        ;;
    stop)
        stop
        ;;
    status)
        rh_status
        RETVAL=$?
        ;;
    restart)
        configtest -q || exit $RETVAL
        stop
        start
        ;;
    upgrade)
        rh_status >/dev/null 2>&1 || exit 0
        upgrade
        ;;
    condrestart|try-restart)
        if rh_status >/dev/null 2>&1; then
            stop
            start
        fi
        ;;
    force-reload|reload)
        reload
        ;;
    configtest)
        configtest
        ;;
    *)
        echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload| \
          upgrade|reload|status|help|configtest}"
        RETVAL=2
esac

exit $RETVAL

################# end ################
mkdir /var/tmp/nginx/ -p

nginx安裝、基本配置完成。接下來,配置使用 nginx-mogilefs 模塊。

在/etc/ngnix/ngnix的配置文件中,添加:
upstream trackers{
	server 172.16.10.77:7001;
	server 172.16.10.9:7001;
}

location  /upload {
	mogilefs_tracker trackers;
	mogilefs_domain images;
	mogilefs_methods GET;
	mogilefs_noverify on;
		mogilefs_pass {
	                proxy_pass $mogilefs_path;
	                proxy_hide_header Content-Type;
	                proxy_buffering off;
	        }
}


## 啓動服務即可:
service ngnix start

15

可以實現文件的瀏覽功能,真正的上傳功能,每個公司都有自己開發的上傳工具。

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