MogileFS:是一個開源的分佈式存儲,適用於存儲海量的小文件。由LiveJournal旗下的Danga Interactive。這個公司還有memcache , MogileFS, Perlbal(http代理)等產品。其特色以下:html
1,工用於應用層(用戶空間):無須特殊的核心組件,由於基於http或都nfs,通常客戶端都支持。node
2,無單點故障所在,假設MySQL已經高可用而且tracker爲多個節點。由於MySQL是否高可用,取決於MySQL。mysql
3,自動文件複製,用戶在上傳一份數據都,tracker會根據設定好的策略自動複製一份或多份其它節點。假如其中一個節點故障,tracker會自動把數據複製一份,作到數據一直有冗餘。若是使用中增長一個節點,須要手動作策略把那些節點的數據與新加入的節點作平均。nginx
4,比「RAID」好多了,由於其實現了主機間的冗餘。官方就這麼解釋的!sql
5,傳輸中立,無特殊協議。傳輸中用的是http協議或nfs協議。數據庫
6,命名空間比較簡單。使用域(domain)來表示名稱空間的。每一個文件對應於一個KEY,文件存儲的機制是一個值。是以 key-value 對兒在任的。KEY是一個全局名稱空間,可使用domain模擬實現目錄級別,也能夠把全部文件放在一個平面。vim
7,不依賴於任何共享存儲設備。使用系統上的通常存儲就能夠。後端
MogileFS的組件:centos
跟蹤節點,Tracker : Mogilefsd進程,主控制進程,。其實現的功能包括:文件的複製,文件的刪除,查詢文件是否存儲,監控一個文件存儲的位置是否正常等等。這個進程工做於元數據節點。瀏覽器
存儲節點(storage nodes),由mogstored進程監聽於套接字上。文件實際存儲的位置。其實質上是一個http服務器。基於WebDAV模式工做。可以實現建立,刪除,重命名等操做。其實現方式是把一個大容量的磁盤掛載上,而後上傳下載數據。
MySQL節點:用於爲tracker存儲元數據信息:爲mogilefs的名稱空間及文件名。
MogileFS自帶了不少管理文件的工具。
安裝配置過程。
安裝完成後,須要在mysql爲mogliefs受權一個用戶,讓其對mogilefs庫有所有權限。此數據庫主要用來存儲node數據。若是tracker與mysql在一臺服務器上,須要對本機的主機名進行受權。
MariaDB [mogilefs]> grant all on *.* to 'root'@'172.16.2.%' identified by 'mogpass';
MariaDB [mogilefs]> grant all on *.* to 'mogilefs'@'172.16.2.%' identified by 'mogpass';
MariaDB [mogilefs]> grant all on *.* to 'root'@'firewall' identified by 'mogpass';
MariaDB [mogilefs]> grant all on *.* to 'root'@'172.16.2.%' identified by 'mogpass';
MariaDB [mogilefs]> flush privileges;
注:若是tracker與mysql在一個節點上,須要爲本機的主機名受權,由於mysql在驗證時會驗證主機名。
msql受權完成後,在tracker上初始化數據庫
# mogdbsetup --dbhost=172.16.2.13 --dbport=3306 --dbname=mogilefs --dbrootuser=root --dbrootpass=mogpass --dbuser=moguser --dbpass=mogpass
修改配置文件 ,大概以下:
# grep '^[^#]' /etc/mogilefs/mogilefsd.conf
daemonize = 1 #是否運行爲守護進程,1表示爲真
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogilefs:host=172.16.2.13 #指定鏈接數據庫,mogilefs爲數據庫名。
db_user = moguser 鏈接mysql時使用的用戶
db_pass = mogpass 鏈接mysql時使用的密碼
listen = 172.16.2.16:7001 tracker端監聽的ip和tcp端口,默認就是7001
conf_port = 7001
query_jobs = 10 最多的查詢線程數
delete_jobs = 1 用於刪除文件的線程數最多有幾個。1 比較穩當
replicate_jobs = 5
reaper_jobs = 1
min_free_space = 200 最小的利於空間,以m爲單位
# service mogilefsd start
# chkconfig mogilefsd on 確保tracker的服務能開機自動啓動
# ss -tnl 查看是否有7001端口處於監聽
mogilefd配置端口處理監聽後,到mogstor上安裝配置。第個存儲節點都須要執行下面的操做
# yum -y install perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm
# yum -y install perl-IO-AIO 這個模塊必需要安裝。
把準備用於存儲的磁盤格式化掛載,把用戶和組都設置爲mogilefs。而後修改配置文件/etc/mogilefs/mogstored.conf
maxconns = 10000 最大併發鏈接數
httplisten = 172.16.2.100:7500 監聽地址
mgmtlisten = 172.16.2.100:7501 管理地址
docroot = /mogiled/data 文件存儲的位置,生產環境中應當爲掛載的整個磁盤。
# mkdir -pv /mogiled/data && chwon -R mogilefs.mogilefs /mogiled/data
# service mogstored star 若是啓動不了,多是mogilefs用戶沒有建立。添加用戶就能夠了。
# chkconfig mogstroed on 讓存儲服務開機自動啓動。
# ss -tnl 查看配置文件中定義的端口是否啓動。
數據存儲端配置好後到tracker 上把存儲端加入到本分佈式系統中。有多少個就加多少個。輸入mogadm 就會顯示這命令的使用方法。這個命令能夠
# mogadm --trackers=172.16.2.16:7001 host add s2 --ip=172.16.2.100 --status=alive
# mogadm --trackers=172.16.2.16:7001 host list
添加好節點後爲各個節點添加設備
# mogadm --trackers=172.16.2.16:7001 device add s3 dev3
# mogadm --trackers=172.16.2.16:7001 device list 若是像下面顯示,沒有顯示容量等信息,說明mogstored端存儲目錄下沒有與設備ID同名的目錄,且這個目錄的屬主和屬組應當爲mogliefs
# mogadm --trackers=172.16.2.16:7001 device summary 查看各個設備的摘要信息。
注:若是顯示不出設備的摘要信息,須要在各個存儲節點下 docroot = /mogiled/data 所指定的路徑下建立一個名字與設備名同名的目錄,而且屬主和屬組是 mogilefs。
# mogadm --trackers=172.16.2.16:7001 device list
添加domain domain是用來建立名稱空間的,每一個文件都須要用key來標記,每一個文件在名稱必須唯一。
# mogadm --trackers=172.16.2.16:7001 domain add "p_w_picpaths"
# mogadm --trackers=172.16.2.16:7001 domain list
class 是mogilefs中最小的複製單位。建立class若是有須要能夠指定複本存儲幾份。
上傳文件測試,在任意一臺節點上執行均可以。
# mogupload --trackers=172.16.2.16:7001 --domain=/p_w_picpaths/ --key='/p_w_picpaths/bg.png' --file='/usr/share/backgrounds/default.png'
# mogfileinfo --trackers=172.16.2.16:7001 --domain=/p_w_picpaths/ --key='/p_w_picpaths/bg.png'
複製紅框裏的任意一條到瀏覽器中訪問,能夠訪問到此文件了。
因爲存儲節點的mogiled使用的是 WebDAV機制,它容許使用http的 put , delete方法管理文件。這裏全用curl模仿一下。
其它的命令
mogfetch 下載文件
mogupload 上傳文件
mogrename 生命名
moglistkey 例出全部的key
# moglistkeys --trackers=172.16.2.16:7001 --domain=test
# moglistkeys --trackers=172.16.2.16:7001 --domain=test --key_prefix='/p_w_picpaths' 查看以p_w_picpaths開頭的。
# mogstats --db_dsn="DBI:mysql:mogilefs:host=172.16.2.13" --db_user="moguser" --db_pass="mogpass" --verbose 查看數據庫中主機信息,domain,class,文件個數等。
讓nginx代理mogilefs
編譯安裝
# yum -y groupinstall "Development tools" "Server Platform Development"
# yum -y install gcc
# yum -y install pcre-devel
# yum -y install bzip2-devel
# wget http://www.grid.net.ru/nginx/download/nginx_mogilefs_module-1.0.4.tar.gz
# wget http://nginx.org/download/nginx-1.7.3.tar.gz
# tar -xvf nginx_mogilefs_module-1.0.4.tar.gz
# tar -xvf nginx-1.7.3.tar.gz
# cd nginx-1.7.3
# ./configure --prefix=/usr/local/ --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/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/uwscgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre --with-debug --add-module=../nginx_mogilefs_module-1.0.4
--add-module=../nginx_mogilefs_module-1.0.4 用來添加模塊的選項
注:用nginx_mogilefs_module-1.0.4版本,1.0.2有問題。
# make && make install
# useradd -r nginx
# vim /etc/init.d/nginx 提供一個服務管理腳本
官方提供的適用於red hat 系統的腳本:http://wiki.nginx.org/RedHatNginxInitScript
# chmod +x /etc/init.d/nginx
# service nginx start
# vim nginx.conf
官方 配置說明 http://www.grid.net.ru/nginx/mogilefs.en.html
本次實驗的配置
----------------------------------------------------------------------------------------
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream trackers { 定義後端的服務器組
server 172.16.2.10:7001;
server 172.16.2.14:7001;
server 172.16.2.16:7001;
}
server {
listen 80;
server_name localhost;
client_max_body_size 500m; 容許客戶端上傳文件最大爲500M
location / {
root html;
index index.html index.htm;
}
location /file { 定義一個URL,對此URL使用mogilefs模塊
mogilefs_tracker trackers; 調用後端服務器
mogilefs_domain file;
mogilefs_methods GET DELETE; 容許使用的方法,因爲這個版本的nginx不支持上傳,因此沒寫put
mogilefs_pass {
proxy_pass $mogilefs_path;
proxy_hide_header Content-Type;
proxy_buffering off;
}
}
location /p_w_picpaths {
mogilefs_tracker trackers;
mogilefs_domain p_w_picpaths;
mogilefs_methods GET DELETE;
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;
}
}
-------------------------------------------------------------------------
測試階段
上傳一個文件
# mogupload --trackers=172.16.2.10:7001 --domain=p_w_picpaths --key='/test.jpg' --file='/usr/share/backgrounds/centos_1920x1200_logoonly.jpg'
在瀏覽器中使用http://172.16.2.18/p_w_picpaths/test.jpg訪問。
使用crul模擬測試刪除文件。
# curl -X DELETE http://172.16.2.18/p_w_picpaths/test.jpg