分佈式存儲:html
多個節點共同提供存儲空間,而後經過一箇中間層抽象出一個接口,提供給其餘程序調用,存儲自己對於上層應用是透明的;前端
存儲方式:node
單獨使用一個節點存儲文件的元數據:集中元數據存儲;mysql
存儲節點專門存儲數據,元數據節點專門存儲元數據;linux
每一個存儲節點都存儲文件的元數據;nginx
存儲節點不光存儲數據,而且還存有全局的元數據;git
分佈式文件系統與分佈式存儲的區別:程序員
分佈式文件系統提供文件系統接口,而分佈式存儲沒有文件系統接口,經過API訪問其中的數據;github
常見的分佈式文件系統;sql
GFS:Google File System,並行存儲海量文件;
HDFS:儲存大量較大的單個文件;
TFS:存儲海量小文件;
將元數據存儲於關係型數據庫或其餘高性能存儲中,從而能維護海量文件元數據;
GlusterFS:
去中心化設計;
cehp:整合到linux內核中的分佈式文件系統;
MogileFS:存儲海量小文件;
MogileFS文件系統:使用的是HTTP協議進行數據傳輸,因此很是適用於WEB;
角色:
Tracker:元數據節點;
負責向Database中存儲元數據或從Database中檢索元數據;而且能夠設置多個Tracker節點,進行高可用;
Database:存儲元數據節點的關係型數據庫;
可使用mysql數據庫,而且能夠作主從複製,對數據進行高可用;
Storage Node:存儲節點;
用於存儲真正的數據;
Client Library:客戶端接口;
經過調用API與其餘角色進行通訊;
基本元素:
Domain:域
一個MogileFS能夠有多個域,每一個域能夠用來存放不一樣類型的文件,位於同一個域中的Key(文件名)必須惟一,位於不一樣的域則Key能夠相同;
因此這就產生了一個問題:
像淘寶這樣的平臺,它會爲每一個店鋪提供上傳本身商品圖片的業務,可是每一個店鋪都是獨立的,他們上傳圖片的時候又不會對比本身所傳圖片的命名名稱是否與其餘人的相同,這就與domain的機制相沖突了;固然咱們也能夠爲每一個店鋪提供一個domain,可是這樣對於管理員來講管理起來就太麻煩了不是嗎?因此咱們一般都是將店鋪上傳的圖片通過系統自動隨機改爲另一個名稱而後存儲到MogileFS中,而後像PHP頁面等程序員使用的時候直接引用便可;
Class:類
管理文件屬性,定義文件存儲在不一樣設備上的份數,是最小的複製單元,即用於將多個小文件合併成一個單獨被冗餘的複製單元;
示例:
1.Nginx+MogileFS
拓撲結構:
一共四個節點:
192.168.80.145 centos7
192.168.80.131 clone1
192.168.80.134 clone2
此三個節點運行Mysql(galera cluster)、Storage Node、Tracker;
192.168.80.136 node2
此節點做爲負載均衡器,運行Nginx;
執行過程:
前端負載均衡器Nginx接收客戶端請求之後,Nginx本身扮演成MogileFS的客戶端,向Tracker請求元數據,當接收請求之後再跟進其響應的結果去Storage Node請求真正的數據,最後將接收到的數據響應返回給客戶端;
配置過程:
a.處理依賴關係
~]# yum install perl-Sys-Syslog perl-Net-Netmask perl-IO-AIO
b.安裝MogileFS
~]# 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 MogileFS-Utils-2.19-1.el6.noarch.rpm perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm
c.添加相關的Mysql受權用戶
添加一個遠程鏈接用戶(能夠不添加):
MariaDB [(none)]> grant all on *.* to 'root'@'192.168.80.%' identified by 'admin';
建立一個MogileFS專用的數據庫
MariaDB [(none)]> create database mogilefs;
受權一個能夠徹底控制MogileFS專用數據庫的用戶
MariaDB [(none)]> grant all on mogilefs.* to 'moguser'@'192.168.80.%' identified by 'mogpass';
MariaDB [(none)]> flush privileges;
d.數據庫初始化
~]# mogdbsetup --dbhost=192.168.80.145 --dbrootpass='admin' --dbuser='moguser' --dbpass='mogpass'
使用mogdbsetup -h查看幫助信息
e.編輯Tracker的配置文件
~]# vim /etc/mogilefs/mogilefsd.conf
daemonize = 1 以守護進程的方式運行
pidfile = /var/run/mogilefsd/mogilefsd.pid pid文件
db_dsn = DBI:mysql:mogilefs:host=192.168.80.145 鏈接數據庫的數據源的方式:鏈接方式:數據庫類型:數據庫名稱:主機
db_user = moguser
db_pass = mogpass
listen = 0.0.0.0:7001
conf_port = 7001 管理端口
query_jobs = 10 查詢(用於查詢文件)線程的數量
delete_jobs = 1 刪除(用於刪除文件)線程的數量
replicate_jobs = 5 複製線程數量
reaper_jobs = 1
f.啓動mogilefsd服務
~]# service mogilefsd start
g.編輯Storage Node的配置文件
~]# mkdir /data/mofilefs/dev1 -pv 路徑中」dev1」是固定格式
~]# chown -R mogilefs.mogilefs /data/mofilefs/
~]# vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /data/mogilefs/
h.若是是在centos7中則須要修改一下Storage Node的服務腳本;
~]# cat /etc/init.d/mogstored (考眼力,找不一樣)
lockfile=${LOCKFILE-/var/lock/subsys/mogstored}
pidfile=/var/run/mogilefsd/mogstored.pid
RETVAL=0
start() {
[ $RETVAL = 0 ] && success && touch ${lockfile} && echo $(pidof mogstored) > ${pidfile}|| failure
}
stop() {
[ $RETVAL = 0 ] && success && rm -f ${lockfile} ${pidfile} || failure
}
~]# systemctl daemon-reload
i.啓動mogstored服務
~]# service mogstored start
j.MogileFS關機工具:mogadm
mogadm host:管理節點
mogadm host list
mogadm device:管理設備
mogadm device list
mogadm domain:管理域
mogadm class:管理類
mogadm slave:管理從節點
mogadm fsck:管理文件系統的檢測
mogadm rebalance:管理存儲均衡
mogadm setting:設置集羣屬性
查看幫助:mogadm -h或者mogadm host add 而後直接鍵入回車會有更詳細的提示信息;
k.添加Storage Node節點到集羣中
~]# mogadm --tracker=192.168.80.145:7001 host add 192.168.80.145(主機名) --ip=192.168.80.145(節點地址) --status=alive(節點狀態)
~]# mogadm --tracker=192.168.80.145:7001 host add 192.168.80.131(主機名) --ip=192.168.80.131(節點地址) --status=alive(節點狀態)
~]# mogadm --tracker=192.168.80.145:7001 host add 192.168.80.134(主機名) --ip=192.168.80.134(節點地址) --status=alive(節點狀態)
~]# mogadm device add 192.168.80.145 1 添加設備
~]# mogadm device add 192.168.80.131 2
~]# mogadm device add 192.168.80.134 3
~]# mogadm device list
~]# mogadm check
~]# mogadm domain add images 添加域
~]# mogadm domain list
~]# mogadm class add images jpeg
~]# mogadm class add images png
~]# mogadm class list
mindevcount:最少設備數量,也就是將相同的數據存儲到幾個設備上;
replpolicy:複製策略,相似上面的選項
以上選項能夠經過mogadm class 設置;
參看幫助:man mogadm
l.上傳文件到MogileFS中:mogupload
Usage: /usr/bin/mogupload --trackers=host --domain=foo --key='/hello.jpg' --file='./hello.jpg'
key:爲訪問路徑
file:要上傳的文件
~]# mogupload --domain=images --key='book.png' --file='/root/book.png' --class=png --trackers=192.168.80.145:7001
~]# mogstats --db_dsn="DBI:mysql:mogilefs:host=192.168.80.145" --db_user="moguser" --db_pass="mogpass" --verbose --stats="devices,files"
Fetching statistics... (devices,files)
m.查看文件狀態
~]#mogfileinfo --trackers=192.168.80.136:7001 --key='book.png' --domain=images
~]# mogadm check
Note:此處有錯(devcount:1),見文末;
n.查看文件
在瀏覽器鍵入上面http地址便可查看圖片;
o.使用Nginx做爲MogileFS的前端代理
Mogilefs支持使用Nginx做爲其前端的反向代理,Ngin能夠將客來自戶端的請求轉發給MogileFS,而且還能將MogileFS返回的數據(經過本身的響應路徑格式)響應給客戶端(咱們也發現了若是使用MogileFS本身的路徑放文件是及其不方便的,文件名也是比較難識別);Nginx要做爲MogileFS的反向代理使用還要額外加載一個模塊:nginx-mogilefs-module(下載地址:https://github.com/vkholodkov/nginx-mogilefs-module)
編譯安裝tengine做爲反向代理:
在編譯以前能夠將tengine解壓路徑中的objs/Makefile文件中的CFLAGS = -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g行後面的」-Werror -g」去掉,不然會報告一個這樣的錯誤:(也能夠不設置直接編譯,若是報錯就改,不報就不改)
~]#unzip nginx-mogilefs-module-master.zip
~]#tar xf tengine-2.0.1.tar.gz
~]#cd tengine-2.0.1/
~]#./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 --with-pcre --with-debug --add-module=../nginx-mogilefs-module-master
~]#make
~]#make install
添加一個nginx啓動Unit
~]#vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/var/run/nginx/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=process
KillSignal=SIGQUIT
TimeoutStopSec=5
PrivateTmp=true
[Install]
WantedBy=multi-user.target
啓動nginx服務
~]#systemctl start nginx.service
配置nginx做爲MogileFS的反向代理
Tracker主機能夠配置多個,用於進行負載均衡
~]#vim /etc/nginx/nginx.conf
location /images/{
此處的路徑」/images/」會根據domain中的key的不一樣而不一樣,若是資源的key名稱開頭爲」/」則此處應該爲」/images」,若是沒有」/」則爲」/images/」;
mogilefs_tracker trackers;
指定tracker地址;
mogilefs_domain images;
指定域地址,每一個location中只能設置一個;
mogilefs_methods GET;
支持的請求方法;
mogilefs_noverify on;
是否作校驗;
mogilefs_pass {
proxy_pass $mogilefs_path;
自帶變量,讓Nginx自動構建請求報文,發送給Tracker主機;
proxy_hide_header Content-Type;
proxy_buffering off;
}
}
location /status {
check_status;
access_log off;
allow 192.168.80.0/24;
deny all;
}
upstream trackers {
server 192.158.80.136:7001 weight=1;
server 192.168.80.147:7001 weight=1;
check interval=1000 rise=2 fall=5 timeout=1000;
#check interval=1000 rise=2 fall=5 timeout=1000 mode=http;
#check_keepalive_requests 100;
#check_http_send= 「GET / HTTP/1.0\r\n\r\n」;
#check_http_expect_alive http_2xx http_3xx;
此check關鍵字只在tengine中可使用;
}
重啓Nginx服務
systemctl restart nginx.service
測試訪問資源
http://192.168.80.147/images/book6.png
Note:示例中的拓撲結構跟示例的例子有些出入,由於在作的過程當中,clone1和clone2這個兩個節點爲centos6,由於監聽mogstored服務所須要的接口,因此沒有搭建成功,只是做爲mysql galers cluster使用了,而且centos7也沒有搭建成功,因此也是做爲mysql使用了,最後將MogileFS搭建在了node2中,而後還另加了一個節點node3(192.168.80.147)也用於搭建MogileFS;其實就是換了主機,其餘的沒有變化,不影響實驗;
出現的問題:
1.此文章中使用的服務啓動腳本,有時候在centos7中雖然作了上述的修改可是,仍然沒法啓動服務,可是我換了一個centos7就能夠了,目前尚未找到服務,其報錯爲:mogstored.pid參數錯誤;
2.報錯:PID file /var/run/mogilefsd/mogilefsd.pid not readable (yet?) after start.
解決方法:建立/var/run/mogilefsd/目錄,而且更改屬主屬組爲mogilefs便可;
3.本文使用的rpm安裝包在centos6中安裝之後能夠啓動服務,都顯示成功,可是mogstored服務的接口並無處於監聽狀態,因此沒法做爲Storage Node提供存儲空間;(這就是上面換主機的緣由)
致使的錯誤爲:使用mogadm check之後顯示請求遠端節點失敗
4.當上傳文件之後,原本設置的是文件會冗餘一份,可是經過mogfileinfo查看卻只有一份,也就是devcount: 1 ,這是由於perl-Sys-Syscall模塊版本(0.25)過新致使的,將其降級成0.23版本便可;
修改步驟:
下載0.23的版本:https://metacpan.org/release/BRADFITZ/Sys-Syscall-0.23
解壓之後使用Sys-Syscall-0.23/lib/Sys/Syscall.pm覆蓋現有系統中的0.25版本的同名文件(能夠經過rpm -ql perl-Sys-Syscall來查看現有系統的0.25版本的文件都安裝在哪了);先關閉服務,而後再覆蓋;
借鑑文章:http://www.bubuko.com/infodetail-2225032.html
注:根據馬哥視頻作的學習筆記,若有錯誤,歡迎指正;侵刪