分佈式文件系統MogileFS的使用

MogileFS簡介
html

MogileFS是一套開源的分佈式存儲組件,由LiveJournal旗下的Danga Interactive研發,主要應用於存儲海量的小文件。
前端

MogileFS有3個組件:node

1)Tracker Nodes:是文件系統集羣的核心節點,藉助數據庫節點保存元數據,主要功能包括監控後端Storage節點,及指示Storage節點完成數據的添加、刪除、查詢,及節點之間數據的複製等,該節點上運行的進程爲mogilefsd。每每Tracker節點有多個,以實現負載均衡和高可用;mysql

2)Storage Nodes:實際存儲數據的位置,基於WebDAV模式工做,能完成文件建立、刪除、重命名等操做,運行的進程爲mogstored;nginx

3)database Nodes幫助Tracker節點存放元數據及全局信息,包括host,domain,class等。數據庫建議使用高可用集羣,防止單點故障。sql


實現機制數據庫

在該文件系統集羣中,每個數據塊都會有多個副本,存放於多個Storage Node上,不一樣的文件系統副本的數量各不相同(通常建議爲3份),在Tracker Node上會分別單獨記錄每個數據塊的存儲位置(位於哪一個Storage及路徑)。若某個Storage節點不在線了,客戶端向Tracker節點請求獲取數據時,Tracker節點會返回用於冗餘的副本的存儲位置給客戶端。這樣就保證了整個文件系統中數據的高可用性。當有數據存儲至某一storage節點後,各storage節點會根據Tracker的指示經過節點間通訊將副本發送至其餘節點上。若某一storage下線了,該節點上的副本會由其餘節點從新提供,保證副本的個數很多於指定的值。編程


MogileFS結構圖vim

wKioL1Xu1HPzKlg3AAEMMbZ2nDc051.jpg

工做原理:客戶端須要存取數據時,首先與Tracker進行交互,Tracker經過查詢數據庫來獲取客戶端存取數據時所須要訪問的元數據,而後返回給客戶端,客戶端利用Tracker返回的結果,與Storage Nodes節點進行交互完成數據存取(一次有可能聯繫一個也可能聯繫多個)。後端


部署MogileFS

部署Tracker Nodes

1)安裝程序包

使用cpan在線安裝,首先安裝必要的perl庫。

[root@node1 ~]# cpan Sys::Syscall
[root@node1 ~]# cpan IO::WrapTie 
[root@node1 ~]# cpan Danga::Socket
[root@node1 ~]# cpan IO::AIO
[root@node1 ~]# cpan MogileFS::Client
[root@node1 ~]# cpan Net::Netmask
[root@node1 ~]# cpan Perlbal

安裝MogileFS Server:

[root@node1 ~]# cpan MogileFS::Server

或者下載源碼包編譯安裝:

[root@node1 ~]# wget http://mirrors.ustc.edu.cn/CPAN/authors/id/D/DO/DORMANDO/MogileFS-Server-2.72.tar.gz
[root@node1 ~]# tar xf MogileFS-Server-2.72.tar.gz 
[root@node1 ~]# cd MogileFS-Server-2.72
[root@node1 MogileFS-Server-2.72]# perl Makefile.PL 
[root@node1 MogileFS-Server-2.72]# make && make install


2)完成配置

建立配置文件目錄並添加配置文件:

[root@www ~]# mkdir /etc/mogilefs
[root@node1 ~]# vim /etc/mogilefs/mogilefsd.conf 
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogilefs:host=192.168.1.134;port=3306;mysql_connect_timeout=5   #鏈接數據庫的信息
db_user = mogilefs          #數據庫上的用戶名
db_pass = mogilefs          #用戶名對應的密碼
listen = 0.0.0.0:7001       #監聽的地址和端口
conf_port = 7001 
query_jobs = 10             #用於查詢的進程數
delete_jobs = 1             #用於刪除操做的進程數
replicate_jobs = 5          #用於複製的進程數
reaper_jobs = 1             #用於回收資源的進程數

在數據庫節點上建立數據庫,並受權用戶:

MariaDB [(none)]> create database mogilefs;
Query OK, 1 row affected (0.04 sec)
 
MariaDB [(none)]> grant all on mogilefs.* to 'mogilefs'@'192.168.%.%' identified by 'mogilefs';
Query OK, 0 rows affected (0.00 sec)
 
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

初始化數據庫:

[root@node1 ~]# mogdbsetup --dbhost=192.168.1.134 --dbname=mogilefs --dbuser=mogilefs --dbpass=mogilefs --dbrootpass=mogilefs

若出現以下錯誤,是沒有安裝perl鏈接mysql的驅動引發的,安裝perl-DBD-MySQL便可。

