UCloud分布式文件系統(tǒng)產(chǎn)品架構(gòu)解析
UCloud存儲(chǔ)研發(fā)工程師鄧瑾首先就UCloud分布式文件系統(tǒng)產(chǎn)品架構(gòu)進(jìn)行了解析。
分布式文件系統(tǒng)簡(jiǎn)介
鄧瑾表示,分布式文件系統(tǒng)從概念上來(lái)說(shuō),就是經(jīng)典文件系統(tǒng)的一個(gè)延伸,通過(guò)一些分布式技術(shù),包括現(xiàn)在公有云的規(guī)模,帶來(lái)了傳統(tǒng)文件系統(tǒng)所不能達(dá)到的功能和特性。分布式文件系統(tǒng)的經(jīng)典能力,第一是Scale Out,這是分布式系統(tǒng)的經(jīng)典特性也是其基本門檻,Scale Out能在文件系統(tǒng)上帶來(lái)線性或者近線性的容量和性能的提升。第二,通過(guò)分布式技術(shù),依靠多副本、分布式協(xié)議、一致性協(xié)議,分布式系統(tǒng)可以提升單節(jié)點(diǎn)不能提供的高可用性和高可靠性,讓上層系統(tǒng)可以屏蔽硬件上的故障。第三,通過(guò)公有云廠商的規(guī)模效應(yīng),它能夠給應(yīng)用層的用戶提供比較低的TCO。
鄧瑾接著回顧了比較經(jīng)典的幾種系統(tǒng),他表示,最早期的分布式文件系統(tǒng)是谷歌File System,以及基于GFS開(kāi)發(fā)的一個(gè)開(kāi)源的文件系統(tǒng)HDFS,它是一種面向高吞吐場(chǎng)景的文件系統(tǒng),它還有一個(gè)特點(diǎn),就是它是一種索引,并且有一些管控節(jié)點(diǎn)是中心化的。
第二類系統(tǒng)是淘寶的TFS或者是Facebook的Haystack,它們是小文件的場(chǎng)景,而且是一類存放圖片的對(duì)象存儲(chǔ)系統(tǒng),一個(gè)圖片寫入之后就不會(huì)修改了。
第三類系統(tǒng)是GluesterFS和CephFS,它們的共同點(diǎn)是都是開(kāi)源的,設(shè)計(jì)理念是基于去中心化的,基于動(dòng)態(tài)算法來(lái)決定存儲(chǔ)系統(tǒng)的尋址,這也是大型系統(tǒng)比較流行的設(shè)計(jì)理念。
第四類是通用存儲(chǔ)系統(tǒng),一類是以微軟Azure Blob Storage為代表的,包括阿里的盤古也是這套系統(tǒng),它通過(guò)一個(gè)底層拓展性非常強(qiáng)的一個(gè)統(tǒng)一存儲(chǔ)的接口,來(lái)支撐上面不同的業(yè)務(wù),微軟的Blob Storage都是靠這套系統(tǒng)來(lái)支撐的。
第五類是一些比較特定場(chǎng)景下的文件系統(tǒng),它也是一種比較典型的設(shè)計(jì)理念,例如WAFL和PolarFS,它們都是為某些特定場(chǎng)景優(yōu)化的,PolarFS是阿里云的一款底層的存儲(chǔ)系統(tǒng),支持的就是PolarFS對(duì)底層系統(tǒng)的要求所具有的特定的一些特點(diǎn)。
鄧瑾還比較了對(duì)象存儲(chǔ)、KV和文件存儲(chǔ)三大類存儲(chǔ)系統(tǒng),他表示,對(duì)象存儲(chǔ)在設(shè)計(jì)上其實(shí)是比較簡(jiǎn)單的,它是一種immutable storage,寫一次后面再不會(huì)改,但是可以多次的讀,例如,S3,它天生基于面向Web的優(yōu)勢(shì),現(xiàn)在與CDN的結(jié)合,整個(gè)生態(tài)非常廣泛,應(yīng)用也非常廣泛。但是對(duì)一些傳統(tǒng)的應(yīng)用,它需要做改造,或者需要在客戶端上把這個(gè)API傳成對(duì)象存儲(chǔ)的API。對(duì)于傳統(tǒng)廠商,比如說(shuō)醫(yī)院的設(shè)備,就不太愿意做這個(gè)改造,對(duì)象存儲(chǔ)可能有一些劣勢(shì),但它的優(yōu)勢(shì)是文件大小沒(méi)有上限。
KV的特點(diǎn)就是面向一些遞延式場(chǎng)景,因?yàn)樗ǔ?huì)用于一些緩存場(chǎng)景,KV系統(tǒng)有非常多的變種,因此在KV選擇上提供了非常高的靈活性。但是一般來(lái)說(shuō),KV系統(tǒng)存儲(chǔ)容量不會(huì)太大,因?yàn)樗非蟾咝浴?/span>
文件存儲(chǔ)最大的優(yōu)勢(shì)是有一套通用的文件API,現(xiàn)在能夠比較接近模擬API的是NFS接口。文件存儲(chǔ)規(guī)??梢院艽螅谟脝螜C(jī)文件系統(tǒng)的時(shí)候,到TB級(jí)或者百TB級(jí)就會(huì)遇到瓶頸,這個(gè)瓶頸不僅是容量上的,還有處理能力上的。分布式文件系統(tǒng)系統(tǒng)主要致力于解決消除這些瓶頸,提供一個(gè)高可用的服務(wù)。
UFS發(fā)展歷程
鄧瑾表示,UFS是一個(gè)UCloud在前年開(kāi)始研發(fā)的一個(gè)完全自主研發(fā),面向公有云設(shè)計(jì)的一款分布式文件系統(tǒng),公有云產(chǎn)品有非常多的類型,因?yàn)橐恍┨囟ㄐ枨螅诠性茍?chǎng)景下,怎么把這些主機(jī)融入到分布式文件的訪問(wèn)客戶端之內(nèi),都在UCloud文件系統(tǒng)設(shè)計(jì)的范疇之內(nèi)。
從功能上來(lái)說(shuō),UFS現(xiàn)在支持V3和V4,2019年會(huì)支持Windows SMB系列,UFS的基本使命是給客戶提供高可用、高可靠的存儲(chǔ)服務(wù)。UCloud有一些比較典型的產(chǎn)品,這些產(chǎn)品與對(duì)象存儲(chǔ)、KV存儲(chǔ)有一些區(qū)別,它有四類場(chǎng)景,首先是容量型文件存儲(chǔ)類場(chǎng)景,即備份場(chǎng)景, 再就是數(shù)據(jù)分析類場(chǎng)景,像Hadoop數(shù)據(jù)分析平臺(tái),廣電的渲染,在高性能的文件存儲(chǔ)上都可以得到應(yīng)用。第三類就是數(shù)據(jù)共享。第四類對(duì)開(kāi)發(fā)者比較有用,適用于實(shí)現(xiàn)Layer storage,上層做一個(gè)中間層,冗余可以丟到下層,如果文件系統(tǒng)可以提供高可用、高可靠數(shù)據(jù)服務(wù)的話,甚至可以把它當(dāng)成一個(gè)選址服務(wù),這是對(duì)開(kāi)發(fā)人員比較大的支持。
鄧瑾表示,UFS的設(shè)計(jì)是利用開(kāi)源軟件GlusterFS快速在公有云環(huán)境中進(jìn)行產(chǎn)品原型驗(yàn)證,然后從運(yùn)營(yíng)角度積累分布式文件產(chǎn)品在多租戶的公有云環(huán)境中的痛點(diǎn)和難點(diǎn),進(jìn)行自研產(chǎn)品的設(shè)計(jì)改進(jìn),同時(shí)吸收社區(qū)經(jīng)驗(yàn),經(jīng)過(guò)這樣的過(guò)程,UFS 1.0誕生了。
1.0整體架構(gòu)
UFS 1.0首先是一個(gè)索引和數(shù)據(jù)分離的架構(gòu),它是對(duì)傳統(tǒng)文件系統(tǒng)一個(gè)最直接的延伸,它不采用中心節(jié)點(diǎn)存儲(chǔ)索引,而是直接把文件系統(tǒng)概念在分布式磁盤上模擬出來(lái)。另外,UFS 1.0的索引有一套索引管理系統(tǒng),有著自定義的索引結(jié)構(gòu)和語(yǔ)義,這將便于后續(xù)拓展非NFS協(xié)議。同時(shí),它還具有獨(dú)立設(shè)計(jì)的存儲(chǔ)服務(wù),并支持set管理、灰度等策略,還支持百萬(wàn)級(jí)大目錄和TB級(jí)文件大小,也支持QoS,對(duì)多租戶場(chǎng)景下用戶的訪問(wèn)也做了一些隔離。最后,相比GluserFS來(lái)說(shuō),UFS 1.0數(shù)據(jù)安全性較高。
上圖是UFS 1.0的整體架構(gòu),它有一個(gè)管理平面和一個(gè)數(shù)據(jù)平面,在數(shù)據(jù)平面,左邊是用戶訪問(wèn)入口,用戶在他自己的網(wǎng)絡(luò)專區(qū),會(huì)有自己的很多主機(jī),包括虛擬的云主機(jī),物理云主機(jī),托管云主機(jī)等等,都是通過(guò)VPC網(wǎng)絡(luò)來(lái)訪問(wèn)接入服務(wù),接入服務(wù)會(huì)通過(guò)UCloud的ULB負(fù)載均衡器,然后把流量導(dǎo)入接入服務(wù),接入服務(wù)就是圖上的NAS。
它的特點(diǎn)非常明確,是一個(gè)無(wú)狀態(tài)的服務(wù),包括NFS協(xié)議本身,這實(shí)際上是為了提升故障恢復(fù)的時(shí)候,客戶端的啟動(dòng)不需要去記憶一些信息。對(duì)比單機(jī)文件系統(tǒng),它也有兩類功能,一類是索引,包括尋址的功能,另一類就是數(shù)據(jù)訪問(wèn)操作,UFS 1.0把這兩類東西抽象成兩個(gè)部分,紫色部分叫system index,包括目錄索引,文件索引兩部分。下面是數(shù)據(jù)集群,存儲(chǔ)文件的數(shù)據(jù),在里面做一些多副本、高可靠、高可用的文件。
索引層
如下圖所示,在索引層主要就是模擬兩個(gè)概念,一個(gè)是目錄樹(shù),傳統(tǒng)文件系統(tǒng)一個(gè)比較大的特點(diǎn),就是它會(huì)有一段目錄樹(shù),在下圖右邊有一個(gè)DIAdex,把整個(gè)目錄樹(shù)模擬下來(lái)。左邊比較簡(jiǎn)單,它不會(huì)有層級(jí)結(jié)構(gòu),而是KV平臺(tái)的結(jié)構(gòu),它會(huì)把文件需要的一些屬性記錄下來(lái),這里最關(guān)鍵的是它跟下層的數(shù)據(jù)層會(huì)存在同一個(gè)鏈接中,這里會(huì)記一個(gè)FH,叫做文件距離。
這里面比較重要的一點(diǎn),是如果去做一個(gè)文件或者目錄索引,非常簡(jiǎn)單,就是實(shí)現(xiàn)一個(gè)文件和目錄操作就可以了。但是它面臨的一個(gè)很大的問(wèn)題,如何做到水平拓展?在多節(jié)點(diǎn)的操作上怎么保證原數(shù)據(jù)操作的一致性?因此,UFS 1.0會(huì)把它分成很多范圍,某個(gè)文件可能會(huì)在A節(jié)點(diǎn)上處理,某些文件在B節(jié)點(diǎn)上處理。因?yàn)樵诜植际较到y(tǒng)當(dāng)中,經(jīng)常會(huì)遇到宕機(jī),或者網(wǎng)絡(luò)導(dǎo)致的節(jié)點(diǎn)丟失,可能某個(gè)節(jié)點(diǎn)就沒(méi)法訪問(wèn)了,這時(shí)候就需要維護(hù)一個(gè)租約,這個(gè)租約會(huì)定期續(xù)約,保證系統(tǒng)對(duì)這個(gè)節(jié)點(diǎn)的某個(gè)范圍,或者某個(gè)文件有處理權(quán)限,當(dāng)失去這個(gè)租約的時(shí)候,必須把自己從集群當(dāng)中踢掉,否則會(huì)出現(xiàn)兩個(gè)節(jié)點(diǎn)都對(duì)同一個(gè)文件進(jìn)行操作,就會(huì)破壞后端文件系統(tǒng)的結(jié)構(gòu)。
USF 1.0就是靠這一套系統(tǒng)來(lái)實(shí)現(xiàn)了之前一些單機(jī)文件系統(tǒng)不能提供的一些功能,包括處理能力的線性拓展,因?yàn)楣?jié)點(diǎn)處理空間非常大,幾十萬(wàn)甚至上百萬(wàn)的節(jié)點(diǎn)對(duì)它進(jìn)行調(diào)度,也可以依賴它來(lái)實(shí)現(xiàn)一個(gè)大文件和大目錄的支持,這主要還是模擬單機(jī)文件系統(tǒng)的概念,UFS 1.0會(huì)把一個(gè)大文件分成很多二級(jí)或者三級(jí)的一小段一小段的數(shù)據(jù),存到這個(gè)索引中。
數(shù)據(jù)層
在數(shù)據(jù)層,一個(gè)文件存儲(chǔ)需要經(jīng)過(guò)以下過(guò)程,首先,用戶從主機(jī)發(fā)一段數(shù)據(jù)到NAS接入層,UFS 1.0會(huì)把流失的數(shù)據(jù),就是FH代表的文件,按4M進(jìn)行切分,每4M生成一個(gè)獨(dú)立的IO請(qǐng)求發(fā)往存儲(chǔ)層,存儲(chǔ)層會(huì)做一個(gè)模擬,把這4M進(jìn)行切分,切成64K。文件切分主要是考慮如果把一個(gè)大文件直接往存儲(chǔ)集群上落,磁盤空間可能會(huì)不足。因此,需要把它打散,打散有兩個(gè)好處,一是存儲(chǔ)會(huì)落在各個(gè)地方,IO比較平均,也不會(huì)有特別大的熱點(diǎn)。另外,這樣可以充分利用整個(gè)集群的容量。
之后在存儲(chǔ)層,會(huì)把整個(gè)集群分成很多個(gè),因?yàn)樗旧碛泻芏鄼C(jī)器,每個(gè)機(jī)器上有很多磁盤,UFS 1.0把每塊磁盤分成很多個(gè)chunk,把空間分散之后,還會(huì)帶來(lái)一個(gè)好處,當(dāng)發(fā)生某個(gè)chunk有熱點(diǎn)的時(shí)候,可以把它調(diào)到別的地方去,但如果chunk非常大,調(diào)度也沒(méi)有特別大的意義,所以要先做一個(gè)chunk切分,每個(gè)chunk有三個(gè)副本,這三個(gè)副本組成了chunk group。當(dāng)一個(gè)IO請(qǐng)求進(jìn)來(lái)的時(shí)候,這是一個(gè)最多4M的文件,會(huì)切成64K,每個(gè)64K會(huì)寫到某一個(gè)chunk group上,這64K就并發(fā)往這些chunk gourp上去寫。
下圖就是存儲(chǔ)層一個(gè)簡(jiǎn)單的模型,右邊藍(lán)色的就是多集群灰度管理的系統(tǒng),它可以暴露給前端業(yè)務(wù),說(shuō)明有多少集群可用。紫色的index是記錄4MB分片切成64K的一個(gè)對(duì)應(yīng)關(guān)系,為什么要存這個(gè)呢?因?yàn)楸仨氁肋@個(gè)64K是存在哪個(gè)chunk的,通過(guò)查詢它在哪個(gè)chunk,再去定位到真正的chunk所在的三個(gè)副本當(dāng)中的任意一臺(tái)機(jī)器。
UFS 1.0的局限
鄧瑾介紹,UFS 1.0運(yùn)營(yíng)了一段時(shí)間后,發(fā)現(xiàn)這個(gè)存儲(chǔ)模型,因?yàn)橹С諲AS的一些隨機(jī)或者覆蓋寫引入小分片的概念,但這個(gè)分片太小了,導(dǎo)致存儲(chǔ)層那邊很難模擬一個(gè)超大文件。 然后就是底層的存儲(chǔ),它是一個(gè)固定的64K,不管寫不寫滿64K,都要占用64K,這在規(guī)模很大的時(shí)候,會(huì)形成一定的空間浪費(fèi)。第三是存儲(chǔ)層支持的文件尺度較小。第四就是對(duì)隨機(jī)寫的支持不夠,在做FIO,做4K這種寫的時(shí)候會(huì)發(fā)現(xiàn)延時(shí)會(huì)比較高。
UFS 2.0存儲(chǔ)架構(gòu)
針對(duì)UFS 1.0的局限,UCloud進(jìn)行了2.0架構(gòu)的升級(jí),主要對(duì)存儲(chǔ)層進(jìn)行了優(yōu)化,優(yōu)化不僅僅針對(duì)NAS服務(wù),而是進(jìn)行了面向統(tǒng)一存儲(chǔ)場(chǎng)景的整體設(shè)計(jì)和優(yōu)化,它支持超大文件,冗余機(jī)制也更靈活,同時(shí),它通過(guò)與新硬件和軟件技術(shù)棧的結(jié)合來(lái)實(shí)現(xiàn)低延時(shí)高性能的場(chǎng)景。
Append-only模型
在底層的Stream layer,是真正的統(tǒng)一存儲(chǔ)的概念。每個(gè)存儲(chǔ)的文件,稱為Stream,每個(gè)Stream是永遠(yuǎn)可以追加寫的,但是它分成了很多小分片,叫做Extent,UFS 2.0把這個(gè)Stream切成了一大段一大段很大的Extent,而且只有最后一個(gè)Extent是可以進(jìn)行追加寫的,中間一旦寫完之后就再也不能改變。它帶來(lái)的好處,是這種模型非常簡(jiǎn)單,不會(huì)擔(dān)心數(shù)據(jù)篡改或者曾經(jīng)寫過(guò)的數(shù)據(jù)被覆蓋掉,或者沒(méi)有辦法回軌,因?yàn)锳ppend-only可以很好模擬快照功能,有整個(gè)操作的歷史記錄。每個(gè)Extent被分配三個(gè)或者N個(gè)多副本,會(huì)滿足一定容災(zāi)的要求,來(lái)保證副本的高可用。
每個(gè)Extent是以文件的形式落在存儲(chǔ)介質(zhì)上,文件可能會(huì)比較大,現(xiàn)在是4GB一個(gè)Extent。用戶在寫的時(shí)候是以Block為單位,往Extent上面追加,這個(gè)Block是不固定的,每次往里面追加寫之后,Extent覺(jué)得達(dá)到一定的量就可以關(guān)掉,再新開(kāi)一個(gè),這即是Append-only整個(gè)的模型。
數(shù)據(jù)層
Append-only模型里有幾個(gè)模塊,綠色的streamsvr,它管理Stream的功能,做Stream的創(chuàng)建,分配副本,副本所在的位置等。它會(huì)把原數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)當(dāng)中,Streamsvr會(huì)有一個(gè)master對(duì)外提供服務(wù)。Extentsvr做一些數(shù)據(jù)的持久化。
Extentsvr的存儲(chǔ)引擎設(shè)計(jì)有兩個(gè)功能,一是消除寫入毛刺,另一個(gè)是功能持久化一些還沒(méi)有落地的索引更新或者是更新操作。數(shù)據(jù)來(lái)了之后,會(huì)先落,然后更新,把它放在內(nèi)存里,這個(gè)時(shí)候就可以返回成功了,業(yè)務(wù)側(cè)就可以收到,進(jìn)行訪問(wèn)。FileLayer的機(jī)器是高內(nèi)存的,可以對(duì)數(shù)據(jù)進(jìn)行緩存,它可以把整個(gè)熱點(diǎn)給打散,降低單節(jié)點(diǎn)訪問(wèn)壓力以及數(shù)據(jù)讀取的毛刺。FileLayer還把整個(gè)底層Stream提供的存儲(chǔ)空間切分成很多個(gè)數(shù)據(jù)單元,以便于做負(fù)載均衡。
針對(duì)隨機(jī)寫,依然是利用底層的方式,把數(shù)據(jù)先追加下去,追加是追加在Date Uint(DU)提供的文件上,這樣就可以直接反饋給用戶這個(gè)隨機(jī)寫完成了,而不需要去讀老數(shù)據(jù)進(jìn)行合并。帶來(lái)的開(kāi)銷可以通過(guò)軟件方法去優(yōu)化它。此外,針對(duì)沒(méi)有辦法結(jié)束對(duì)DU寫的問(wèn)題,會(huì)對(duì)數(shù)據(jù)進(jìn)行分片,每個(gè)分片的最小顆粒度是100GB,每個(gè)DU只有一個(gè)fserver進(jìn)行處理,從而實(shí)現(xiàn)隨機(jī)寫邏輯。
分布式存儲(chǔ)中的數(shù)據(jù)分布算法
奧思數(shù)據(jù)創(chuàng)始人兼CTO李明宇則具體講解了分布式存儲(chǔ)中的數(shù)據(jù)分布算法,他的講解分為四部分:一致性哈希算法及其在實(shí)際應(yīng)用中遇到的挑戰(zhàn)、典型的“存儲(chǔ)區(qū)塊鏈”中的數(shù)據(jù)分布算法、典型的企業(yè)級(jí)分布式存儲(chǔ)中的數(shù)據(jù)分布算法以及比較和總結(jié)。
一致性哈希算法及其在實(shí)際應(yīng)用中遇到的挑戰(zhàn)
李明宇表示,常見(jiàn)的在分布式系統(tǒng)中的數(shù)據(jù)分布式算法,就是一致性哈希算法,一致性哈希算法在實(shí)際應(yīng)用中會(huì)遇到很多挑戰(zhàn),一方面是應(yīng)用在云存儲(chǔ)或者企業(yè)級(jí)存儲(chǔ)里面的挑戰(zhàn)。另外就是在比較新的一些研究方向,比如說(shuō)區(qū)塊鏈或者區(qū)塊鏈存儲(chǔ)等的方面,也會(huì)遇到一些挑戰(zhàn)。
哈希表及其在分布式系統(tǒng)中的問(wèn)題
如果用一致性哈希做數(shù)據(jù)分布,經(jīng)常會(huì)用到數(shù)據(jù)結(jié)構(gòu)是哈希表,哈希表是把一個(gè)空間劃成N個(gè)區(qū)域,比方有一個(gè)字符串,假如這個(gè)字符串是一個(gè)文件名,根據(jù)這串字符串,會(huì)得到一個(gè)哈?!,F(xiàn)在假如說(shuō)有八個(gè)存儲(chǔ)位置,那么,這些數(shù)據(jù)會(huì)放在哪個(gè)存儲(chǔ)位置呢?哈希算法正是有著這樣的作用,因?yàn)楣>哂蟹浅:玫碾S機(jī)性,因此,通過(guò)哈希算法對(duì)文件的文件名字符串進(jìn)行哈希,就可以把這些數(shù)據(jù)均勻地分布到六個(gè)設(shè)備上。
但這種算法看起來(lái)很好,卻會(huì)帶來(lái)一個(gè)問(wèn)題,因?yàn)樵诜植际酱鎯?chǔ)里面,隨著存儲(chǔ)的數(shù)據(jù)越來(lái)越多,系統(tǒng)可能就要擴(kuò)充節(jié)點(diǎn)。而這時(shí)如果用哈希算法來(lái)算,很多數(shù)據(jù)都需要重新去分布。而當(dāng)增加的節(jié)點(diǎn)越來(lái)越多時(shí),幾乎所有的數(shù)據(jù)都要去移動(dòng),數(shù)據(jù)遷移的開(kāi)銷是非常巨大的,系統(tǒng)將會(huì)無(wú)法承受。為了解決這個(gè)問(wèn)題,有人發(fā)明了一種算法,將存儲(chǔ)平面圈起來(lái),形成一個(gè)哈希圈,首尾相接,這樣就可以讓增加的數(shù)據(jù)更均勻的分布在設(shè)備上,而且不需要移動(dòng)太多數(shù)據(jù),比傳統(tǒng)的哈希表好很多。
但即使是這樣,如果需要增加一塊硬盤,還是要移動(dòng)很多數(shù)據(jù),為此,就引入了虛擬節(jié)點(diǎn)的概念,一塊盤不再對(duì)應(yīng)一個(gè)位置,而是對(duì)應(yīng)多個(gè)位置,這樣,從概率上,分布的均衡性就會(huì)好很多。此外,當(dāng)有硬盤出現(xiàn)故障需要退出時(shí),這種方法也會(huì)分散數(shù)據(jù)遷移的壓力,這就是一致性哈希算法。一致性哈希算法具有不需要查表或通信過(guò)程即可定位數(shù)據(jù),計(jì)算復(fù)雜度不隨數(shù)據(jù)量增長(zhǎng)而改變,效率高、均勻性好、增加/減少節(jié)點(diǎn)時(shí)數(shù)據(jù)遷移量小等優(yōu)點(diǎn),但在企業(yè)級(jí)IT和存儲(chǔ)區(qū)塊鏈場(chǎng)景,仍然面臨很大的挑戰(zhàn)。
企業(yè)存儲(chǔ)會(huì)用到一些方式,比方說(shuō)多副本,如果隨機(jī)找?guī)讉€(gè)位置去分布,很可能會(huì)造成副本落在同一臺(tái)服務(wù)器上的情況,這種情況,企業(yè)級(jí)IT是無(wú)法容忍的。還有在存儲(chǔ)區(qū)塊鏈場(chǎng)景下,它需要用到全球的資源,讓大家自發(fā)參與進(jìn)來(lái),組成一個(gè)跨全球的大的分布式存儲(chǔ)系統(tǒng),如果在這里面根本不知道有多少設(shè)備,也無(wú)法控制所有設(shè)備,如果來(lái)了一個(gè)存儲(chǔ)對(duì)象,算出了一個(gè)哈希值,就不會(huì)知道這個(gè)哈希值究竟會(huì)映射到哪個(gè)設(shè)備上,因?yàn)檫@個(gè)設(shè)備可能隨時(shí)出現(xiàn),隨時(shí)退出,是全球參與者自發(fā)參與的,無(wú)法控制。所以幾乎不可能獲得一個(gè)全局視圖,而且一致性哈希環(huán)中的設(shè)備是隨時(shí)都會(huì)發(fā)生變化的,甚至沒(méi)有一刻是穩(wěn)定的,這將帶來(lái)很大的問(wèn)題。
典型“存儲(chǔ)區(qū)塊鏈”中的數(shù)據(jù)分布算法
那么,存儲(chǔ)區(qū)塊鏈剛才說(shuō)的這種場(chǎng)景,應(yīng)該怎么解決?在此之前,首先需要清楚存儲(chǔ)區(qū)塊鏈的概念,它是分布式存儲(chǔ)或者去中心存儲(chǔ)或者P2P的存儲(chǔ)加上區(qū)塊鏈,它的目的是通過(guò)區(qū)塊鏈的機(jī)制,通過(guò)token的機(jī)理,鼓勵(lì)大家貢獻(xiàn)存儲(chǔ)資源,一起組成一個(gè)大的存儲(chǔ)系統(tǒng)。存儲(chǔ)區(qū)塊鏈的代表項(xiàng)目有Sia,Storj,IPFS+filecoin。
但如果是全球用戶自發(fā)參與,就沒(méi)有去中心化的存儲(chǔ)系統(tǒng)的尋址和路由的問(wèn)題,但因?yàn)閰⑴c者隨時(shí)可以加入和退出這個(gè)網(wǎng)絡(luò),就需要解決這個(gè)問(wèn)題,這在歷史上已經(jīng)有一些代表算法,比方說(shuō)Chord、Kademlia等等。
這些算法,實(shí)際上最根本的還是一致性哈希算法,Chord更難理解一些,如果有一個(gè)數(shù)據(jù)要存儲(chǔ),這個(gè)數(shù)據(jù)文件名是K,數(shù)據(jù)相當(dāng)于是V,整個(gè)P2P存儲(chǔ)網(wǎng)絡(luò)里面有一些節(jié)點(diǎn),這些節(jié)點(diǎn)算出來(lái)的哈希值是14、21、32、42等,如果算出來(lái)哈希值是10,它比8大,比14小,它就應(yīng)該順時(shí)針?lè)诺?和14之間的節(jié)點(diǎn)上,以此類推。在一個(gè)真正的P2P存儲(chǔ)網(wǎng)絡(luò)中,節(jié)點(diǎn)數(shù)量是眾多的,所以按照這樣順時(shí)針存,和一致性哈希沒(méi)有任何區(qū)別?,F(xiàn)在問(wèn)題是,在沒(méi)有任何節(jié)點(diǎn)知道到底有哪些節(jié)點(diǎn)參與到這個(gè)網(wǎng)絡(luò)中時(shí)到底應(yīng)該怎么辦?Chord采用的方法是,既然沒(méi)辦法維護(hù),就不維護(hù),如果有一個(gè)數(shù)據(jù),K就是其文件名,算出來(lái)的哈希值是54,那么,它先不管數(shù)據(jù)到底存在哪兒,首先和最近的一個(gè)節(jié)點(diǎn)比較哈希值,如果比臨近的大就繼續(xù)往下尋找,如果比自己的小,就存儲(chǔ)在該位置,并進(jìn)行反饋。這樣,新加的節(jié)點(diǎn)并不需要其他節(jié)點(diǎn)知道,因?yàn)樾录尤氲墓?jié)點(diǎn)會(huì)向周圍的節(jié)點(diǎn)去廣播自己的存在,按道理說(shuō),總有概率說(shuō)有些節(jié)點(diǎn)知道是新加入進(jìn)來(lái)的,這樣找下去,總是能找出來(lái)。
Chord
但這樣的算法非常低效,一圈下來(lái),延時(shí)很高。而降低這個(gè)延時(shí)有兩種辦法,一種辦法是多存幾份,降低延時(shí)的同時(shí)能提高可靠性,Chord中的一個(gè)最大的改進(jìn)是Finger table,它不僅僅記錄自己的下一個(gè)節(jié)點(diǎn),最臨近的節(jié)點(diǎn),還記錄自己的2的i次方加1的那個(gè)位置,這個(gè)i的最大值就取決于Finger table用幾位來(lái)表示產(chǎn)生的索引,所以它能夠記錄最臨近的,最遠(yuǎn)的,或者說(shuō)是一半遠(yuǎn)的,1/4遠(yuǎn)的,等等的節(jié)點(diǎn)。這樣的話,如果要搜索一個(gè)數(shù)據(jù),就沒(méi)有必要像剛才那樣挨個(gè)去找,可以直接進(jìn)行跳轉(zhuǎn),這樣就把計(jì)算復(fù)雜度降低了,這就是Chord算法。
Kademlia
在此基礎(chǔ)上還有另外一個(gè)算法,就是Kademlia,它跟Chord算法比起來(lái)有幾個(gè)不一樣的地方,首先計(jì)算距離的時(shí)候,并不是在用數(shù)值的大小去計(jì)算,而是用XOR計(jì)算,因此計(jì)算的復(fù)雜度就會(huì)降低。另外一方面,它設(shè)計(jì)了一個(gè)數(shù)據(jù)結(jié)構(gòu)叫做K-桶,比如當(dāng)前節(jié)點(diǎn)的id是0011,最近的節(jié)點(diǎn)是0010,所以它就用這種方式來(lái)表示距離,而在尋找的時(shí)候,其方法是與Chord算法是形同的。
另外與Chord相比,它支持并行搜索,這樣就解決了沒(méi)有全球視圖的問(wèn)題。因?yàn)椴恍枰莆杖值降子心男┕?jié)點(diǎn)參與的情況,每個(gè)節(jié)點(diǎn)都會(huì)周期性的向周圍發(fā)請(qǐng)求,如果有節(jié)點(diǎn)退出,就會(huì)被發(fā)現(xiàn)。如果有新節(jié)點(diǎn)加入,新加入的節(jié)點(diǎn)會(huì)往臨近節(jié)點(diǎn)廣播它的存在,所以也會(huì)被發(fā)現(xiàn),節(jié)點(diǎn)之間互相可以聯(lián)系上。
典型的企業(yè)級(jí)存儲(chǔ)中的數(shù)據(jù)分布算法
具體到企業(yè)級(jí)存儲(chǔ)里面,這個(gè)問(wèn)題變得更加復(fù)雜,關(guān)于企業(yè)級(jí)存儲(chǔ)中間典型的數(shù)據(jù)分布算法也有一些,比如像Dynamo里有Amazon,Ceph里有CRUSH的算法等等。這些算法都有一定的相似度,都是要對(duì)數(shù)據(jù)算哈希,對(duì)數(shù)據(jù)的K算哈希等等,然后再做映射關(guān)系。這些算法還引入了對(duì)數(shù)據(jù)中心物理拓?fù)涞慕?。比如Cluster Map,一個(gè)大的存儲(chǔ)集群,分幾個(gè)數(shù)據(jù)中心,每個(gè)數(shù)據(jù)中心下面可以再分zone,zone下面再分機(jī)柜,機(jī)柜下面再分節(jié)點(diǎn)等等,它會(huì)把這種拓?fù)浣Y(jié)構(gòu)給記錄下來(lái)。這樣的話,數(shù)據(jù)的分布就會(huì)根據(jù)Cluster Map分布到不同的故障域里面,這樣當(dāng)一個(gè)故障域出現(xiàn)問(wèn)題的時(shí)候,數(shù)據(jù)不會(huì)丟失,數(shù)據(jù)仍然可以訪問(wèn)。這些算法中還有對(duì)節(jié)點(diǎn)劃分的權(quán)重,數(shù)據(jù)分布和容量/性能匹配,輔助擴(kuò)容以及多種存儲(chǔ)策略選擇。
李明宇最后表示,歸根到底,各種算法的源頭都是一致性哈希,因?yàn)椴煌男枨?,有不同的改進(jìn)方向。企業(yè)級(jí)的更注重副本故障域的分布,對(duì)于P2P存儲(chǔ)更注重在節(jié)點(diǎn)隨時(shí)退出隨時(shí)加入的情況下,怎么樣保證數(shù)據(jù)能夠在有效時(shí)間內(nèi)尋址。
云硬盤架構(gòu)升級(jí)和性能提升
UCloud塊存儲(chǔ)研發(fā)工程師葉恒主要就云硬盤架構(gòu)升級(jí)和性能提升進(jìn)行了講解。
云硬盤架構(gòu)升級(jí)目標(biāo)
葉恒首先介紹了云硬盤架構(gòu)的升級(jí)目標(biāo),第一,解決老架構(gòu)不能充分使用后段硬件能力的弊端。第二,支持SSD云盤,提供QoS保證,可以用滿后端NVME物理盤的IOPS和帶寬性能,單個(gè)云盤可達(dá)2.4W IOPS。第三,充分降低熱點(diǎn)問(wèn)題。第四,支持超大容量盤,一個(gè)云硬盤可以支持32T,甚至可以做到無(wú)限擴(kuò)容。最后就是新架構(gòu)上線之后,怎么樣讓老架構(gòu)遷移到新架構(gòu)。
IO路徑優(yōu)化
而葉恒認(rèn)為要達(dá)成這樣的目標(biāo),首先需要對(duì)IO路徑進(jìn)行優(yōu)化。下圖是新老架構(gòu)的架構(gòu)圖,主要是IO路徑上的,左邊是舊架構(gòu),VM、Qamu,云硬盤是掛在虛機(jī)里面的,通過(guò)虛機(jī)來(lái)到Qamu的驅(qū)動(dòng),然后轉(zhuǎn)化到Client,Client之后會(huì)將IO轉(zhuǎn)到后端的存儲(chǔ)集群上,分兩層,第一層是proxy,IO的接入層,然后再分到chunk,就是讀寫一塊磁盤,后端的chunk是一個(gè)副本的形式。
而在新架構(gòu)中將IO的接入層去掉,直接將路由的功能做到client,直接連接到后端的存儲(chǔ)節(jié)點(diǎn)。這樣的話,在寫的時(shí)候,從client直接到chunk,因?yàn)槿北緝?nèi)容是完全一致的,讀只要讀主chunk就可以了。因此,讀路徑上就減少了一次網(wǎng)絡(luò)轉(zhuǎn)發(fā),相比于老架構(gòu)的話,由于軟件的升級(jí),隨機(jī)測(cè)下來(lái),寫延時(shí)也有所降低。
元數(shù)據(jù)優(yōu)化
在老架構(gòu)中,分片大小是1G,新架構(gòu)中,支持了1M大小的分片。1G的分片最多只能發(fā)揮一塊物理磁盤的性能,對(duì)于普通硬盤,它后端的存儲(chǔ)介質(zhì)是機(jī)械盤,性能有瓶頸。1M的分片會(huì)帶來(lái)很多好處,首先解決了熱點(diǎn)的問(wèn)題,還可以充分發(fā)揮后端集群性能,因?yàn)?M的分片,如果客戶的寫在1G的范圍內(nèi),端能用到1024的分片,整個(gè)集群的性能就會(huì)全部發(fā)揮出來(lái)。
在數(shù)據(jù)組織方式方面,在老架構(gòu)中,按索引的方式來(lái)組織元數(shù)據(jù),申請(qǐng)一塊云盤時(shí),所有元數(shù)據(jù)分配成功,并持久化到元數(shù)據(jù)模塊,掛載云盤時(shí),將所有元數(shù)據(jù)load到內(nèi)存中,后續(xù)IO訪問(wèn)直接從內(nèi)存獲取路由。這樣看起來(lái)似乎沒(méi)有什么問(wèn)題,但在并發(fā)創(chuàng)建和掛載的情況下,如果有幾千個(gè)盤同時(shí)掛載,如果按1G的分片,300G的云盤,300條的元數(shù)據(jù),按1M的分片,300G是30萬(wàn)條,它同時(shí)創(chuàng)建100塊300G的云盤,需要分配3千萬(wàn)條元數(shù)據(jù),掛載也是一樣的,同時(shí)要從元數(shù)據(jù)模塊加載3千萬(wàn)條數(shù)據(jù),這對(duì)元數(shù)據(jù)模塊的設(shè)計(jì)難度是極大的,它會(huì)成為一個(gè)瓶頸。
因此在設(shè)計(jì)過(guò)程中,考慮過(guò)多種方案,方案一仍然保持帶索引的存儲(chǔ)方式,但在創(chuàng)建的時(shí)候不分配,把元數(shù)據(jù)延時(shí)分配,只有當(dāng)云硬盤上某個(gè)分片上有讀寫的時(shí)候,才向元數(shù)據(jù)請(qǐng)求,這樣的IO延時(shí)分配,好像是能解決問(wèn)題。但如果這個(gè)時(shí)候用戶開(kāi)機(jī)了,幾千臺(tái)一起開(kāi)機(jī)創(chuàng)建好了,想做個(gè)測(cè)試,或者開(kāi)始用了,同時(shí)對(duì)這100塊300G的云盤做一個(gè)隨機(jī)的寫,隨機(jī)的寫會(huì)落到每個(gè)分片上去,這樣看,元數(shù)據(jù)模塊仍然是個(gè)瓶頸。
第二種方案,選用了一個(gè)一次性哈希,一個(gè)節(jié)點(diǎn)下線了,但是沒(méi)有機(jī)會(huì)去遷移或者分配到同一個(gè)故障率里面去,這時(shí)通過(guò)后端的chunk服務(wù),按三個(gè)三個(gè)一組,組成一個(gè)所謂的PG,PG就是備份組,將這個(gè)備份組作為物理節(jié)點(diǎn),因此,物理節(jié)點(diǎn)就不是一個(gè)存儲(chǔ)節(jié)點(diǎn)了,而是一組備份級(jí)。當(dāng)這個(gè)組作為物理節(jié)點(diǎn)插到這個(gè)環(huán)上之后,會(huì)作為虛節(jié)點(diǎn)放大,放大三、四千倍,保證這個(gè)環(huán)大概在幾十萬(wàn)左右,不能超過(guò)百萬(wàn),因?yàn)闃?gòu)建這個(gè)環(huán)需要時(shí)間,如果這個(gè)環(huán)太大,重啟時(shí)間就會(huì)過(guò)長(zhǎng)。而且這三個(gè)chunk也不是隨便寫三個(gè)chunk,按照容災(zāi)的策略,這三個(gè)chunk組成一個(gè)PG,分別在三個(gè)機(jī)架中,如果機(jī)架斷電,最多影響一個(gè)。
把這三個(gè)chunk組成一個(gè)PG作為物理節(jié)點(diǎn)插入到這個(gè)環(huán)上,然后一個(gè)節(jié)點(diǎn)放大成幾千個(gè)虛節(jié)點(diǎn),用戶創(chuàng)建一塊盤,上面每個(gè)分片派來(lái)IO之后,用這個(gè)盤唯一的ID,加上這個(gè)分片,去做哈希,哈希之后落到中間,找到了PG之后,它里面包含了三條chunk的路由,將這個(gè)IO轉(zhuǎn)發(fā)到后端的主節(jié)點(diǎn),由主節(jié)點(diǎn)去同步,主節(jié)點(diǎn)直接返回就可以了。
通過(guò)這個(gè)方案,以前動(dòng)輒幾千萬(wàn)的數(shù)據(jù)量,就是PG的個(gè)數(shù),后端是chunk的一個(gè)路由,然后就是構(gòu)建這個(gè)環(huán)的幾個(gè)參數(shù),一個(gè)是映射的算法,一個(gè)是虛節(jié)點(diǎn)的放大倍數(shù),以及沖突解決參數(shù)。這樣當(dāng)云構(gòu)建起來(lái)之后,向元數(shù)據(jù)模塊請(qǐng)求這幾個(gè)參數(shù),最多是幾千條,之后再構(gòu)建這個(gè)環(huán),這個(gè)環(huán)構(gòu)建好了之后,有IO過(guò)來(lái)的時(shí)候,只需查這個(gè)環(huán)。而當(dāng)查第一次的時(shí)候,系統(tǒng)會(huì)把計(jì)算好的路由記住,最后就可以直接找過(guò)去,非常快。這樣的話就完全解決了上述問(wèn)題,同時(shí)創(chuàng)造幾千個(gè)盤是完全沒(méi)有問(wèn)題,同時(shí)讀寫也沒(méi)有問(wèn)題,這時(shí)因?yàn)樽x寫過(guò)程中不需要去分配,因?yàn)槿怯?jì)算出來(lái)的。
線程模型設(shè)計(jì)
具體到軟件設(shè)計(jì)就是線程模型設(shè)計(jì),我們知道HDD與NVME性能差別有幾百倍。原來(lái)的軟件設(shè)計(jì)用一個(gè)線程就可以,一個(gè)CPU用滿的話,一個(gè)核跑幾萬(wàn)沒(méi)有問(wèn)題。但現(xiàn)在的軟件沒(méi)辦法去發(fā)揮這種硬件的能力,所以需要改變線程的模型。
在新的架構(gòu)中,在云端,采用了多線程的方式,每掛載一塊云盤的時(shí)候,會(huì)分配一個(gè)線程專門用于IO轉(zhuǎn)化,后端是線程池,main eventloop就是IO線程,當(dāng)某一個(gè)分片查這個(gè)環(huán),發(fā)現(xiàn)要跟后端的某個(gè)chunk通信,第一個(gè)連接分配到IO路徑1,循環(huán)派發(fā),整個(gè)IO線程負(fù)責(zé)的連接就是均勻的。假如一個(gè)IO線程跑滿能跑5萬(wàn)IOPS的話,現(xiàn)在跑130NVME,用它來(lái)管理線程30萬(wàn)的NVME的話,六個(gè)這樣的線程就可以了,完全可以發(fā)揮硬件的性能。
防過(guò)載策略
任何一個(gè)存儲(chǔ)系統(tǒng),都有一個(gè)過(guò)載保護(hù)的功能,比如說(shuō)掛載了幾千塊盤或者幾百塊盤,用戶同時(shí)測(cè)試,落在存儲(chǔ)的某一個(gè)硬盤上,并發(fā)有幾千NVME,如果不做過(guò)載保護(hù),IO將會(huì)全部超時(shí)。在新架構(gòu)中,對(duì)于普通的云硬盤,會(huì)限制物理盤上IO提交隊(duì)列的深度。
在實(shí)際代碼實(shí)現(xiàn)的時(shí)候,要考慮到權(quán)重,云硬盤的大小不一樣,大的云硬盤,用戶要多付費(fèi),更大的云硬盤,會(huì)獲得更多的發(fā)送機(jī)會(huì)。對(duì)于SSD云盤,傳統(tǒng)的單個(gè)線程會(huì)是瓶頸,難以支持幾十萬(wàn)的IOPS以及1到2GB的帶寬。新架構(gòu)會(huì)監(jiān)控每個(gè)chunk的IO線程CPU的使用率,如果發(fā)現(xiàn)長(zhǎng)時(shí)間CPU使用率都是95%或者100%,就會(huì)去通知這個(gè)chunk,斷開(kāi)IO線程里面一部分連接,分配到其他線程,實(shí)現(xiàn)了負(fù)載均衡的效果,使得每個(gè)線程的壓力都是均勻的。
在線遷移
葉恒介紹,為了幫助用戶從老架構(gòu)向新架構(gòu)遷移,UCloud為用戶提供了一套在線遷移系統(tǒng),在進(jìn)行遷移時(shí),首先要把下圖中上部的clond old斷掉,連上trons cilent,同時(shí)寫一份到新老架構(gòu),然后通過(guò)trocs模塊,當(dāng)所有的存量數(shù)據(jù)都搬遷完成之后,這一次遷移就完成了。遷移完成之后,qemu就可以跟trons cilent斷開(kāi)連接,連上一個(gè)新的cilent。這樣在遷移的過(guò)程中即使出現(xiàn)什么故障,重啟之后,老架構(gòu)仍然可用,從而降低了遷移的風(fēng)險(xiǎn)。
超高性能云盤
葉恒還介紹了UCloud正在研發(fā)的下一代超高性能的云盤,單個(gè)延時(shí)可以降低到100us,IOPS單盤可以突破百萬(wàn)。而要達(dá)到百萬(wàn)的IOPS的話,則需要用到用戶態(tài)、zero copy、polling mode,這幾個(gè)技術(shù)。用戶態(tài)就是把原來(lái)在內(nèi)核態(tài)做的事情,比如網(wǎng)卡驅(qū)動(dòng),磁盤驅(qū)動(dòng),拿到用戶態(tài)來(lái)做,直接在用戶態(tài)操作設(shè)備。polling mode,是為了解決CPU與存儲(chǔ)硬件的性能差異,使用polling mode,將會(huì)大大提升性能。zero copy,是指原來(lái)數(shù)據(jù)發(fā)一個(gè)包,需要從這個(gè)態(tài)拷到那個(gè)態(tài),但現(xiàn)在完全在用戶態(tài)操作硬件的話,就是零拷貝,可以直接發(fā)出去。
UCloud是全鏈路的改造,因此,client端用了VHOST,網(wǎng)絡(luò)端用RDMA,后端提交用SPDK。分別看一下這三個(gè)技術(shù),在clinet端,原來(lái)數(shù)據(jù)從qume拷貝,現(xiàn)在數(shù)據(jù)直接VM,直接與clinet共享,這樣,只要做虛機(jī)的物理地址到后端物理地址映射,直接通過(guò)共享內(nèi)存的方式就可以了。
在網(wǎng)絡(luò)通信部分,采用RDMA,DMA直接訪問(wèn)內(nèi)存,繞過(guò)CPU,從而降低CPU的使用率。RDMA直接訪問(wèn)遠(yuǎn)端的內(nèi)存,這樣就實(shí)現(xiàn)了通信的作用。
在后端,直接是SPDK,SPDK直接從用戶態(tài)來(lái)操作固態(tài)硬盤,當(dāng)掛一個(gè)盤到機(jī)器上,在內(nèi)核里看不到,通過(guò)采用polling的方式,實(shí)現(xiàn)零拷貝,IO提交的延時(shí)非常低。
葉恒透露,在測(cè)試中,該高性能云盤,單盤IOPS突破了百萬(wàn)。預(yù)計(jì)此款超高性能云盤將會(huì)在12月底推出公測(cè)版。
基于Cephfs的改進(jìn)及優(yōu)化
深信服科技存儲(chǔ)研發(fā)專家盧波最后一個(gè)登場(chǎng),他就Cephfs的改進(jìn)和優(yōu)化進(jìn)行了詳細(xì)的分析。
Ceph及CephFS的背景
盧波表示,Ceph是分層的架構(gòu),底層基于CRUSH,Ceph分布的策略是針對(duì)分級(jí)的哈希,跟一致性哈希有區(qū)別,它是區(qū)分故障域的,分了兩級(jí),第一級(jí)是對(duì)象到PG的映射,就是根據(jù)對(duì)象進(jìn)行一個(gè)哈希值,然后根據(jù)PG數(shù)舉模,最后得到這個(gè)數(shù)據(jù)對(duì)象分布在哪個(gè)PG上面。PG到Ceph底下,它的每一個(gè)存儲(chǔ)設(shè)備OSD,叫做對(duì)象存儲(chǔ)設(shè)備,PG到OSD之間,就是通過(guò)CRUSH算法來(lái)進(jìn)行的路由。它的底層是基于RADOS,它是可靠,自動(dòng)的分布式的一個(gè)對(duì)象存儲(chǔ),具備的特性可以自修復(fù),遷移,容錯(cuò),上層提供了對(duì)象存儲(chǔ)、塊存儲(chǔ)和文件系統(tǒng)訪問(wèn)三種方式。CephFS支持多種協(xié)議,最早起源于2007年Sage Weil的博士論文研究,最開(kāi)始Ceph針對(duì)的應(yīng)用場(chǎng)景更多是針對(duì)高性能計(jì)算,需要高擴(kuò)展性大容量的文件系統(tǒng)。
像Ceph這樣的分布式操作系統(tǒng)的出現(xiàn),源于傳統(tǒng)單機(jī)文件系統(tǒng)的局限,第一是共享沒(méi)辦法在多個(gè)機(jī)器中提供應(yīng)用訪問(wèn)。第二就是單個(gè)文件系統(tǒng)容量是有限的。第三是性能,傳統(tǒng)的文件系統(tǒng)它可能沒(méi)辦法滿足應(yīng)用非常高的讀寫性能要求,就只能在應(yīng)用層面做拆分,同時(shí)讀寫多個(gè)文件系統(tǒng)。第四是可靠性,受限于單個(gè)機(jī)器的可靠性以及單個(gè)硬盤的可靠性,容易出現(xiàn)故障導(dǎo)致數(shù)據(jù)丟失。第五是可用性,受限于單個(gè)操作系統(tǒng)的可用性,故障或者重啟等運(yùn)維操作會(huì)導(dǎo)致不可用。
而這些特點(diǎn)對(duì)于企業(yè)級(jí)的應(yīng)用或者私有云來(lái)說(shuō),是無(wú)法接受的,在這種情況下,就出現(xiàn)了CephFS。CephFS最早是一個(gè)博士論文研究,它實(shí)現(xiàn)分布式的元數(shù)據(jù)管理以及可以支持EB級(jí)的數(shù)據(jù)規(guī)模,后續(xù)專門成立了一個(gè)公司來(lái)做CephFS的開(kāi)發(fā),在2014年被Redhat收購(gòu),2016年CephFS發(fā)布可用于生產(chǎn)環(huán)境的穩(wěn)定版本發(fā)布了,目前主要應(yīng)用還是單MDS。
CephFS的架構(gòu)
CephFS的架構(gòu)不只是CephFS,包括Ceph也在里面,第一個(gè)部分是客戶端,第二部分就是元數(shù)據(jù)。文件系統(tǒng)最核心的是數(shù)據(jù),所有文件的訪問(wèn),首先離不開(kāi)源數(shù)據(jù)的訪問(wèn),與塊存儲(chǔ)不一樣,塊存儲(chǔ)就是直接指定哪個(gè)硬盤的哪個(gè)位置,有了地址,就可以去讀取那個(gè)固定的數(shù)據(jù)。但Ceph的文件系統(tǒng)是有目錄結(jié)構(gòu)和層級(jí)結(jié)構(gòu),要管理這樣的目錄結(jié)構(gòu),需要通過(guò)元數(shù)據(jù)來(lái)實(shí)現(xiàn)。
Ceph MDS也是元數(shù)據(jù)架構(gòu),可以理解為它是一個(gè)元數(shù)據(jù)的緩存,是一個(gè)元數(shù)據(jù)服務(wù),本身并不存儲(chǔ)數(shù)據(jù),它最終的數(shù)據(jù)是存在底下的RADOS的集群下面,MDS本身是不存儲(chǔ)數(shù)據(jù)的。當(dāng)客戶端要寫一個(gè)文件,首先要打開(kāi)這個(gè)文件,這個(gè)時(shí)候客戶端會(huì)跟MDS通信,去獲取它的距離,客戶端拿到之后,通過(guò)一個(gè)哈希,找到它位于哪個(gè)PG里面,直接通過(guò)計(jì)算的方式,不再需要去跟MDS交付,確定了哪個(gè)PG之后,再把數(shù)據(jù)發(fā)到對(duì)應(yīng)的數(shù)據(jù)值上面去,并且它的元數(shù)據(jù)和數(shù)據(jù)是分開(kāi)的,可以存在不同的存儲(chǔ)池中,這種設(shè)計(jì)也是分布式文件系統(tǒng)設(shè)計(jì)的跟傳統(tǒng)文件系統(tǒng)不一樣的地方。
MDS的作用
MDS作為元數(shù)據(jù)的緩存,同時(shí)控制元數(shù)據(jù)的并發(fā)處理,主要的作用有下面幾個(gè):第一,要提供文件資源,要對(duì)客戶端以文件的方式,同時(shí)兼容POSIX的語(yǔ)義。第二,要提供一個(gè)文件系統(tǒng)命名空間,它要通過(guò)MDS能夠構(gòu)建出分布式文件系統(tǒng)的一個(gè)目錄樹(shù),一個(gè)層級(jí)結(jié)構(gòu)。第三,要管理文件的元數(shù)據(jù),比如inode、dentry這樣的文件元數(shù)據(jù)。第四,它需要持久化文件元數(shù)據(jù),把元數(shù)據(jù)存儲(chǔ)到一個(gè)可靠的存儲(chǔ)設(shè)備上面去,在異常的情況下,保證這個(gè)數(shù)據(jù)是持久化的,可讀的,不會(huì)丟失數(shù)據(jù)。
MDS具有并發(fā)控制的流程,多個(gè)客戶端可以同時(shí)跟MDS通信,MDS通過(guò)一個(gè)鎖來(lái)處理這個(gè)請(qǐng)求,同時(shí)客戶端跟元數(shù)據(jù)交互的時(shí)候,除了獲取元數(shù)據(jù)信息之外,它還要知道客戶端是不是一個(gè)有效的客戶端,這個(gè)客戶端是不是能進(jìn)行讀或者寫操作,以保證數(shù)據(jù)的一致性。
當(dāng)MDS收到這樣的請(qǐng)求之后,會(huì)通過(guò)lock machine的模塊,去判斷這個(gè)請(qǐng)求是不是可以正向操作,以及去覆蓋剛才訪問(wèn)的權(quán)限,最后會(huì)把這個(gè)請(qǐng)求返回給客戶端,然后會(huì)返回文件的元數(shù)據(jù)信息。
MDS是CephFS的一部分,另外CephFS還有三個(gè)點(diǎn),MDS是實(shí)現(xiàn)元數(shù)據(jù)的分離,管理元數(shù)據(jù),作為元數(shù)據(jù)的緩存,另外MDS是一個(gè)集群,可以有多個(gè)MDS,它是利用動(dòng)態(tài)指數(shù)分區(qū)的技術(shù),每一個(gè)MDS管理一部分的目錄,一個(gè)MDS可能負(fù)責(zé)一部分目錄層級(jí),另外一個(gè)MDS負(fù)責(zé)另外一部分層級(jí),這樣它可以做到很好的擴(kuò)展性,它的性能也能得到提高,達(dá)到一個(gè)線性提升的目的。當(dāng)然,現(xiàn)在還是單MDS的方式相對(duì)可靠一些,這是未來(lái)的方向。
Ceph的優(yōu)化實(shí)踐
針對(duì)Ceph的問(wèn)題,最直接和比較常見(jiàn)的想法,是縮短它的IO路徑,解決小IO的寫放大問(wèn)題,第二,當(dāng)前Ceph的IO路徑過(guò)長(zhǎng),延時(shí)高。第三,提升文件的元數(shù)據(jù)寫操作的性能。第四就是支持寫緩存的方式。第五,對(duì)讀也可以通過(guò)緩存進(jìn)行加速。第六,Ceph最早出現(xiàn)是針對(duì)廉價(jià)的節(jié)點(diǎn)或者是服務(wù)器來(lái)設(shè)計(jì)的,但是現(xiàn)在的技術(shù)發(fā)展,有些在設(shè)計(jì)之初沒(méi)有考慮到,當(dāng)然現(xiàn)在也在改進(jìn),這個(gè)優(yōu)化也是能夠充分利用SSD或者新的網(wǎng)絡(luò)傳輸介質(zhì)這樣的優(yōu)點(diǎn)來(lái)提高它的性能。
在業(yè)界,在這方面優(yōu)化的思路有幾種,OceanStor9000的緩存,是一個(gè)典型的分布式文件系統(tǒng),它通過(guò)全局的緩存,來(lái)實(shí)現(xiàn)任意節(jié)點(diǎn)上的文件,它會(huì)對(duì)文件進(jìn)行分條,任意節(jié)點(diǎn)收到數(shù)據(jù)訪問(wèn)請(qǐng)求之后,都會(huì)從這個(gè)緩存里面去看,是不是這個(gè)緩存命中了,如果命中的話,這個(gè)時(shí)候直接返回客戶端。寫的話,首先直接也是寫到這個(gè)緩存里面,通過(guò)緩存的全局化,以后后臺(tái)緩存數(shù)據(jù)的全局化,去實(shí)現(xiàn)性能加速。緩存的一個(gè)目的除了縮短IO路徑,還有一個(gè)好處,是可以把小的IO合并,形成一個(gè)大的IO這樣一起寫下去。
Fusion storage的處理思路是一樣的,也是用到了EC,如果是大IO直接寫EC,大IO直接用硬盤的存儲(chǔ)能力。但是小IO,就會(huì)通過(guò)EC Cache,寫到Cache里面,這次IO結(jié)束了,就直接返回到客戶端。但后臺(tái)要保證這個(gè)Cache的數(shù)據(jù)最終持久化到HDD上面去,同時(shí)會(huì)進(jìn)行IO的聚合。
Isilon是另外一個(gè),這是NAS最早的一個(gè)產(chǎn)品,它里面緩存的分層分三層,第一是內(nèi)存,第二層用到NVRAM的介質(zhì)。第三層才是SSD。
Intel的思路是一樣的,因?yàn)樗腎O路徑比較長(zhǎng),Intel提出了Hyper Converged Cache的思路,把這個(gè)開(kāi)源了,這個(gè)思路是說(shuō),在客戶端就是由SSD來(lái)進(jìn)行讀寫加速,它把后端的Ceph作為一個(gè)慢存儲(chǔ)來(lái)使用,在塊和RGW場(chǎng)景中,作為讀緩存沒(méi)有問(wèn)題,如果要作為寫緩存,就涉及到冗余的問(wèn)題,所以在它的設(shè)計(jì)里面,做寫緩存的時(shí)候,是用到了DRBD這樣的雙拷貝,寫到緩存里面的時(shí)候,會(huì)做一個(gè)多副本。
通過(guò)加了這樣的緩存之后,可以看到Datrium公司基于這樣的架構(gòu),做了一個(gè)緩存的實(shí)踐,給出了一個(gè)性能,可以看到對(duì)于IOPS提升是非??捎^的。這里有一個(gè)問(wèn)題,多了一個(gè)緩存對(duì)于Ceph來(lái)講是很難受的,為什么?因?yàn)橥ㄟ^(guò)DRBD的方式,可靠性還是比較差的,對(duì)Ceph擴(kuò)展性是打了折扣的。另外一個(gè),這個(gè)緩存要實(shí)現(xiàn)數(shù)據(jù)的持久化,不可能是主備的方式,因?yàn)檫@樣也是會(huì)降低可靠性的,所以要實(shí)現(xiàn)這樣的緩存,是要實(shí)現(xiàn)分布式的一個(gè)管理邏輯。
盧波介紹說(shuō),針對(duì)這些問(wèn)題,整體的思路跟前面幾種產(chǎn)品是一樣的,通過(guò)增加的塊存儲(chǔ),來(lái)縮短IO路徑,進(jìn)而提高小IO的性能。但是這個(gè)緩存底下是一個(gè)分布式的使用場(chǎng)景,所以這個(gè)緩存本身也是一個(gè)分布式的緩存,下面是此架構(gòu)的架構(gòu)圖。
這個(gè)架構(gòu)與Ceph相比,只是在中間多了一個(gè)OCS的緩存服務(wù),緩存是一個(gè)獨(dú)立的服務(wù),從客戶端請(qǐng)求,也叫做CA,是NFS過(guò)來(lái)的請(qǐng)求,都會(huì)轉(zhuǎn)化到緩存服務(wù)上面來(lái),在緩存服務(wù)里面,根據(jù)數(shù)據(jù)分布策略,就知道這一次操作到底要寫在哪一個(gè)緩存節(jié)點(diǎn)上面去,選到這個(gè)緩存節(jié)點(diǎn)之后,緩存節(jié)點(diǎn)實(shí)現(xiàn)多副本的數(shù)據(jù)分發(fā),等多處副本完成之后,再返回給客戶端,這次操作完成,這是一個(gè)正常的寫入流程。
寫入之后,這個(gè)數(shù)據(jù)后臺(tái)是會(huì)定期根據(jù)水準(zhǔn)高低,把緩存的數(shù)據(jù)直接放到底層的Read存儲(chǔ)上面去。一方面利用了緩存加速的性能,另外一方面,可以利用Read的全局化性以及它的擴(kuò)展性。
讀流程也是一樣的,因?yàn)榫彺鎸?duì)于小IO可以最大限度發(fā)揮空間的優(yōu)勢(shì),但是對(duì)于大IO,不需要經(jīng)過(guò)緩存,直接寫到底層的Read上去。另外通過(guò)索引的方式,也可以知道具體寫到哪個(gè)緩存節(jié)點(diǎn)上去,大體流程就是這樣。而經(jīng)過(guò)這樣改進(jìn)之后,該系統(tǒng)的IOPS確實(shí)得到了提升。
Ceph未來(lái)展望
最后,盧波認(rèn)為,CephFS最有殺傷力的一個(gè)東西,就是多MDS,即動(dòng)態(tài)指數(shù)分區(qū)這樣一個(gè)技術(shù),這方面在社區(qū)也會(huì)有一些深度的開(kāi)發(fā)和討論,也在進(jìn)行一些測(cè)試。下圖就是多MDS的技術(shù)原理,多個(gè)MDS去負(fù)責(zé)不同的目錄樹(shù)的元數(shù)據(jù)訪問(wèn),當(dāng)客戶端來(lái)請(qǐng)求的時(shí)候,會(huì)去到不同的MDS,在這個(gè)MDS里面,它去實(shí)現(xiàn)元數(shù)據(jù)的管理以及數(shù)據(jù)間的訪問(wèn)。這是多MDS性能的對(duì)比,明顯可以看到,當(dāng)8個(gè)MDS并發(fā)測(cè)試的時(shí)候,其性能基本上是可以達(dá)到線性增長(zhǎng)的。