分布式存儲已經(jīng)研究很多年,但直到近年來婆瓜,伴隨著谷歌笑陈、亞馬遜和阿里等互聯(lián)網(wǎng)公司云計算和大數(shù)據(jù)應(yīng)用的興起际度,它才大規(guī)模應(yīng)用到工程實(shí)踐中。如谷歌的分布式文件系統(tǒng)GFS涵妥、分布式表格系統(tǒng)google Bigtable乖菱,亞馬遜的對象存儲AWS,阿里的TFS等都是很好的代表,同時也催生了一大批優(yōu)秀的開源分布式存儲系統(tǒng)窒所,包括ceph鹉勒、swift、Lustre和glusterfs等吵取。
分布式存儲系統(tǒng)
分布式存儲按其存儲接口分為三種:文件存儲禽额、塊存儲和對象存儲。
文件存儲
通常支持POSIX接口(如glusterfs海渊,但GFS绵疲、HDFS是非POSIX接口的)哲鸳,可以像普通文件系統(tǒng)(如ext4)那樣訪問臣疑,但又比普通文件系統(tǒng)多了并行化訪問的能力和冗余機(jī)制。主要的分布式文件存儲系統(tǒng)有TFS徙菠、cephfs讯沈、glusterfs和HDFS等。主要存儲非結(jié)構(gòu)化數(shù)據(jù)婿奔,如普通文件缺狠、圖片、音視頻等萍摊〖非眩可以采用NFS和CIFS等協(xié)議訪問,共享方便冰木。NAS是文件存儲類型穷劈。
塊存儲
這種接口通常以QEMU Driver或者Kernel Module的方式存在,主要通過qemu或iscsi協(xié)議訪問踊沸。主要的塊存儲系統(tǒng)有ceph塊存儲歇终、sheepdog等。主要用來存儲結(jié)構(gòu)化數(shù)據(jù)逼龟,如數(shù)據(jù)庫數(shù)據(jù)评凝。數(shù)據(jù)共享不方便。DAS和SAN都是塊存儲類型腺律。
對象存儲
對象存儲系統(tǒng)綜合了NAS和SAN的優(yōu)點(diǎn)奕短,同時具有SAN的高速直接訪問和NAS的數(shù)據(jù)共享等優(yōu)勢。以對象作為基本的存儲單元匀钧,向外提供RESTful數(shù)據(jù)讀寫接口翎碑,常以網(wǎng)絡(luò)服務(wù)的形式提供數(shù)據(jù)訪問。主要的對象存儲系統(tǒng)有AWS榴捡、swift和ceph對象存儲杈女。主要用來存儲非結(jié)構(gòu)化數(shù)據(jù)。
Glusterfs
Glusterfs是一個開源分布式文件系統(tǒng),具有強(qiáng)大的橫向擴(kuò)展能力达椰,可支持?jǐn)?shù)PB存儲容量和數(shù)千客戶端翰蠢,通過Infiniband RDMA 或Tcp/Ip 方式將許多廉價的x86 主機(jī),通過網(wǎng)絡(luò)互聯(lián)成一個并行的網(wǎng)絡(luò)文件系統(tǒng)啰劲。具有可擴(kuò)展性梁沧、高性能、高可用性等特點(diǎn)蝇裤。
GlusterFS采用可堆疊的用戶空間設(shè)計廷支,如圖所示:
glusterfs堆棧式結(jié)構(gòu)
Glusterfs是根據(jù)fuse提供的接口實(shí)現(xiàn)的一個用戶態(tài)的文件系統(tǒng),主要包括gluster栓辜、glusterd恋拍、glusterfs和glusterfsd四大模塊組成:
- gluster:是cli命令執(zhí)行工具,主要功能是解析命令行參數(shù)藕甩,然后把命令發(fā)送給glusterd模塊執(zhí)行施敢。
- glusterd:是一個管理模塊,處理gluster發(fā)過來的命令狭莱,處理集群管理僵娃、存儲池管理、brick管理腋妙、負(fù)載均衡默怨、快照管理等。集群信息骤素、存儲池信息和快照信息等都是以配置文件的形式存放在服務(wù)器中匙睹,當(dāng)客戶端掛載存儲時,glusterd會把存儲池的配置文件發(fā)送給客戶端谆甜。
- glusterfsd:是服務(wù)端模塊垃僚,存儲池中的每個brick都會啟動一個glusterfsd進(jìn)程。此模塊主要是處理客戶端的讀寫請求规辱,從關(guān)聯(lián)的brick所在磁盤中讀寫數(shù)據(jù)谆棺,然后返回給客戶端。
- glusterfs:是客戶端模塊罕袋,負(fù)責(zé)通過mount掛載集群中某臺服務(wù)器的存儲池改淑,以目錄的形式呈現(xiàn)給用戶。當(dāng)用戶從此目錄讀寫數(shù)據(jù)時浴讯,客戶端根據(jù)從glusterd模塊獲取的存儲池的配置文件信息朵夏,通過DHT算法計算文件所在服務(wù)器的brick位置,然后通過Infiniband RDMA 或Tcp/Ip 方式把數(shù)據(jù)發(fā)送給brick榆纽,等brick處理完仰猖,給用戶返回結(jié)果捏肢。存儲池的副本、條帶饥侵、hash鸵赫、EC等邏輯都在客戶端處理。
在使用glusterfs提供的存儲服務(wù)之前躏升,需要先掛載存儲池辩棒,向掛載點(diǎn)寫數(shù)據(jù),會經(jīng)過fuse內(nèi)核模塊傳給客戶端膨疏,客戶端檢查存儲池的類型一睁,然后計算數(shù)據(jù)所在服務(wù)器 ,最后通過socket或rdma與服務(wù)器通信佃却,如圖2所示:
Glusterfs作為一款開源的分布式文件系統(tǒng)者吁,在開源社區(qū)的活躍度很高,目前已經(jīng)被紅帽收購双霍,國內(nèi)外也有大量的用戶在研究和應(yīng)用砚偶,相關(guān)技術(shù)文檔很豐富。它并不完美洒闸,為了支持線性擴(kuò)展和高性能,而在小文件性能和元數(shù)據(jù)性能上做了讓步均芽,但卻可以滿足一定的場景丘逸,如大數(shù)據(jù)應(yīng)用和視頻存儲等。
接下來會從優(yōu)點(diǎn)和缺點(diǎn)兩方面入手來介紹glusterfs掀宋。
優(yōu)點(diǎn)
- 無元數(shù)據(jù)節(jié)點(diǎn)性能瓶頸
采用無中心對稱式架構(gòu)深纲,沒有專用的元數(shù)據(jù)服務(wù)器,也就不存在元數(shù)據(jù)服務(wù)器瓶頸劲妙。元數(shù)據(jù)存在于文件的屬性和擴(kuò)展屬性中湃鹊。當(dāng)需要訪問某文件時,客戶端使用DHT算法镣奋,根據(jù)文件的路徑和文件名計算出文件所在brick币呵,然后由客戶端從此brick獲取數(shù)據(jù),省去了同元數(shù)據(jù)服務(wù)器通信的過程侨颈。- 良好的可擴(kuò)展性
使用彈性hash算法代替?zhèn)鹘y(tǒng)的有元數(shù)據(jù)節(jié)點(diǎn)服務(wù)余赢,獲得了接近線性的高擴(kuò)展性。- 高可用
采用副本哈垢、EC等冗余設(shè)計妻柒,保證在冗余范圍內(nèi)的節(jié)點(diǎn)掉線時,仍然可以從其它服務(wù)節(jié)點(diǎn)獲取數(shù)據(jù)耘分,保證高可用性举塔。采用弱一致性的設(shè)計绑警,當(dāng)向副本中文件寫入數(shù)據(jù)時,客戶端計算出文件所在brick央渣,然后通過網(wǎng)絡(luò)把數(shù)據(jù)傳給所在brick待秃,當(dāng)其中有一個成功返回,就認(rèn)為數(shù)據(jù)成功寫入痹屹,不必等待其它brick返回章郁,就會避免當(dāng)某個節(jié)點(diǎn)網(wǎng)絡(luò)異常或磁盤損壞時因?yàn)橐粋€brick沒有成功寫入而導(dǎo)致寫操作等待志衍。
服務(wù)器端還會隨著存儲池的啟動暖庄,而開啟一個glustershd進(jìn)程,這個進(jìn)程會定期檢查副本和EC卷中各個brick之間數(shù)據(jù)的一致性楼肪,并恢復(fù)培廓。- 存儲池類型
豐富包括粗粒度、條帶春叫、副本肩钠、條帶副本和EC,可以根據(jù)用戶的需求暂殖,滿足不同程度的冗余价匠。粗粒度卷不帶任何冗余,文件不進(jìn)行切片呛每,是完整的存放在某個brick上踩窖。
條帶卷不帶任何冗余,文件會切片存儲(默認(rèn)大小為128kB)在不同的brick上晨横。這些切片可以并發(fā)讀寫(并發(fā)粒度是條帶塊)洋腮,可以明顯提高讀寫性能。該模式一般只適合用于處理超大型文件和多節(jié)點(diǎn)性能要求高的情況手形。
副本卷冗余度高啥供,副本數(shù)量可以靈活配置,可以保證數(shù)據(jù)的安全性库糠。
條帶副本卷是條帶卷和副本卷的結(jié)合伙狐。
EC卷使用EC校驗(yàn)算法,提供了低于副本卷的冗余度曼玩,冗余度小于100%鳞骤,滿足比較低的數(shù)據(jù)安全性,例如可以使2+1(冗余度為50%)黍判、5+3(冗余度為60%)等豫尽。這個可以滿足安全性要求不高的數(shù)據(jù)。- 高性能
采用弱一致性的設(shè)計顷帖,向副本中寫數(shù)據(jù)時美旧,只要有一個brick成功返回渤滞,就認(rèn)為寫入成功,不必等待其它brick返回榴嗅,這樣的方式比強(qiáng)一致性要快妄呕。
還提供了I/O并發(fā)、write-behind嗽测、read-ahead绪励、io-cache、條帶等提高讀寫性能的技術(shù)唠粥。并且這些都還可以根據(jù)實(shí)際需求進(jìn)行開啟/關(guān)閉疏魏,i/o并發(fā)數(shù)量,cache大小都可以調(diào)整晤愧。
缺點(diǎn)
- 擴(kuò)容大莫、縮容時影響的服務(wù)器較多
Glusterfs對邏輯卷中的存儲單元brick劃分hash分布空間(會以brick所在磁盤大小作為權(quán)重,空間總范圍為0至232-1)官份,一個brick占一份空間只厘,當(dāng)訪問某文件時,使用Davies-Meyer算法根據(jù)文件名計算出hash值舅巷,比較hash值落在哪個范圍內(nèi)羔味,即可確定文件所在的brick,這樣定位文件會很快悄谐。但是在向邏輯卷中添加或移除brick時介评,hash分布空間會重新計算,每個brick的hash范圍都會變化爬舰,文件定位就會失敗,因此需要遍歷文件寒瓦,把文件移動到正確的hash分布范圍對應(yīng)的brick上情屹,移動的文件可能會很多,加重系統(tǒng)負(fù)載杂腰,影響到正常的文件訪問操作垃你。- 遍歷目錄下文件耗時
1.Glusterfs沒有元數(shù)據(jù)節(jié)點(diǎn),而是根據(jù)hash算法來確定文件的分布喂很,目錄利用擴(kuò)展屬性記錄子卷的中brick的hash分布范圍惜颇,每個brick的范圍均不重疊。遍歷目錄時少辣,需要readdir子卷中每個brick中的目錄凌摄,獲取每個文件的屬性和擴(kuò)展屬性,然后進(jìn)行聚合漓帅,相對于有專門元數(shù)據(jù)節(jié)點(diǎn)的分布式存儲锨亏,遍歷效率會差很多痴怨,當(dāng)目錄下有大量文件時,遍歷會非常緩慢器予。
2.刪除目錄也會遇到同樣的問題浪藻。
3.目前提供的解決方法是合理組織目錄結(jié)構(gòu),目錄層級不要太深乾翔,目錄下文件數(shù)量不要太多爱葵,增大glusterfs目錄緩存。另外反浓,還可以設(shè)計把元數(shù)據(jù)和數(shù)據(jù)分離萌丈,把元數(shù)據(jù)放到內(nèi)存數(shù)據(jù)庫中(如redis、memcache),并在ssd上持久保存勾习。- 小文件性能較差
1.Glusterfs主要是為大文件設(shè)計浓瞪,如io-cache、read-ahead巧婶、write-behind和條帶等都是為優(yōu)化大文件訪問乾颁,對小文件的優(yōu)化很少。
2.Glusterfs采用無元數(shù)據(jù)節(jié)點(diǎn)的設(shè)計艺栈,文件的元數(shù)據(jù)和數(shù)據(jù)一起保存在文件中英岭,訪問元數(shù)據(jù)和數(shù)據(jù)的速率相同,訪問元數(shù)據(jù)的時間與訪問數(shù)據(jù)的時間比例會較大湿右,而有元數(shù)據(jù)中心的分布式存儲系統(tǒng)诅妹,對元數(shù)據(jù)服務(wù)器可以采用更快速的ssd盤,可以采用更大的元數(shù)據(jù)緩存等優(yōu)化措施來減小訪問元數(shù)據(jù)時間與訪問數(shù)據(jù)時間的比值毅人,來提高小文件性能吭狡。
3.Glusterfs在客戶端采用了元數(shù)據(jù)緩存md-cache來提高小文件性能,但是md-cache大小有限丈莺,但在海量小文件場景下划煮,緩存命中率會嚴(yán)重下降,優(yōu)化效果會減小缔俄,這就需要增大元數(shù)據(jù)緩存弛秋。
4.針對小文件性能差的問題,也可以參考TFS的做法俐载, TFS會將大量的小文件合并成一個大文件蟹略,這個大文件稱為Block,每個Block擁有在集群內(nèi)唯一的編號(Block Id)遏佣,Block Id在NameServer創(chuàng)建Block時分配挖炬,NameServer維護(hù)block與DataServer(存儲Block的實(shí)際數(shù)據(jù))的關(guān)系。