一、分布式存儲(chǔ)系統(tǒng)簡(jiǎn)介
隨著信息技術(shù)不斷的發(fā)展,給我們帶來(lái)便利的同時(shí),不斷增加的數(shù)據(jù)量級(jí)、信息之間的連接關(guān)聯(lián)越來(lái)越復(fù)雜、數(shù)據(jù)訪問(wèn)的并發(fā)量日益增加對(duì)I/O的要求越來(lái)越高、數(shù)據(jù)類型越來(lái)越復(fù)雜等難題也成為信息技術(shù)繼續(xù)高速發(fā)展亟需解決的難題。分布式存儲(chǔ)系統(tǒng)的出現(xiàn)在很大程度上解決了以上大部分難題。
分布式存儲(chǔ)系統(tǒng),是將數(shù)據(jù)分散存儲(chǔ)在多臺(tái)獨(dú)立的設(shè)備上。傳統(tǒng)的網(wǎng)絡(luò)存儲(chǔ)系統(tǒng)采用集中的存儲(chǔ)服務(wù)器存放所有數(shù)據(jù),存儲(chǔ)服務(wù)器成為系統(tǒng)性能的瓶頸,也是可靠性和安全性的焦點(diǎn),不能滿足大規(guī)模存儲(chǔ)應(yīng)用的需要。分布式存儲(chǔ)系統(tǒng)采用可擴(kuò)展的系統(tǒng)結(jié)構(gòu),利用多臺(tái)存儲(chǔ)服務(wù)器分擔(dān)存儲(chǔ)負(fù)荷,利用位置服務(wù)器定位存儲(chǔ)信息,它不但提高了系統(tǒng)的可靠性、可用性和存取效率,還易于擴(kuò)展。
分布式存儲(chǔ)系統(tǒng)在接口類型上可分為通用分布式儲(chǔ)存和專用分布式儲(chǔ)存。通用分布式儲(chǔ)存是指沒(méi)有文件系統(tǒng)接口,需要通過(guò)API接口進(jìn)行訪問(wèn);專用分布式儲(chǔ)存也稱為分布式文件系統(tǒng),它們一般都會(huì)有文件系統(tǒng)接口,可以直接掛載。通用分布式儲(chǔ)存有mogilefs、fastdfs等,專用分布式儲(chǔ)存系統(tǒng)有moosefs等。
二、Mogilefs
MogileFS是一個(gè)開(kāi)源的分布式文件存儲(chǔ)系統(tǒng),MogileFS適用于存儲(chǔ)海量小文件的工作場(chǎng)景,由LiveJournal旗下的Danga Interactive公司開(kāi)發(fā),該團(tuán)隊(duì)開(kāi)發(fā)了包括 Memcached、MogileFS、Perlbal 等多個(gè)知名的開(kāi)源項(xiàng)目。
1.Mogilefs架構(gòu)圖:
2.組成Mogliefs的組件:
1.Trackers(mogilefsd):Mogliefs的核心組件,主要功能是(Replication)節(jié)點(diǎn)文件復(fù)制、(Deletion)文件刪除、(Query)元數(shù)據(jù)查詢、(Monitor)健康監(jiān)測(cè)、(Reaper)儲(chǔ)存失敗重置等等。它通常稱為元數(shù)據(jù)服務(wù)器,但它不會(huì)去儲(chǔ)存元數(shù)據(jù),而是將元數(shù)據(jù)儲(chǔ)存在如MySQL這一類的數(shù)據(jù)庫(kù)中。為保證架構(gòu)的可靠性,Trackers一般有多個(gè)。Trackers可看作是一個(gè)旁掛式代理,只負(fù)責(zé)處理元數(shù)據(jù)信息。
2.數(shù)據(jù)庫(kù):數(shù)據(jù)庫(kù)用來(lái)存放Mogliefs的元數(shù)據(jù),而由Trackers來(lái)管理數(shù)據(jù)。因此通常建議做HA。
3.mogstored(儲(chǔ)存節(jié)點(diǎn)):實(shí)際文件存放的地方。通常會(huì)將實(shí)際文件保存至少兩份副本。
3.示例演示拓?fù)鋱D
在三個(gè)節(jié)點(diǎn)同時(shí)安裝Trackers和mogstored,選擇其中一個(gè)節(jié)點(diǎn)安裝MySQL。在生產(chǎn)環(huán)境最好是能單獨(dú)將MySQL部署并且做主從復(fù)制。Trackers和mogstored也可以分開(kāi)部署在不同節(jié)點(diǎn)上,這些都需要根據(jù)實(shí)際的生產(chǎn)環(huán)境來(lái)決定。這里主要是演示mogilefs,不做MySQL主從復(fù)制演示。若想要Mogilefs能掛載,可以用FUSE來(lái)實(shí)現(xiàn)。
需要注意的是:mogilefs存儲(chǔ)的文件URL很特殊(后面會(huì)解釋mogilefs文件名生產(chǎn)的過(guò)程),如存儲(chǔ)一張圖片時(shí)文件URL可能會(huì)是類似6060/0000/0000/0000/00000021.jpg這樣的格式,對(duì)用戶來(lái)講就不太友好,用戶可能需要直觀的類似image.hello.com/21.jpg這樣的URL。所以通常會(huì)使用Nginx來(lái)反代Mogilefs。
4.系統(tǒng)環(huán)境與安裝
Mogilefs是一個(gè)相對(duì)較年代較久但成熟的分布式儲(chǔ)存,考慮到可能在Centos7上會(huì)出現(xiàn)兼容問(wèn)題,這里Centos6來(lái)演示。
操作系統(tǒng):CentOS release 6.6
Mogilefs:2.46
nginx:1.10
mysql:5.1
IP分配:
n1:192.168.29.111,n2:192.168.29.112,n3:192.168.29.113,n4:192.168.29.114
結(jié)構(gòu)如上圖所示。
1.在n1節(jié)點(diǎn)上安裝MySQL、mogilefsd、mogstored,并將n1配置為T(mén)rackers、Storage Node
MySQL直接用yum安裝。
~]# yum install -y mysql mysql-server
安裝Mogilefs的Trackers和Storage Node組件,安裝時(shí)一定要安裝Perl相關(guān)的依賴包,依賴包有:
perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm
perl-IO-stringy-2.110-1.2.el6.rfx.noarch.rpmperl-Net-Netmask-1.9015-8.el6.noarch.rpm
Perlbal-1.78-1.el6.noarch.rpmperl-Perlbal-1.78-1.el6.noarch.rpm
Perlbal-doc-1.78-1.el6.noarch.rpmperl-IO-AIO-3.71-2.el6.x86_64.rpm
上述依賴包一定要安裝后才能安裝Mogilefs。安裝組件:
yum install -y MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm MogileFS-Server-2.46-2.el6.noarch.rpm
配置MogileFS-Server-mogilefsd:
~]# vim /etc/mogilefs/mogilefsd.conf #Mogilfs Trackers的主配置文件
# Enable daemon mode to work in background and use syslog
daemonize = 1 #是否以守護(hù)進(jìn)程的方式運(yùn)行。
# Where to store the pid of the daemon (must be the same in the init script)
pidfile = /var/run/mogilefsd/mogilefsd.pid #pid文件路徑
# Database connection information
db_dsn = DBI:mysql:mogilefs:host=192.168.29.111 #數(shù)據(jù)庫(kù)的地址
db_user = moguser #配置數(shù)據(jù)庫(kù)的用戶名及密碼
db_pass = 123456
# IP:PORT to listen on for mogilefs client requests
listen = 0.0.0.0:7001 #監(jiān)聽(tīng)的地址與端口
# Optional, if you don't define the port above.
conf_port = 7001 #默認(rèn)端口
# Number of query workers to start by default.
query_jobs = 10 #查詢進(jìn)程數(shù)量
# Number of delete workers to start by default.
delete_jobs = 1
# Number of replicate workers to start by default.
replicate_jobs = 5
# Number of reaper workers to start by default.
# (you don't usually need to increase this)
reaper_jobs = 1
# Number of fsck workers to start by default.
# (these can cause a lot of load when fsck'ing)
#fsck_jobs = 1
# Minimum amount of space to reserve in megabytes
# default: 100
# Consider setting this to be larger than the largest file you
# would normally be uploading.
#min_free_space = 200
# Number of seconds to wait for a storage node to respond.
# default: 2
# Keep this low, so busy storage nodes are quickly ignored.
#node_timeout = 2
# Number of seconds to wait to connect to a storage node.
# default: 2
# Keep this low so overloaded nodes get skipped.
#conn_timeout = 2
# Allow replication to use the secondary node get port,
# if you have apache or similar configured for GET's
#repl_use_get_port = 1
修改完配置后,進(jìn)入數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)可以遠(yuǎn)程連接的root用戶,或者使用mogdbsetup初始化數(shù)據(jù)庫(kù):
mysql> GRANT ALL ON mogilefs.* TO 'moguser'@'192.168.29.%' IDENTIFIED BY '123456'; #創(chuàng)建用戶moguser,擁有管理mogilefs庫(kù)的所有權(quán)限,并允許192.168.29.*的用戶遠(yuǎn)程連接。
mysql> FLUSH PRIVILEGES;
mysql> quit
~]# mogdbsetup --dbhost=127.0.0.1 --dbuser=moguser --dbpass=123456
初始化完成后可以在MySQL中看到創(chuàng)建好的mogilefs庫(kù)以及里面的表:
啟動(dòng)mogilefs并確認(rèn)7001端口處于監(jiān)聽(tīng)狀態(tài):
~]# service mogilefsd start
Starting mogilefsd [ OK ]
~]# ss -lnt
注:可以在n2、n3節(jié)點(diǎn)都安裝Trackers服務(wù),從而消除單點(diǎn)故障風(fēng)險(xiǎn)也能平均I/O壓力。
3.在n1上配置Storage Node
Storage Node配置文件路徑為/etc/mogilefs/mogstored.conf:
~]# vim /etc/mogilefs/mogstored.conf
maxconns = 10000 #最大并發(fā)連接數(shù)
httplisten = 0.0.0.0:7500 #Mogilefs數(shù)據(jù)的傳輸是通過(guò)http協(xié)議實(shí)現(xiàn)的,這里是監(jiān)聽(tīng)的地址和端口
mgmtlisten = 0.0.0.0:7501 #健康監(jiān)測(cè)的監(jiān)聽(tīng)地址和端口
docroot = /mogliefs/mogdata #數(shù)據(jù)的存儲(chǔ)路徑,目錄的屬組和屬主必須是mogilefs
創(chuàng)建數(shù)據(jù)存儲(chǔ)目錄并修改屬組和屬主為mogilefs:
~]# mkdir -pv /mogliefs/mogdata
~]# chown -R mogilefs.mogilefs /mogliefs/
啟動(dòng)mogstored,查看進(jìn)程是否正常啟動(dòng)端口是否監(jiān)聽(tīng):
~]# service mogstored start
~]# ss -lnt #監(jiān)聽(tīng)端口為7500、7501
4.按照n1的步驟在節(jié)點(diǎn)n2、n3上安裝Mogilefs,并將n1上的配置文件復(fù)制到n2、n3。
~]# scp /etc/mogilefs/*.conf root@192.168.29.112:/etc/mogilefs/
~]# scp /etc/mogilefs/*.conf root@192.168.29.113:/etc/mogilefs/
啟動(dòng)mogstored服務(wù)并確認(rèn)監(jiān)聽(tīng):
~]# service mogstored start
~]# ss -lnt #監(jiān)聽(tīng)端口為7500、7501
5.用在n1上用mogadm命令將所有節(jié)點(diǎn)整合成集群。
添加存儲(chǔ)節(jié)點(diǎn),并檢查:
1 ~]# mogadm host add 192.168.29.111 --ip=192.168.29.111 --port=7500 --status=alive
2 ~]# mogadm host add 192.168.29.112 --ip=192.168.29.112 --port=7500 --status=alive
3 ~]# mogadm host add 192.168.29.113 --ip=192.168.29.113 --port=7500 --status=alive
若想讓mogilefs集群中的存儲(chǔ)被識(shí)別成不同設(shè)備,需要在創(chuàng)建的/mogliefs/mogdata目錄下再創(chuàng)建名為dev*的目錄,使每個(gè)節(jié)點(diǎn)被當(dāng)做存儲(chǔ)設(shè)備使用。mogilefs是將冗余存儲(chǔ)在不同設(shè)備中的,每一個(gè)節(jié)點(diǎn)都應(yīng)該被識(shí)別為不同的設(shè)備。
在n1、n2、n3上的/mogliefs/mogdata/目錄下分別創(chuàng)建dev1,dev2,dev3目錄,并在Trackers上添加設(shè)備:
1 ~]# mogadm device add 192.168.29.111 1
2 ~]# mogadm device add 192.168.29.112 2
3 ~]# mogadm device add 192.168.29.113 3
6.創(chuàng)建Domain和Class
在Mogilefs中,在多個(gè)節(jié)點(diǎn)上為了方便文件副本管理,通常在設(shè)備中不會(huì)以文件為單位進(jìn)行管理,而是以class(類)做管理,復(fù)制刪除等操作都是以class為最小單位進(jìn)行的。每個(gè)class中可以放很多文件,class的容積也不是固定的。
在Mogilefs的存儲(chǔ)空間中,所有數(shù)據(jù)文件都在同一平面,所以不能有同名的情況發(fā)生,這樣會(huì)影響Mogilefs的靈活性,所以引入了Domain(名稱空間)的概念。Domain包含Class,在不同的Domain中可以有相同的文件名。
~]# mogadm domain add imgs #創(chuàng)建名為imgs的Domain
~]# mogadm domain add text #創(chuàng)建名為text的Domain
~]# mogadm domain list #查看Domain list
可以自定義Class的屬性,格式為:mogadm class add <domain> <class> [opts]
~]# mogadm class add imgs png --mindevcount=3 --hashtype=MD5 #在Domain imgs中定義名為png的class,在不同設(shè)備中復(fù)制3份,并用MD5做校驗(yàn)
~]# mogadm class add imgs jpg --mindevcount=3 --hashtype=MD5 #在Domain imgs中定義名為jpg的class,在不同設(shè)備中復(fù)制3份,并用MD5做校驗(yàn)
~]# mogadm domain list
7.使用Mogilefs做上傳下載測(cè)試
Mogilefs可以用自建的API接口進(jìn)行交互,其中有很多用于管理存儲(chǔ)數(shù)據(jù)的命令。例如上傳數(shù)據(jù)命令為mogupload,查看數(shù)據(jù)命令為mogfileinfo等。
例:測(cè)試將文件/test/123.png上傳至Mogilefs集群(文件事先在本地準(zhǔn)備好):
~]# mogupload --trackers=192.168.29.111 --domain=imgs --class=png --key='/111.png' --file='/test/123.png' #通過(guò)IP為192.168.29.111的Trackers將123.png文件上傳,并保存至Domain為imgs,Class為png的空間中,并重命名為111.png
~]# mogfileinfo --trackers=192.168.29.111 --domain=imgs --class=png --key='/111.png' #查看Domain為imgs,Class為png中key為111.png的文件的存儲(chǔ)情況。
至此,Mogilefs分布式儲(chǔ)存集群就搭建完成了,但若想要使客戶端能與之通信,就需要在接口上進(jìn)行編程,這樣就很麻煩了,好在我們能用Nginx做反代進(jìn)行通信。下面來(lái)演示Nginx反代Mogilefs的步驟。
5.Nginx反代Mogilefs
1.打開(kāi)n2,n3的mogilefsd服務(wù),將3個(gè)節(jié)點(diǎn)全部設(shè)置為T(mén)rackers(保證配置文件與n1相同):
~]# service mogilefsd start
2.在n4節(jié)點(diǎn)編譯安裝Nginx
安裝依賴包:
~]# yum install gcc gcc-c++ perl pcre-devel openssl openssl-devel
下載Nginx編譯安裝包nginx-1.10.3.tar.gz與Nginx_Mogilefs模塊nginx_mogilefs_module-1.0.4.tar.gz并展開(kāi):
~]# ls
nginx-1.10.3 nginx_mogilefs_module-1.0.4
nginx-1.10.3.tar.gz nginx_mogilefs_module-1.0.4.tar.gz
~]# cd nginx-1.10.3
./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/ #一定記得添加Mogilefs模塊所在的路徑,不可少。
添加nginx用戶并啟動(dòng)nginx:
~]# useradd -s /sbin/nologin -M nginx
~]# /usr/sbin/nginx
3.配置Nginx
單Trackers示例:
location /imgs/ {
mogilefs_tracker 192.168.29.111:7001; #單Trackers示例
mogilefs_domain imgs; #指定Domain
mogilefs_class png jpg; #指定Class
mogilefs_pass { #傳輸相關(guān)配置
proxy_pass $mogilefs_path;
proxy_hide_header Content-Type;
proxy_buffering off;
}
}
多Trackers示例:
在nginx配置中的http配置段添加調(diào)度模塊:
1 upstream mogsvr {
2 server 192.168.29.111:7001;
3 server 192.168.29.112:7001;
4 server 192.168.29.113:7001;
5 }
在nginx配置中的server配置段添:
location /imgs/ {
mogilefs_tracker mogsvr;
mogilefs_domain imgs;
mogilefs_class png jpg;
mogilefs_pass {
proxy_pass $mogilefs_path;
proxy_hide_header Content-Type;
proxy_buffering off;
}
}
重新啟動(dòng)nginx,并通過(guò)nginx訪問(wèn)之前上傳的圖片:
總結(jié):
在上傳文件時(shí)遇到一個(gè)錯(cuò)誤提示MogileFS::Backend: couldn't connect to mogilefsdbackend at /usr/local/share/perl/5.8.4/Client.pm line 282,這是由于mogilefsd服務(wù)于MySQL無(wú)法連接造成的,檢查它們之間的連接情況就能發(fā)現(xiàn)錯(cuò)誤所在。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。