換個(gè)角度看GlusterFS分布式文件系統(tǒng)
GlusterFS(GNU ClusterFile System)是一個(gè)開源的分布式文件系統(tǒng),它的歷史可以追溯到2006年,最初的目標(biāo)是代替Lustre和GPFS分布式文件系統(tǒng)。經(jīng)過(guò)八年左右的蓬勃發(fā)展,GlusterFS目前在開源社區(qū)活躍度非常之高,這個(gè)后起之秀已經(jīng)儼然與Lustre、MooseFS、CEPH并列成為四大開源分布式文件系統(tǒng)。由于GlusterFS新穎和KISS(KeepIt as Stupid and Simple)的系統(tǒng)架構(gòu),使其在擴(kuò)展性、可靠性、性能、維護(hù)性等方面具有獨(dú)特的優(yōu)勢(shì),目前開源社區(qū)風(fēng)頭有壓倒之勢(shì),國(guó)內(nèi)外有大量用戶在研究、測(cè)試和部署應(yīng)用。
當(dāng)然,GlusterFS不是一個(gè)***的分布式文件系統(tǒng),這個(gè)系統(tǒng)自身也有許多不足之處,包括眾所周知的元數(shù)據(jù)性能和小文件問(wèn)題。沒(méi)有普遍適用各種應(yīng)用場(chǎng)景的分布式文件系統(tǒng),通用的意思就是通通不能用,四大開源系統(tǒng)不例外,所有商業(yè)產(chǎn)品也不例外。每個(gè)分布式文件系統(tǒng)都有它適用的應(yīng)用場(chǎng)景,適合的才是***的。這一次我們反其道而行之,不再談GlusterFS的各種優(yōu)點(diǎn),而是深入談?wù)凣lusterFS當(dāng)下的問(wèn)題和不足,從而更加深入地理解GlusterFS系統(tǒng),期望幫助大家進(jìn)行正確的系統(tǒng)選型決策和規(guī)避應(yīng)用中的問(wèn)題。同時(shí),這些問(wèn)題也是GlusterFS研究和研發(fā)的很好切入點(diǎn)。
1、元數(shù)據(jù)性能
GlusterFS使用彈性哈希算法代替?zhèn)鹘y(tǒng)分布式文件系統(tǒng)中的集中或分布式元數(shù)據(jù)服務(wù),這個(gè)是GlusterFS最核心的思想,從而獲得了接近線性的高擴(kuò)展性,同時(shí)也提高了系統(tǒng)性能和可靠性。GlusterFS使用算法進(jìn)行數(shù)據(jù)定位,集群中的任何服務(wù)器和客戶端只需根據(jù)路徑和文件名就可以對(duì)數(shù)據(jù)進(jìn)行定位和讀寫訪問(wèn),文件定位可獨(dú)立并行化進(jìn)行。
這種算法的特點(diǎn)是,給定確定的文件名,查找和定位會(huì)非常快。但是,如果事先不知道文件名,要列出文件目錄(ls或ls -l),性能就會(huì)大幅下降。對(duì)于Distributed哈希卷,文件通過(guò)HASH算法分散到集群節(jié)點(diǎn)上,每個(gè)節(jié)點(diǎn)上的命名空間均不重疊,所有集群共同構(gòu)成完整的命名空間,訪問(wèn)時(shí)使用HASH算法進(jìn)行查找定位。列文件目錄時(shí),需要查詢所有節(jié)點(diǎn),并對(duì)文件目錄信息及屬性進(jìn)行聚合。這時(shí),哈希算法根本發(fā)揮不上作用,相對(duì)于有中心的元數(shù)據(jù)服務(wù),查詢效率要差很多。
從我接觸的一些用戶和實(shí)踐來(lái)看,當(dāng)集群規(guī)模變大以及文件數(shù)量達(dá)到***別時(shí),ls文件目錄和rm刪除文件目錄這兩個(gè)典型元數(shù)據(jù)操作就會(huì)變得非常慢,創(chuàng)建和刪除100萬(wàn)個(gè)空文件可能會(huì)花上15分鐘。如何解決這個(gè)問(wèn)題呢?我們建議合理組織文件目錄,目錄層次不要太深,單個(gè)目錄下文件數(shù)量不要過(guò)多;增大服務(wù)器內(nèi)存配置,并且增大GlusterFS目錄緩存參數(shù);網(wǎng)絡(luò)配置方面,建議采用萬(wàn)兆或者InfiniBand。從研發(fā)角度看,可以考慮優(yōu)化方法提升元數(shù)據(jù)性能。比如,可以構(gòu)建全局統(tǒng)一的分布式元數(shù)據(jù)緩存系統(tǒng);也可以將元數(shù)據(jù)與數(shù)據(jù)重新分離,每個(gè)節(jié)點(diǎn)上的元數(shù)據(jù)采用全內(nèi)存或數(shù)據(jù)庫(kù)設(shè)計(jì),并采用SSD進(jìn)行元數(shù)據(jù)持久化。
2、小文件問(wèn)題
理論和實(shí)踐上分析,GlusterFS目前主要適用大文件存儲(chǔ)場(chǎng)景,對(duì)于小文件尤其是海量小文件,存儲(chǔ)效率和訪問(wèn)性能都表現(xiàn)不佳。海量小文件LOSF問(wèn)題是工業(yè)界和學(xué)術(shù)界公認(rèn)的難題,GlusterFS作為通用的分布式文件系統(tǒng),并沒(méi)有對(duì)小文件作額外的優(yōu)化措施,性能不好也是可以理解的。
對(duì)于LOSF而言,IOPS/OPS是關(guān)鍵性能衡量指標(biāo),造成性能和存儲(chǔ)效率低下的主要原因包括元數(shù)據(jù)管理、數(shù)據(jù)布局和I/O管理、Cache管理、網(wǎng)絡(luò)開銷等方面。從理論分析以及LOSF優(yōu)化實(shí)踐來(lái)看,優(yōu)化應(yīng)該從元數(shù)據(jù)管理、緩存機(jī)制、合并小文件等方面展開,而且優(yōu)化是一個(gè)系統(tǒng)工程,結(jié)合硬件、軟件,從多個(gè)層面同時(shí)著手,優(yōu)化效果會(huì)更顯著。GlusterFS小文件優(yōu)化可以考慮這些方法,這里不再贅述,關(guān)于小文件問(wèn)題請(qǐng)參考“海量小文件問(wèn)題綜述”一文。
3、集群管理模式
GlusterFS集群采用全對(duì)等式架構(gòu),每個(gè)節(jié)點(diǎn)在集群中的地位是完全對(duì)等的,集群配置信息和卷配置信息在所有節(jié)點(diǎn)之間實(shí)時(shí)同步。這種架構(gòu)的優(yōu)點(diǎn)是,每個(gè)節(jié)點(diǎn)都擁有整個(gè)集群的配置信息,具有高度的獨(dú)立自治性,信息可以本地查詢。但同時(shí)帶來(lái)的問(wèn)題的,一旦配置信息發(fā)生變化,信息需要實(shí)時(shí)同步到其他所有節(jié)點(diǎn),保證配置信息一致性,否則GlusterFS就無(wú)法正常工作。在集群規(guī)模較大時(shí),不同節(jié)點(diǎn)并發(fā)修改配置時(shí),這個(gè)問(wèn)題表現(xiàn)尤為突出。因?yàn)檫@個(gè)配置信息同步模型是網(wǎng)狀的,大規(guī)模集群不僅信息同步效率差,而且出現(xiàn)數(shù)據(jù)不一致的概率會(huì)增加。
實(shí)際上,大規(guī)模集群管理應(yīng)該是采用集中式管理更好,不僅管理簡(jiǎn)單,效率也高??赡苡腥藭?huì)認(rèn)為集中式集群管理與GlusterFS的無(wú)中心架構(gòu)不協(xié)調(diào),其實(shí)不然。GlusterFS 2.0以前,主要通過(guò)靜態(tài)配置文件來(lái)對(duì)集群進(jìn)行配置管理,沒(méi)有Glusterd集群管理服務(wù),這說(shuō)明glusterd并不是GlusterFS不可或缺的組成部分,它們之間是松耦合關(guān)系,可以用其他的方式來(lái)替換。從其他分布式系統(tǒng)管理實(shí)踐來(lái)看,也都是采用集群式管理居多,這也算一個(gè)佐證,GlusterFS 4.0開發(fā)計(jì)劃也表現(xiàn)有向集中式管理轉(zhuǎn)變的趨勢(shì)。
4、容量負(fù)載均衡
GlusterFS的哈希分布是以目錄為基本單位的,文件的父目錄利用擴(kuò)展屬性記錄了子卷映射信息,子文件在父目錄所屬存儲(chǔ)服務(wù)器中進(jìn)行分布。由于文件目錄事先保存了分布信息,因此新增節(jié)點(diǎn)不會(huì)影響現(xiàn)有文件存儲(chǔ)分布,它將從此后的新創(chuàng)建目錄開始參與存儲(chǔ)分布調(diào)度。這種設(shè)計(jì),新增節(jié)點(diǎn)不需要移動(dòng)任何文件,但是負(fù)載均衡沒(méi)有平滑處理,老節(jié)點(diǎn)負(fù)載較重。GlusterFS實(shí)現(xiàn)了容量負(fù)載均衡功能,可以對(duì)已經(jīng)存在的目錄文件進(jìn)行Rebalance,使得早先創(chuàng)建的老目錄可以在新增存儲(chǔ)節(jié)點(diǎn)上分布,并可對(duì)現(xiàn)有文件數(shù)據(jù)進(jìn)行遷移實(shí)現(xiàn)容量負(fù)載均衡。
GlusterFS目前的容量負(fù)載均衡存在一些問(wèn)題。由于采用Hash算法進(jìn)行數(shù)據(jù)分布,容量負(fù)載均衡需要對(duì)所有數(shù)據(jù)重新進(jìn)行計(jì)算并分配存儲(chǔ)節(jié)點(diǎn),對(duì)于那些不需要遷移的數(shù)據(jù)來(lái)說(shuō),這個(gè)計(jì)算是多余的。Hash分布具有隨機(jī)性和均勻性的特點(diǎn),數(shù)據(jù)重新分布之后,老節(jié)點(diǎn)會(huì)有大量數(shù)據(jù)遷入和遷出,這個(gè)多出了很多數(shù)據(jù)遷移量。相對(duì)于有中心的架構(gòu),可謂節(jié)點(diǎn)一變而動(dòng)全身,增加和刪除節(jié)點(diǎn)增加了大量數(shù)據(jù)遷移工作。GlusterFS應(yīng)該優(yōu)化數(shù)據(jù)分布,最小化容量負(fù)載均衡數(shù)據(jù)遷移。此外,GlusterFS容量負(fù)載均衡也沒(méi)有很好考慮執(zhí)行的自動(dòng)化、智能化和并行化。目前,GlusterFS在增加和刪除節(jié)點(diǎn)上,需要手工執(zhí)行負(fù)載均衡,也沒(méi)有考慮當(dāng)前系統(tǒng)的負(fù)載情況,可能影響正常的業(yè)務(wù)訪問(wèn)。GlusterFS的容量負(fù)載均衡是通過(guò)在當(dāng)前執(zhí)行節(jié)點(diǎn)上掛載卷,然后進(jìn)行文件復(fù)制、刪除和改名操作實(shí)現(xiàn)的,沒(méi)有在所有集群節(jié)點(diǎn)上并發(fā)進(jìn)行,負(fù)載均衡性能差。
5、數(shù)據(jù)分布問(wèn)題
Glusterfs主要有三種基本的集群模式,即分布式集群(Distributed cluster)、條帶集群(Stripe cluster)、復(fù)制集群(Replica cluster)。這三種基本集群還可以采用類似堆積木的方式,構(gòu)成更加復(fù)雜的復(fù)合集群。三種基本集群各由一個(gè)translator來(lái)實(shí)現(xiàn),分別由自己獨(dú)立的命名空間。對(duì)于分布式集群,文件通過(guò)HASH算法分散到集群節(jié)點(diǎn)上,訪問(wèn)時(shí)使用HASH算法進(jìn)行查找定位。復(fù)制集群類似RAID1,所有節(jié)點(diǎn)數(shù)據(jù)完全相同,訪問(wèn)時(shí)可以選擇任意個(gè)節(jié)點(diǎn)。條帶集群與RAID0相似,文件被分成數(shù)據(jù)塊以Round Robin方式分布到所有節(jié)點(diǎn)上,訪問(wèn)時(shí)根據(jù)位置信息確定節(jié)點(diǎn)。
哈希分布可以保證數(shù)據(jù)分布式的均衡性,但前提是文件數(shù)量要足夠多,當(dāng)文件數(shù)量較少時(shí),難以保證分布的均衡性,導(dǎo)致節(jié)點(diǎn)之間負(fù)載不均衡。這個(gè)對(duì)有中心的分布式系統(tǒng)是很容易做到的,但GlusteFS缺乏集中式的調(diào)度,實(shí)現(xiàn)起來(lái)比較復(fù)雜。復(fù)制卷包含多個(gè)副本,對(duì)于讀請(qǐng)求可以實(shí)現(xiàn)負(fù)載均衡,但實(shí)際上負(fù)載大多集中在***個(gè)副本上,其他副本負(fù)載很輕,這個(gè)是實(shí)現(xiàn)上問(wèn)題,與理論不太相符。條帶卷原本是實(shí)現(xiàn)更高性能和超大文件,但在性能方面的表現(xiàn)太差強(qiáng)人意,遠(yuǎn)遠(yuǎn)不如哈希卷和復(fù)制卷,沒(méi)有被好好實(shí)現(xiàn),連官方都不推薦應(yīng)用。
6、數(shù)據(jù)可用性問(wèn)題
副本(Replication)就是對(duì)原始數(shù)據(jù)的完全拷貝。通過(guò)為系統(tǒng)中的文件增加各種不同形式的副本,保存冗余的文件數(shù)據(jù),可以十分有效地提高文件的可用性,避免在地理上廣泛分布的系統(tǒng)節(jié)點(diǎn)由網(wǎng)絡(luò)斷開或機(jī)器故障等動(dòng)態(tài)不可測(cè)因素而引起的數(shù)據(jù)丟失或不可獲取。GlusterFS主要使用復(fù)制來(lái)提供數(shù)據(jù)的高可用性,通過(guò)的集群模式有復(fù)制卷和哈希復(fù)制卷兩種模式。復(fù)制卷是文件級(jí)RAID1,具有容錯(cuò)能力,數(shù)據(jù)同步寫到多個(gè)brick上,每個(gè)副本都可以響應(yīng)讀請(qǐng)求。當(dāng)有副本節(jié)點(diǎn)發(fā)生故障,其他副本節(jié)點(diǎn)仍然正常提供讀寫服務(wù),故障節(jié)點(diǎn)恢復(fù)后通過(guò)自修復(fù)服務(wù)或同步訪問(wèn)時(shí)自動(dòng)進(jìn)行數(shù)據(jù)同步。
一般而言,副本數(shù)量越多,文件的可靠性就越高,但是如果為所有文件都保存較多的副本數(shù)量,存儲(chǔ)利用率低(為副本數(shù)量分之一),并增加文件管理的復(fù)雜度。目前GlusterFS社區(qū)正在研發(fā)糾刪碼功能,通過(guò)冗余編碼提高存儲(chǔ)可用性,并且具備較低的空間復(fù)雜度和數(shù)據(jù)冗余度,存儲(chǔ)利用率高。
GlusterFS的復(fù)制卷以brick為單位進(jìn)行鏡像,這個(gè)模式不太靈活,文件的復(fù)制關(guān)系不能動(dòng)態(tài)調(diào)整,在已經(jīng)有副本發(fā)生故障的情況下會(huì)一定程度上降低系統(tǒng)的可用性。對(duì)于有元數(shù)據(jù)服務(wù)的分布式系統(tǒng),復(fù)制關(guān)系可以是以文件為單位的,文件的不同副本動(dòng)態(tài)分布在多個(gè)存儲(chǔ)節(jié)點(diǎn)上;當(dāng)有副本發(fā)生故障,可以重新選擇一個(gè)存儲(chǔ)節(jié)點(diǎn)生成一個(gè)新副本,從而保證副本數(shù)量,保證可用性。另外,還可以實(shí)現(xiàn)不同文件目錄配置不同的副本數(shù)量,熱點(diǎn)文件的動(dòng)態(tài)遷移。對(duì)于無(wú)中心的GlusterFS系統(tǒng)來(lái)說(shuō),這些看起來(lái)理所當(dāng)然的功能,實(shí)現(xiàn)起來(lái)都是要大費(fèi)周折的。不過(guò)值得一提的是,4.0開發(fā)計(jì)劃已經(jīng)在考慮這方面的副本特性。
7、數(shù)據(jù)安全問(wèn)題
GlusterFS以原始數(shù)據(jù)格式(如EXT4、XFS、ZFS)存儲(chǔ)數(shù)據(jù),并實(shí)現(xiàn)多種數(shù)據(jù)自動(dòng)修復(fù)機(jī)制。因此,系統(tǒng)***彈性,即使離線情形下文件也可以通過(guò)其他標(biāo)準(zhǔn)工具進(jìn)行訪問(wèn)。如果用戶需要從GlusterFS中遷移數(shù)據(jù),不需要作任何修改仍然可以完全使用這些數(shù)據(jù)。
然而,數(shù)據(jù)安全成了問(wèn)題,因?yàn)閿?shù)據(jù)是以平凡的方式保存的,接觸數(shù)據(jù)的人可以直接復(fù)制和查看。這對(duì)很多應(yīng)用顯然是不能接受的,比如云存儲(chǔ)系統(tǒng),用戶特別關(guān)心數(shù)據(jù)安全。私有存儲(chǔ)格式可以保證數(shù)據(jù)的安全性,即使泄露也是不可知的。GlusterFS要實(shí)現(xiàn)自己的私有格式,在設(shè)計(jì)實(shí)現(xiàn)和數(shù)據(jù)管理上相對(duì)復(fù)雜一些,也會(huì)對(duì)性能產(chǎn)生一定影響。
GlusterFS在訪問(wèn)文件目錄時(shí)根據(jù)擴(kuò)展屬性判斷副本是否一致,這個(gè)進(jìn)行數(shù)據(jù)自動(dòng)修復(fù)的前提條件。節(jié)點(diǎn)發(fā)生正常的故障,以及從掛載點(diǎn)進(jìn)行正常的操作,這些情況下發(fā)生的數(shù)據(jù)不一致,都是可以判斷和自動(dòng)修復(fù)的。但是,如果直接從節(jié)點(diǎn)系統(tǒng)底層對(duì)原始數(shù)據(jù)進(jìn)行修改或者破壞,GlusterFS大多情況下是無(wú)法判斷的,因?yàn)閿?shù)據(jù)本身也沒(méi)有校驗(yàn),數(shù)據(jù)一致性無(wú)法保證。
8、Cache一致性
為了簡(jiǎn)化Cache一致性,GlusterFS沒(méi)有引入客戶端寫Cache,而采用了客戶端只讀Cache。GlusterFS采用簡(jiǎn)單的弱一致性,數(shù)據(jù)緩存的更新規(guī)則是根據(jù)設(shè)置的失效時(shí)間進(jìn)行重置的。對(duì)于緩存的數(shù)據(jù),客戶端周期性詢問(wèn)服務(wù)器,查詢文件***被修改的時(shí)間,如果本地緩存的數(shù)據(jù)早于該時(shí)間,則讓緩存數(shù)據(jù)失效,下次讀取數(shù)據(jù)時(shí)就去服務(wù)器獲取***的數(shù)據(jù)。
GlusterFS客戶端讀Cache刷新的時(shí)間缺省是1秒,可以通過(guò)重新設(shè)置卷參數(shù)Performance.cache-refresh-timeout進(jìn)行調(diào)整。這意味著,如果同時(shí)有多個(gè)用戶在讀寫一個(gè)文件,一個(gè)用戶更新了數(shù)據(jù),另一個(gè)用戶在Cache刷新周期到來(lái)前可能讀到非***的數(shù)據(jù),即無(wú)法保證數(shù)據(jù)的強(qiáng)一致性。因此實(shí)際應(yīng)用時(shí)需要在性能和數(shù)據(jù)一致性之間進(jìn)行折中,如果需要更高的數(shù)據(jù)一致性,就得調(diào)小緩存刷新周期,甚至禁用讀緩存;反之,是可以把緩存周期調(diào)大一點(diǎn),以提升讀性能。