Failed to load MogileFS::Store::MySQL: Can't locate DBD/mysql.pm in @INC (@INC contains: lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/share/perl5/MogileFS/Store/MySQL.pm line 5.........
........
###########################################
[root@node1 ~]# yum install perl-DBD-MySQL


3)啓動服務

mogilefsd不能以root身份運行,必須用其餘用戶運行,爲此添加mogilefs用戶,而後啓動服務:

[root@node1 ~]# useradd -r mogilefs
[root@node1 ~]# su - mogilefs -c "mogilefsd -c /etc/mogilefs/mogilefsd.conf --daemon"

更好的方式是添加服務腳本,而後經過腳本啓動服務。


這裏有一項須要注意,Sys::Syscall的0.25版本存在bug,在文件系統運行過程當中,向文件系統上添加數據,其不會按照默認策略保留2個副本,默認策略以下:

wKioL1XuxKzSYVUQAACXKoapShU670.jpg

上傳的文件信息:

wKiom1XuwsnDvnL1AAEVEKyXGEA084.jpg

能夠看到,數據僅有一份,保存在192.168.1.127節點上。Sys::Syscall的0.25版本爲最新版本,使用cpan默認安裝的就是這個版本,降級到0.23版本便可,或者直接下載安裝0.23版本。

wget http://mirrors.ustc.edu.cn/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz
###############################
perl Makefile.PL 
make && make install


部署Storage Nodes

1)安裝程序包(與上述一致)

[root@node2 ~]# cpan Sys::Syscall
[root@node2 ~]# cpan IO::WrapTie 
[root@node2 ~]# cpan Danga::Socket
[root@node2 ~]# cpan IO::AIO
[root@node2 ~]# cpan MogileFS::Client
[root@node2 ~]# cpan Net::Netmask
[root@node2 ~]# cpan Perlbal
[root@node2 ~]# cpan MogileFS::Server


2)完成配置

建立目錄並添加配置文件:

[root@node2 ~]# mkdir /etc/mogilefs
[root@node2 ~]# vim /etc/mogilefs/mogstored.conf 
maxconns = 10000              #最大併發鏈接數
httplisten = 0.0.0.0:7500     #http監聽的地址
mgmtlisten = 0.0.0.0:7501     #管理接口監聽地址
docroot = /mogdata/data       #用於存儲的目錄

添加,掛載分區,根據/etc/mogilefs/mogstored.conf中的docroot配置信息添加目錄,並修改屬主屬組

[root@node2 ~]# fdisk /dev/sdb
[root@node2 ~]# mkfs -t ext4 -b 4096 /dev/sdb1
[root@node2 ~]# mkdir -pv /mogdata/data
mkdir: created directory `/mogdata'
mkdir: created directory `/mogdata/data'
[root@node2 ~]# mount /dev/sdb1 /mogdata/data/
[root@node2 ~]# chown -R mogilefs.mogilefs /mogdata/


3)啓動服務

添加用戶,啓動服務(同上述同樣,最好使用腳本):

[root@node2 ~]# useradd -r mogilefs
[root@node2 ~]# su - mogilefs -c "mogstored -c /etc/mogilefs/mogstored.conf --daemon"


安裝MogileFS-Utils管理MogileFS

在控制節點上安裝MogileFS-Utils,可用於添加host,device,domain,class等管理操做。

[root@node1 ~]# cpan MogileFS::Utils

或者

[root@node1 ~]# wget http://mirrors.ustc.edu.cn/CPAN/authors/id/D/DO/DORMANDO/MogileFS-Utils-2.29.tar.gz
[root@node1 ~]# tar xf MogileFS-Utils-2.29.tar.gz
[root@node1 ~]# cd MogileFS-Utils-2.29
[root@node1 MogileFS-Utils-2.29]# perl Makefile.PL 
[root@node1 MogileFS-Utils-2.29]# make && make install

建議直接使用cpan安裝,可自動安裝依賴的包。


基於nginx訪問MogileFS

Storge Node支持將上面存儲的數據以http模式的接口輸出,客戶端跟Storge Node進行交互的時,一般須要基於MogileFS提供的API編程以後,經過程序和storge通訊。nginx上的nginx_mogilefs模塊就是這樣的一個程序,用nginx做爲MogileFS的反向代理,用戶只要把須要訪問的資源以url的形式向nginx請求,既可以獲得須要的資源。


nginx_mogilefs工做原理:mogielfs爲nginx的第三方模塊,該模塊可以自動工做在nginx上,解碼用戶請求的url,把url中的一部分做爲domain,一部分做爲key發送給Tracker,Tracker將檢索到的fid返回給mogielfs模塊,mogielfs利用這個fid與Storge Nod交互取得數據,並將取得的數據返回給客戶端。nginx也可以接受用戶的上傳文件請求,把對應的url解析成domain和key,而且將文件根據Tracker的指示存儲在某個store節點上。

nginx_mogilefs_module模塊的下載地址:http://www.grid.net.ru/nginx/mogilefs.en.html


