本節我們將來認識下分佈式文件系統,不過我主要講的是關於其中的一個比較流行的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的分佈式文件系統
實驗拓撲圖:
總的實驗步驟如下:由於有些步驟連在一起做,所以做的時候可能並不是完全按照以下步驟進行:
安裝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端進行數據庫初始化
初始化完成可以在數據庫中查看
修改配置文件
注意2個節點中都要修改
[root@www mog]# vim /etc/mogilefs/mogilefsd.conf
然後就可以啓動服務了
[root@www mog]# service mogilefsd start
Starting mogilefsd [ OK ]
查看端口是否開啓
下面修改mogstored的配置文件並啓動服務(2個節點都要改)
[root@localhost mog]# vim /etc/mogilefs/mogstored.conf
[root@www ~]# service mogstored start
Starting mogstored [ OK ]
查看端口是否啓動
添加節點
[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
查看是否添加成功
添加設備
[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
查看是否添加成功
發現剛剛的文件目錄的權限沒給。注:修改權限的步驟我沒寫在這裏,我放到了上面的修改權限
修改之後就OK :
創建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
創建class:複製文件的最小單位
解釋下這裏的幾個參數意思:
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
[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
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
[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的路徑進行訪問
OK,實驗完成。
那麼本節的內容就講到這裏,歡迎大家的批評指正,謝謝!