實驗拓撲圖

wKiom1Xu2E2RUcgoAAGMAv9D3oA187.jpg

配置多個Tracker,利用nginx實現負載均衡,建議在實際環境中將數據庫節點配置成高可用集羣,這裏爲了方便僅配置一個節點。


配置過程

1)首先在4個節點上按照上述方式部署Tracker和Storage,並將Tracker鏈接上數據庫

兩個Tracker鏈接同一個數據庫。

2)配置MogileFS環境

向Tracker添加各設備:

[root@node1 ~]# mogadm --trackers=192.168.1.126:7001 host add node1 --ip=192.168.1.106 --status=alive
[root@node1 ~]# mogadm --trackers=192.168.1.126:7001 host add node2 --ip=192.168.1.126 --status=alive
[root@node1 ~]# mogadm --trackers=192.168.1.106:7001 host add node3 --ip=192.168.1.127 --status=alive
[root@node1 ~]# mogadm --trackers=192.168.1.106:7001 host add node4 --ip=192.168.1.131 --status=alive
[root@node1 ~]# mogadm --trackers=192.168.1.106:7001 host list        #查看添加的主機


添加設備(須要在配置文件中docroot參數指定的目錄下建立對應的目錄,例如添加的設備號爲1,則添加的目錄名的dev1):

[root@node1 ~]# mogadm --trackers=192.168.1.106:7001 device add node1 1 --status=alive
[root@node1 ~]# mogadm --trackers=192.168.1.106:7001 device add node2 2 --status=alive
[root@node1 ~]# mogadm --trackers=192.168.1.106:7001 device add node3 3 --status=alive
[root@node1 ~]# mogadm --trackers=192.168.1.106:7001 device add node4 4 --status=alive

在各個Storage Node上建立對應的目錄:

Storage Node1上
[root@node1 ~]# mkdir /mogdata/data/dev1/
[root@node1 ~]# chown -R mogilefs.mogilefs /mogdata/
##################
Storage Node2上
[root@node2 ~]# mkdir /mogdata/data/dev2/
[root@node1 ~]# chown -R mogilefs.mogilefs /mogdata/
.........
.........

檢查狀態:mogadm --trackers=192.168.1.106:7001,192.168.1.126:7001 check

wKiom1Xu23HxnORdAAMP_07wyGo248.jpg


添加名稱空間:

[root@node1 ~]# mogadm --trackers=192.168.1.106:7001 domain add file

添加class:

[root@node1 ~]# mogadm --trackers=192.168.1.106:7001 class add file bigimg


3)安裝配置nginx

[root@www ~]# tar xf nginx-1.8.0.tar.gz 
[root@www ~]# tar xf nginx_mogilefs_module-1.0.4.tar.gz      #使用1.0.4版本
[root@www ~]# yum install pcre-devel
[root@www ~]# cd nginx-1.8.0
[root@node2 ~]#  ./configure \
   --prefix=/usr/local/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=/root/nginx_mogilefs_module-1.0.4 \      #添加第三方模塊
###############################
[root@www nginx-1.8.0]# make && make install
[root@www nginx-1.8.0]# useradd -r nginx


添加服務腳本:

.................
[root@www ~]# chmod +x /etc/init.d/nginx 
[root@www ~]# chkconfig --add nginx

配置nginx.conf,Tracker無需去維持用戶會話,前端的nginx在負載均衡時簡單的作加權輪詢便可:

[root@node2 nginx]# vim nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    upstream trackers {
        server 192.168.1.106:7001 weight=1;      #指定兩個Tracker
        server 192.168.1.126:7001 weight=1;
        }
    server {
        listen       80;
        server_name  localhost;

        location /file {
            mogilefs_tracker trackers;
            mogilefs_domain file;                #指定domain
            mogilefs_pass {
                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;
        }
      }
}


配置完成後啓動服務。

[root@www ~]# service nginx start
#########################
[root@www ~]# ansible tracker -m service -a 'name=mogilefsd state=started enabled=yes'
[root@www ~]# ansible storage -m service -a 'name=mogstored state=started enabled=yes'


進行測試

上傳一張圖片:

[root@www ~]# mogupload --trackers=192.168.1.106:7001 --domain=file --class=bigimg --key='hello.jpg' --file='/root/Public/24_P.jpg'

wKiom1Xu4L2ybcExAAGn6t9l-mo235.jpg

訪問資源:

wKioL1Xu417j17fBAAGs9O13Tw4484.jpg


中止192.168.1.106上的mogilefsd和mogstored服務:

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

wKiom1Xu4uDg80eSAAHRFv9ylZE480.jpg


wKiom1Xu4kzQk699AAE6wCD-tKE056.jpg

資源可以繼續訪問,測試完成.................^_^

相關文章
相關標籤/搜索