Google文件系統(tǒng)
GFS是一個(gè)可擴(kuò)展的分布式文件系統(tǒng),用于大型的、分布式的、對(duì)大量數(shù)據(jù)進(jìn)行訪問(wèn)的應(yīng)用。它運(yùn)行于廉價(jià)的普通硬件上,但可以提供容錯(cuò)功能。它可以給大量的用戶提供總體性能較高的服務(wù)。
1、設(shè)計(jì)概覽
(1)設(shè)計(jì)想定
GFS與過(guò)去的分布式文件系統(tǒng)有很多相同的目標(biāo),但GFS的設(shè)計(jì)受到了當(dāng)前及預(yù)期的應(yīng)用方面的工作量及技術(shù)環(huán)境的驅(qū)動(dòng),這反映了它與早期的文件系統(tǒng)明顯不同的設(shè)想。這就需要對(duì)傳統(tǒng)的選擇進(jìn)行重新檢驗(yàn)并進(jìn)行完全不同的設(shè)計(jì)觀點(diǎn)的探索。
GFS與以往的文件系統(tǒng)的不同的觀點(diǎn)如下:
1、部件錯(cuò)誤不再被當(dāng)作異常,而是將其作為常見(jiàn)的情況加以處理。因?yàn)槲募到y(tǒng)由成百上千個(gè)用于存儲(chǔ)的機(jī)器構(gòu)成,而這些機(jī)器是由廉價(jià)的普通部件組成并被大量的客戶機(jī)訪問(wèn)。部件的數(shù)量和質(zhì)量使得一些機(jī)器隨時(shí)都有可能無(wú)法工作并且有一部分還可能無(wú)法恢復(fù)。所以實(shí)時(shí)地監(jiān)控、錯(cuò)誤檢測(cè)、容錯(cuò)、自動(dòng)恢復(fù)對(duì)系統(tǒng)來(lái)說(shuō)必不可少。
2、按照傳統(tǒng)的標(biāo)準(zhǔn),文件都非常大。長(zhǎng)度達(dá)幾個(gè)GB的文件是很平常的。每個(gè)文件通常包含很多應(yīng)用對(duì)象。當(dāng)經(jīng)常要處理快速增長(zhǎng)的、包含數(shù)以萬(wàn)計(jì)的對(duì)象、長(zhǎng)度達(dá)TB的數(shù)據(jù)集時(shí),我們很難管理成千上萬(wàn)的KB規(guī)模的文件塊,即使底層文件系統(tǒng)提供支持。因此,設(shè)計(jì)中操作的參數(shù)、塊的大小必須要重新考慮。對(duì)大型的文件的管理一定要能做到高效,對(duì)小型的文件也必須支持,但不必優(yōu)化。
3、大部分文件的更新是通過(guò)添加新數(shù)據(jù)完成的,而不是改變已存在的數(shù)據(jù)。在一個(gè)文件中隨機(jī)的操作在實(shí)踐中幾乎不存在。一旦寫(xiě)完,文件就只可讀,很多數(shù)據(jù)都有這些特性。一些數(shù)據(jù)可能組成一個(gè)大倉(cāng)庫(kù)以供數(shù)據(jù)分析程序掃描。有些是運(yùn)行中的程序連續(xù)產(chǎn)生的數(shù)據(jù)流。有些是檔案性質(zhì)的數(shù)據(jù),有些是在某個(gè)機(jī)器上產(chǎn)生、在另外一個(gè)機(jī)器上處理的中間數(shù)據(jù)。由于這些對(duì)大型文件的訪問(wèn)方式,添加操作成為性能優(yōu)化和原子性保證的焦點(diǎn)。而在客戶機(jī)中緩存數(shù)據(jù)塊則失去了吸引力。
4、工作量主要由兩種讀操作構(gòu)成:對(duì)大量數(shù)據(jù)的流方式的讀操作和對(duì)少量數(shù)據(jù)的隨機(jī)方式的讀操作。在前一種讀操作中,可能要讀幾百KB,通常達(dá) 1MB和更多。來(lái)自同一個(gè)客戶的連續(xù)操作通常會(huì)讀文件的一個(gè)連續(xù)的區(qū)域。隨機(jī)的讀操作通常在一個(gè)隨機(jī)的偏移處讀幾個(gè)KB。性能敏感的應(yīng)用程序通常將對(duì)少量數(shù)據(jù)的讀操作進(jìn)行分類并進(jìn)行批處理以使得讀操作穩(wěn)定地向前推進(jìn),而不要讓它來(lái)來(lái)回回的讀。
5、工作量還包含許多對(duì)大量數(shù)據(jù)進(jìn)行的、連續(xù)的、向文件添加數(shù)據(jù)的寫(xiě)操作。所寫(xiě)的數(shù)據(jù)的規(guī)模和讀相似。一旦寫(xiě)完,文件很少改動(dòng)。在隨機(jī)位置對(duì)少量數(shù)據(jù)的寫(xiě)操作也支持,但不必非常高效。
6、系統(tǒng)必須高效地實(shí)現(xiàn)定義完好的大量客戶同時(shí)向同一個(gè)文件的添加操作的語(yǔ)義。
(2)系統(tǒng)接口
GFS提供了一個(gè)相似地文件系統(tǒng)界面,雖然它沒(méi)有向POSIX那樣實(shí)現(xiàn)標(biāo)準(zhǔn)的API。文件在目錄中按層次組織起來(lái)并由路徑名標(biāo)識(shí)。
(3)體系結(jié)構(gòu):
一個(gè)GFS集群由一個(gè)master和大量的chunkserver構(gòu)成,并被許多客戶(Client)訪問(wèn)。如圖1所示。Master和 chunkserver通常是運(yùn)行用戶層服務(wù)進(jìn)程的Linux機(jī)器。只要資源和可靠性允許,chunkserver和client可以運(yùn)行在同一個(gè)機(jī)器上。
文件被分成固定大小的塊。每個(gè)塊由一個(gè)不變的、全局唯一的64位的chunk-h(huán)andle標(biāo)識(shí),chunk-h(huán)andle是在塊創(chuàng)建時(shí)由 master分配的。ChunkServer將塊當(dāng)作Linux文件存儲(chǔ)在本地磁盤并可以讀和寫(xiě)由chunk-h(huán)andle和位區(qū)間指定的數(shù)據(jù)。出于可靠性考慮,每一個(gè)塊被復(fù)制到多個(gè)chunkserver上。默認(rèn)情況下,保存3個(gè)副本,但這可以由用戶指定。
Master維護(hù)文件系統(tǒng)所以的元數(shù)據(jù)(metadata),包括名字空間、訪問(wèn)控制信息、從文件到塊的映射以及塊的當(dāng)前位置。它也控制系統(tǒng)范圍的活動(dòng),如塊租約(lease)管理,孤兒塊的垃圾收集,chunkserver間的塊遷移。Master定期通過(guò)HeartBeat消息與每一個(gè) chunkserver通信,給chunkserver傳遞指令并收集它的狀態(tài)。
與每個(gè)應(yīng)用相聯(lián)的GFS客戶代碼實(shí)現(xiàn)了文件系統(tǒng)的API并與master和chunkserver通信以代表應(yīng)用程序讀和寫(xiě)數(shù)據(jù)。客戶與master的交換只限于對(duì)元數(shù)據(jù)(metadata)的操作,所有數(shù)據(jù)方面的通信都直接和chunkserver聯(lián)系。
客戶和chunkserver都不緩存文件數(shù)據(jù)。因?yàn)橛脩艟彺娴囊嫣幬⒑跗湮ⅲ@是由于數(shù)據(jù)太多或工作集太大而無(wú)法緩存。不緩存數(shù)據(jù)簡(jiǎn)化了客戶程序和整個(gè)系統(tǒng),因?yàn)椴槐乜紤]緩存的一致性問(wèn)題。但用戶緩存元數(shù)據(jù)(metadata)。Chunkserver也不必緩存文件,因?yàn)閴K時(shí)作為本地文件存儲(chǔ)的。
(4)單master。
只有一個(gè)master也極大的簡(jiǎn)化了設(shè)計(jì)并使得master可以根據(jù)全局情況作出先進(jìn)的塊放置和復(fù)制決定。但是我們必須要將master對(duì)讀和寫(xiě)的參與減至最少,這樣它才不會(huì)成為系統(tǒng)的瓶頸。Client從來(lái)不會(huì)從master讀和寫(xiě)文件數(shù)據(jù)。Client只是詢問(wèn)master它應(yīng)該和哪個(gè) chunkserver聯(lián)系。Client在一段限定的時(shí)間內(nèi)將這些信息緩存,在后續(xù)的操作中Client直接和chunkserver交互。
以圖1解釋一下一個(gè)簡(jiǎn)單的讀操作的交互。
1、client使用固定的塊大小將應(yīng)用程序指定的文件名和字節(jié)偏移轉(zhuǎn)換成文件的一個(gè)塊索引(chunk index)。
2、給master發(fā)送一個(gè)包含文件名和塊索引的請(qǐng)求。
3、master回應(yīng)對(duì)應(yīng)的chunk handle和副本的位置(多個(gè)副本)。
4、client以文件名和塊索引為鍵緩存這些信息。(handle和副本的位置)。
5、Client 向其中一個(gè)副本發(fā)送一個(gè)請(qǐng)求,很可能是最近的一個(gè)副本。請(qǐng)求指定了chunk handle(chunkserver以chunk handle標(biāo)識(shí)chunk)和塊內(nèi)的一個(gè)字節(jié)區(qū)間。
6、除非緩存的信息不再有效(cache for a limited time)或文件被重新打開(kāi),否則以后對(duì)同一個(gè)塊的讀操作不再需要client和master間的交互。
通常Client可以在一個(gè)請(qǐng)求中詢問(wèn)多個(gè)chunk的地址,而master也可以很快回應(yīng)這些請(qǐng)求。
(5)塊規(guī)模:
塊規(guī)模是設(shè)計(jì)中的一個(gè)關(guān)鍵參數(shù)。我們選擇的是64MB,這比一般的文件系統(tǒng)的塊規(guī)模要大的多。每個(gè)塊的副本作為一個(gè)普通的Linux文件存儲(chǔ),在需要的時(shí)候可以擴(kuò)展。
塊規(guī)模較大的好處有:
1、減少client和master之間的交互。因?yàn)樽x寫(xiě)同一個(gè)塊只是要在開(kāi)始時(shí)向master請(qǐng)求塊位置信息。對(duì)于讀寫(xiě)大型文件這種減少尤為重要。即使對(duì)于訪問(wèn)少量數(shù)據(jù)的隨機(jī)讀操作也可以很方便的為一個(gè)規(guī)模達(dá)幾個(gè)TB的工作集緩緩存塊位置信息。
2、Client在一個(gè)給定的塊上很可能執(zhí)行多個(gè)操作,和一個(gè)chunkserver保持較長(zhǎng)時(shí)間的TCP連接可以減少網(wǎng)絡(luò)負(fù)載。
3、這減少了master上保存的元數(shù)據(jù)(metadata)的規(guī)模,從而使得可以將metadata放在內(nèi)存中。這又會(huì)帶來(lái)一些別的好處。
不利的一面:
一個(gè)小文件可能只包含一個(gè)塊,如果很多Client訪問(wèn)改文件的話,存儲(chǔ)這些塊的chunkserver將成為訪問(wèn)的熱點(diǎn)。但在實(shí)際應(yīng)用中,應(yīng)用程序通常順序地讀包含多個(gè)塊的文件,所以這不是一個(gè)主要問(wèn)題。
(6)元數(shù)據(jù)(metadata):
master存儲(chǔ)了三中類型的metadata:文件的名字空間和塊的名字空間,從文件到塊的映射,塊的副本的位置。所有的metadata都放在內(nèi)存中。前兩種類型的metadata通過(guò)向操作日志登記修改而保持不變,操作日志存儲(chǔ)在master的本地磁盤并在幾個(gè)遠(yuǎn)程機(jī)器上留有副本。使用日志使得我們可以很簡(jiǎn)單地、可靠地更新master的狀態(tài),即使在master崩潰的情況下也不會(huì)有不一致的問(wèn)題。相反,mater在每次啟動(dòng)以及當(dāng)有 chuankserver加入的時(shí)候詢問(wèn)每個(gè)chunkserver的所擁有的塊的情況。
A、內(nèi)存數(shù)據(jù)結(jié)構(gòu):
因?yàn)閙etadata存儲(chǔ)在內(nèi)存中,所以master的操作很快。進(jìn)一步,master可以輕易而且高效地定期在后臺(tái)掃描它的整個(gè)狀態(tài)。這種定期地掃描被用于實(shí)現(xiàn)塊垃圾收集、chunkserver出現(xiàn)故障時(shí)的副本復(fù)制、為平衡負(fù)載和磁盤空間而進(jìn)行的塊遷移。
這種方法的一個(gè)潛在的問(wèn)題就是塊的數(shù)量也即整個(gè)系統(tǒng)的容量是否受限與master的內(nèi)存。實(shí)際上,這并不是一個(gè)嚴(yán)重的問(wèn)題。Master為每個(gè) 64MB的塊維護(hù)的metadata不足64個(gè)字節(jié)。除了最后一塊,文件所有的塊都是滿的。類似的,每個(gè)文件的名字空間數(shù)據(jù)也不足64個(gè)字節(jié),因?yàn)槲募且砸环N事先確定的壓縮方式存儲(chǔ)的.如果要支持更大的文件系統(tǒng),那么增加一些內(nèi)存的方法對(duì)于我們將元數(shù)據(jù)(metadata)保存在內(nèi)存種所獲得的簡(jiǎn)單性、可靠性、高性能和靈活性來(lái)說(shuō),這只是一個(gè)很小的代價(jià)。
B、塊位置:
master并不為chunkserver所擁有的塊的副本的保存一個(gè)不變的記錄。它在啟動(dòng)時(shí)通過(guò)簡(jiǎn)單的查詢來(lái)獲得這些信息。Master可以保持這些信息的更新,因?yàn)樗刂扑袎K的放置并通過(guò)HeartBeat消息來(lái)監(jiān)控chunkserver的狀態(tài)。
這樣做的好處:因?yàn)閏hunkserver可能加入或離開(kāi)集群、改變路徑名、崩潰、重啟等,一個(gè)集群重有成百個(gè)server,這些事件經(jīng)常發(fā)生,這種方法就排除了master與chunkserver之間的同步問(wèn)題。
另一個(gè)原因是:只有chunkserver才能確定它自己到底有哪些塊,由于錯(cuò)誤,chunkserver中的一些塊可能會(huì)很自然的消失,這樣在master中就沒(méi)有必要為此保存一個(gè)不變的記錄。
C、操作日志:
操作日志包含了對(duì)metadata所作的修改的歷史記錄。它作為邏輯時(shí)間線定義了并發(fā)操作的執(zhí)行順序。文件、塊以及它們的版本號(hào)都由它們被創(chuàng)建時(shí)的邏輯時(shí)間而唯一地、永久地被標(biāo)識(shí)。
操作日志是如此的重要,我們必須要將它可靠地保存起來(lái),并且只有在metadata的改變固定下來(lái)之后才將變化呈現(xiàn)給用戶。所以我們將操作日志復(fù)制到數(shù)個(gè)遠(yuǎn)程的機(jī)器上,并且只有在將相應(yīng)的日志記錄寫(xiě)到本地和遠(yuǎn)程的磁盤上之后才回答用戶的請(qǐng)求。
Master可以用操作日志來(lái)恢復(fù)它的文件系統(tǒng)的狀態(tài)。為了將啟動(dòng)時(shí)間減至最小,日志就必須要比較小。每當(dāng)日志的長(zhǎng)度增長(zhǎng)到超過(guò)一定的規(guī)模后,master就要檢查它的狀態(tài),它可以從本地磁盤裝入最近的檢查點(diǎn)來(lái)恢復(fù)狀態(tài)。
創(chuàng)建一個(gè)檢查點(diǎn)比較費(fèi)時(shí),master的內(nèi)部狀態(tài)是以一種在創(chuàng)建一個(gè)檢查點(diǎn)時(shí)并不耽誤即將到來(lái)的修改操作的方式來(lái)組織的。Master切換到一個(gè)新的日子文件并在一個(gè)單獨(dú)的線程中創(chuàng)建檢查點(diǎn)。這個(gè)新的檢查點(diǎn)記錄了切換前所有的修改。在一個(gè)有數(shù)十萬(wàn)文件的集群中用一分鐘左右就能完成。創(chuàng)建完后,將它寫(xiě)入本地和遠(yuǎn)程的磁盤。
(7)數(shù)據(jù)完整性
名字空間的修改必須是原子性的,它們只能有master處理:名字空間鎖保證了操作的原子性和正確性,而master的操作日志在全局范圍內(nèi)定義了這些操作的順序。
文件區(qū)間的狀態(tài)在修改之后依賴于修改的類型,不論操作成功還是失敗,也不論是不是并發(fā)操作。如果不論從哪個(gè)副本上讀,所有的客戶都看到同樣的數(shù)據(jù),那么文件的這個(gè)區(qū)域就是一致的。如果文件的區(qū)域是一致的并且用戶可以看到修改操作所寫(xiě)的數(shù)據(jù),那么它就是已定義的。如果修改是在沒(méi)有并發(fā)寫(xiě)操作的影響下完成的,那么受影響的區(qū)域是已定義的,所有的client都能看到寫(xiě)的內(nèi)容。成功的并發(fā)寫(xiě)操作是未定義但卻是一致的。失敗的修改將使區(qū)間處于不一致的狀態(tài)。
Write操作在應(yīng)用程序指定的偏移處寫(xiě)入數(shù)據(jù),而record append操作使得數(shù)據(jù)(記錄)即使在有并發(fā)修改操作的情況下也至少原子性的被加到GFS指定的偏移處,偏移地址被返回給用戶。
在一系列成功的修改操作后,最后的修改操作保證文件區(qū)域是已定義的。GFS通過(guò)對(duì)所有的副本執(zhí)行同樣順序的修改操作并且使用塊版本號(hào)檢測(cè)過(guò)時(shí)的副本(由于chunkserver退出而導(dǎo)致丟失修改)來(lái)做到這一點(diǎn)。
因?yàn)橛脩艟彺媪藭?huì)位置信息,所以在更新緩存之前有可能從一個(gè)過(guò)時(shí)的副本中讀取數(shù)據(jù)。但這有緩存的截止時(shí)間和文件的重新打開(kāi)而受到限制。
在修改操作成功后,部件故障仍可以是數(shù)據(jù)受到破壞。GFS通過(guò)master和chunkserver間定期的handshake,借助校驗(yàn)和來(lái)檢測(cè)對(duì)數(shù)據(jù)的破壞。一旦檢測(cè)到,就從一個(gè)有效的副本盡快重新存儲(chǔ)。只有在GFS檢測(cè)前,所有的副本都失效,這個(gè)塊才會(huì)丟失。
2、系統(tǒng)交互
(1)租約(lease)和修改順序:
(2)數(shù)據(jù)流
我們的目標(biāo)是充分利用每個(gè)機(jī)器的網(wǎng)絡(luò)帶寬,避免網(wǎng)絡(luò)瓶頸和延遲
為了有效的利用網(wǎng)絡(luò),我們將數(shù)據(jù)流和控制流分離。數(shù)據(jù)是以流水線的方式在選定的chunkerserver鏈上線性的傳遞的。每個(gè)機(jī)器的整個(gè)對(duì)外帶寬都被用作傳遞數(shù)據(jù)。為避免瓶頸,每個(gè)機(jī)器在收到數(shù)據(jù)后,將它收到數(shù)據(jù)盡快傳遞給離它最近的機(jī)器。
(3)原子性的record Append:
GFS提供了一個(gè)原子性的添加操作:record append。在傳統(tǒng)的寫(xiě)操作中,client指定被寫(xiě)數(shù)據(jù)的偏移位置,向同一個(gè)區(qū)間的并發(fā)的寫(xiě)操作是不連續(xù)的:區(qū)間有可能包含來(lái)自多個(gè)client的數(shù)據(jù)碎片。在record append中, client只是指定數(shù)據(jù)。GFS在其選定的偏移出將數(shù)據(jù)至少原子性的加入文件一次,并將偏移返回給client。
在分布式的應(yīng)用中,不同機(jī)器上的許多client可能會(huì)同時(shí)向一個(gè)文件執(zhí)行添加操作,添加操作被頻繁使用。如果用傳統(tǒng)的write操作,可能需要額外的、復(fù)雜的、開(kāi)銷較大的同步,例如通過(guò)分布式鎖管理。在我們的工作量中,這些文件通常以多個(gè)生產(chǎn)者單個(gè)消費(fèi)者隊(duì)列的方式或包含從多個(gè)不同 client的綜合結(jié)果。
Record append和前面講的write操作的控制流差不多,只是在primary上多了一些邏輯判斷。首先,client將數(shù)據(jù)發(fā)送到文件最后一塊的所有副本上。然后向primary發(fā)送請(qǐng)求。Primary檢查添加操作是否會(huì)導(dǎo)致該塊超過(guò)最大的規(guī)模(64M)。如果這樣,它將該塊擴(kuò)充到最大規(guī)模,并告訴其它副本做同樣的事,同時(shí)通知client該操作需要在下一個(gè)塊上重新嘗試。如果記錄滿足最大規(guī)模的要求,primary就會(huì)將數(shù)據(jù)添加到它的副本上,并告訴其它的副本在在同樣的偏移處寫(xiě)數(shù)據(jù),最后primary向client報(bào)告寫(xiě)操作成功。如果在任何一個(gè)副本上record append操作失敗,client將重新嘗試該操作。這時(shí)候,同一個(gè)塊的副本可能包含不同的數(shù)據(jù),因?yàn)橛械目赡軓?fù)制了全部的數(shù)據(jù),有的可能只復(fù)制了部分。GFS不能保證所有的副本每個(gè)字節(jié)都是一樣的。它只保證每個(gè)數(shù)據(jù)作為一個(gè)原子單元被寫(xiě)過(guò)至少一次。這個(gè)是這樣得出的:操作要是成功,數(shù)據(jù)必須在所有的副本上的同樣的偏移處被寫(xiě)過(guò)。進(jìn)一步,從這以后,所有的副本至少和記錄一樣長(zhǎng),所以后續(xù)的記錄將被指定到更高的偏移處或者一個(gè)不同的塊上,即使另一個(gè)副本成了primary。根據(jù)一致性保證,成功的record append操作的區(qū)間是已定義的。而受到干擾的區(qū)間是不一致的。
(4)快照(snapshot)
快照操作幾乎在瞬間構(gòu)造一個(gè)文件和目錄樹(shù)的副本,同時(shí)將正在進(jìn)行的其他修改操作對(duì)它的影響減至最小。
我們使用copy-on-write技術(shù)來(lái)實(shí)現(xiàn)snapshot。當(dāng)master受到一個(gè)snapshot請(qǐng)求時(shí),它首先將要snapshot的文件上塊上的lease。這使得任何一個(gè)向這些塊寫(xiě)數(shù)據(jù)的操作都必須和master交互以找到擁有l(wèi)ease的副本。這就給master一個(gè)創(chuàng)建這個(gè)塊的副本的機(jī)會(huì)。
副本被撤銷或終止后,master在磁盤上登記執(zhí)行的操作,然后復(fù)制源文件或目錄樹(shù)的metadata以對(duì)它的內(nèi)存狀態(tài)實(shí)施登記的操作。這個(gè)新創(chuàng)建的snapshot文件和源文件(其metadata)指向相同的塊(chunk)。
Snapshot之后,客戶第一次向chunk c寫(xiě)的時(shí)候,它發(fā)一個(gè)請(qǐng)求給master以找到擁有l(wèi)ease的副本。Master注意到chunk c的引用記數(shù)比1大,它延遲對(duì)用戶的響應(yīng),選擇一個(gè)chunk handle C’,然后要求每一有chunk c的副本的chunkserver創(chuàng)建一個(gè)塊C’。每個(gè)chunkserver在本地創(chuàng)建chunk C’避免了網(wǎng)絡(luò)開(kāi)銷。從這以后和對(duì)別的塊的操作沒(méi)有什么區(qū)別。
3、MASTER操作
MASTER執(zhí)行所有名字空間的操作,除此之外,他還在系統(tǒng)范圍管理數(shù)據(jù)塊的復(fù)制:決定數(shù)據(jù)塊的放置方案,產(chǎn)生新數(shù)據(jù)塊并將其備份,和其他系統(tǒng)范圍的操作協(xié)同來(lái)確保數(shù)據(jù)備份的完整性,在所有的數(shù)據(jù)塊服務(wù)器之間平衡負(fù)載并收回沒(méi)有使用的存儲(chǔ)空間。
3.1 名字空間管理和加鎖
與傳統(tǒng)文件系統(tǒng)不同的是,GFS沒(méi)有與每個(gè)目錄相關(guān)的能列出其所有文件的數(shù)據(jù)結(jié)構(gòu),它也不支持別名(unix中的硬連接或符號(hào)連接),不管是對(duì)文件或是目錄。GFS的名字空間邏輯上是從文件元數(shù)據(jù)到路徑名映射的一個(gè)查用表。
MASTER在執(zhí)行某個(gè)操作前都要獲得一系列鎖,例如,它要對(duì)/d1/d2…/dn/leaf執(zhí)行操作,則它必須獲得/d1,/d1/d2,…, /d1/d2/…/dn的讀鎖,/d1/d2…/dn/leaf的讀鎖或?qū)戞i(其中l(wèi)eaf可以使文件也可以是目錄)。MASTER操作的并行性和數(shù)據(jù)的一致性就是通過(guò)這些鎖來(lái)實(shí)現(xiàn)的。
3.2 備份存儲(chǔ)放置策略
一個(gè)GFS集群文件系統(tǒng)可能是多層分布的。一般情況下是成千上萬(wàn)個(gè)文件塊服務(wù)器分布于不同的機(jī)架上,而這些文件塊服務(wù)器又被分布于不同機(jī)架上的客戶來(lái)訪問(wèn)。因此,不同機(jī)架上的兩臺(tái)機(jī)器之間的通信可能通過(guò)一個(gè)或多個(gè)交換機(jī)。數(shù)據(jù)塊冗余配置策略要達(dá)到連個(gè)目的:最大的數(shù)據(jù)可靠性和可用性,最大的網(wǎng)絡(luò)帶寬利用率。因此,如果僅僅把數(shù)據(jù)的拷貝置于不同的機(jī)器上很難滿足這兩個(gè)要求,必須在不同的機(jī)架上進(jìn)行數(shù)據(jù)備份。這樣即使整個(gè)機(jī)架被毀或是掉線,也能確保數(shù)據(jù)的正常使用。這也使數(shù)據(jù)傳輸,尤其是讀數(shù)據(jù),可以充分利用帶寬,訪問(wèn)到多個(gè)機(jī)架,而寫(xiě)操作,則不得不涉及到更多的機(jī)架。
3.3 產(chǎn)生、重復(fù)制、重平衡數(shù)據(jù)塊
當(dāng)MASTER產(chǎn)生新的數(shù)據(jù)塊時(shí),如何放置新數(shù)據(jù)塊,要考慮如下幾個(gè)因素:(1)盡量放置在磁盤利用率低的數(shù)據(jù)塊服務(wù)器上,這樣,慢慢地各服務(wù)器的磁盤利用率就會(huì)達(dá)到平衡。(2)盡量控制在一個(gè)服務(wù)器上的“新創(chuàng)建”的次數(shù)。(3)由于上一小節(jié)討論的原因,我們需要把數(shù)據(jù)塊放置于不同的機(jī)架上。
MASTER在可用的數(shù)據(jù)塊備份低于用戶設(shè)定的數(shù)目時(shí)需要進(jìn)行重復(fù)制。這種情況源于多種原因:服務(wù)器不可用,數(shù)據(jù)被破壞,磁盤被破壞,或者備份數(shù)目被修改。每個(gè)被需要重復(fù)制的數(shù)據(jù)塊的優(yōu)先級(jí)根據(jù)以下幾項(xiàng)確定:第一是現(xiàn)在的數(shù)目距目標(biāo)的距離,對(duì)于能阻塞用戶程序的數(shù)據(jù)塊,我們也提高它的優(yōu)先級(jí)。最后, MASTER按照產(chǎn)生數(shù)據(jù)塊的原則復(fù)制數(shù)據(jù)塊,并把它們放到不同的機(jī)架內(nèi)的服務(wù)器上。
MASTER周期性的平衡各服務(wù)器上的負(fù)載:它檢查chunk分布和負(fù)載平衡,通過(guò)這種方式來(lái)填充一個(gè)新的服務(wù)器而不是把其他的內(nèi)容統(tǒng)統(tǒng)放置到它上面帶來(lái)大量的寫(xiě)數(shù)據(jù)。數(shù)據(jù)塊放置的原則與上面討論的相同,此外,MASTER還決定那些數(shù)據(jù)塊要被移除,原則上他會(huì)清除那些空閑空間低于平均值的那些服務(wù)器。
3.4 垃圾收集
在一個(gè)文件被刪除之后,GFS并不立即收回磁盤空間,而是等到垃圾收集程序在文件和數(shù)據(jù)塊級(jí)的的檢查中收回。
當(dāng)一個(gè)文件被應(yīng)用程序刪除之后,MASTER會(huì)立即記錄下這些變化,但文件所占用的資源卻不會(huì)被立即收回,而是重新給文件命了一個(gè)隱藏的名字,并附上了刪除的時(shí)間戳。在MASTER定期檢查名字空間時(shí),它刪除超過(guò)三天(可以設(shè)定)的隱藏的文件。在此之前,可以以一個(gè)新的名字來(lái)讀文件,還可以以前的名字恢復(fù)。當(dāng)隱藏的文件在名字空間中被刪除以后,它在內(nèi)存中的元數(shù)據(jù)即被擦除,這就有效地切斷了他和所有數(shù)據(jù)塊的聯(lián)系。
在一個(gè)相似的定期的名字空間檢查中,MASTER確認(rèn)孤兒數(shù)據(jù)塊(不屬于任何文件)并擦除他的元數(shù)據(jù),在和MASTER的心跳信息交換中,每個(gè)服務(wù)器報(bào)告他所擁有的數(shù)據(jù)塊,MASTER返回元數(shù)據(jù)不在內(nèi)存的數(shù)據(jù)塊,服務(wù)器即可以刪除這些數(shù)據(jù)塊。
3.5 過(guò)時(shí)數(shù)據(jù)的探測(cè)
在數(shù)據(jù)更新時(shí)如果服務(wù)器停機(jī)了,那么他所保存的數(shù)據(jù)備份就會(huì)過(guò)時(shí)。對(duì)每個(gè)數(shù)據(jù)塊,MASTER設(shè)置了一個(gè)版本號(hào)來(lái)區(qū)別更新過(guò)的數(shù)據(jù)塊和過(guò)時(shí)的數(shù)據(jù)塊。
當(dāng)MASTER授權(quán)一個(gè)新的lease時(shí),他會(huì)增加數(shù)據(jù)塊的版本號(hào)并會(huì)通知更新數(shù)據(jù)備份。MASTER和備份都會(huì)記錄下當(dāng)前的版本號(hào),如果一個(gè)備份當(dāng)時(shí)不可用,那么他的版本號(hào)不可能提高,當(dāng)ChunkServer重新啟動(dòng)并向MASTER報(bào)告他的數(shù)據(jù)塊集時(shí),MASTER就會(huì)發(fā)現(xiàn)過(guò)時(shí)的數(shù)據(jù)。
MASTER在定期的垃圾收集程序中清除過(guò)時(shí)的備份,在此以前,處于效率考慮,在各客戶及英大使,他會(huì)認(rèn)為根本不存在過(guò)時(shí)的數(shù)據(jù)。作為另一個(gè)安全措施, MASTER在給客戶及關(guān)于數(shù)據(jù)塊的應(yīng)答或是另外一個(gè)讀取數(shù)據(jù)的服務(wù)器數(shù)據(jù)是都會(huì)帶上版本信息,在操作前客戶機(jī)和服務(wù)器會(huì)驗(yàn)證版本信息以確保得到的是最新的數(shù)據(jù)。
4、容錯(cuò)和診斷
4.1 高可靠性
4.1.1 快速恢復(fù)
不管如何終止服務(wù),MASTER和數(shù)據(jù)塊服務(wù)器都會(huì)在幾秒鐘內(nèi)恢復(fù)狀態(tài)和運(yùn)行。實(shí)際上,我們不對(duì)正常終止和不正常終止進(jìn)行區(qū)分,服務(wù)器進(jìn)程都會(huì)被切斷而終止。客戶機(jī)和其他的服務(wù)器會(huì)經(jīng)歷一個(gè)小小的中斷,然后它們的特定請(qǐng)求超時(shí),重新連接重啟的服務(wù)器,重新請(qǐng)求。
4.1.2 數(shù)據(jù)塊備份
如上文所討論的,每個(gè)數(shù)據(jù)塊都會(huì)被備份到放到不同機(jī)架上的不同服務(wù)器上。對(duì)不同的名字空間,用戶可以設(shè)置不同的備份級(jí)別。在數(shù)據(jù)塊服務(wù)器掉線或是數(shù)據(jù)被破壞時(shí),MASTER會(huì)按照需要來(lái)復(fù)制數(shù)據(jù)塊。
4.1.3 MASTER備份
為確保可靠性,MASTER的狀態(tài)、操作記錄和檢查點(diǎn)都在多臺(tái)機(jī)器上進(jìn)行了備份。一個(gè)操作只有在數(shù)據(jù)塊服務(wù)器硬盤上刷新并被記錄在MASTER和其備份的上之后才算是成功的。如果MASTER或是硬盤失敗,系統(tǒng)監(jiān)視器會(huì)發(fā)現(xiàn)并通過(guò)改變域名啟動(dòng)它的一個(gè)備份機(jī),而客戶機(jī)則僅僅是使用規(guī)范的名稱來(lái)訪問(wèn),并不會(huì)發(fā)現(xiàn)MASTER的改變。
4.2 數(shù)據(jù)完整性
每個(gè)數(shù)據(jù)塊服務(wù)器都利用校驗(yàn)和來(lái)檢驗(yàn)存儲(chǔ)數(shù)據(jù)的完整性。原因:每個(gè)服務(wù)器隨時(shí)都有發(fā)生崩潰的可能性,并且在兩個(gè)服務(wù)器間比較數(shù)據(jù)塊也是不現(xiàn)實(shí)的,同時(shí),在兩臺(tái)服務(wù)器間拷貝數(shù)據(jù)并不能保證數(shù)據(jù)的一致性。
每個(gè)Chunk按64kB的大小分成塊,每個(gè)塊有32位的校驗(yàn)和,校驗(yàn)和和日志存儲(chǔ)在一起,和用戶數(shù)據(jù)分開(kāi)。
在讀數(shù)據(jù)時(shí),服務(wù)器首先檢查與被讀內(nèi)容相關(guān)部分的校驗(yàn)和,因此,服務(wù)器不會(huì)傳播錯(cuò)誤的數(shù)據(jù)。如果所檢查的內(nèi)容和校驗(yàn)和不符,服務(wù)器就會(huì)給數(shù)據(jù)請(qǐng)求者返回一個(gè)錯(cuò)誤的信息,并把這個(gè)情況報(bào)告給MASTER。客戶機(jī)就會(huì)讀其他的服務(wù)器來(lái)獲取數(shù)據(jù),而MASTER則會(huì)從其他的拷貝來(lái)復(fù)制數(shù)據(jù),等到一個(gè)新的拷貝完成時(shí),MASTER就會(huì)通知報(bào)告錯(cuò)誤的服務(wù)器刪除出錯(cuò)的數(shù)據(jù)塊。
附加寫(xiě)數(shù)據(jù)時(shí)的校驗(yàn)和計(jì)算優(yōu)化了,因?yàn)檫@是主要的寫(xiě)操作。我們只是更新增加部分的校驗(yàn)和,即使末尾部分的校驗(yàn)和數(shù)據(jù)已被損壞而我們沒(méi)有檢查出來(lái),新的校驗(yàn)和與數(shù)據(jù)會(huì)不相符,這種沖突在下次使用時(shí)將會(huì)被檢查出來(lái)。
相反,如果是覆蓋現(xiàn)有數(shù)據(jù)的寫(xiě),在寫(xiě)以前,我們必須檢查第一和最后一個(gè)數(shù)據(jù)塊,然后才能執(zhí)行寫(xiě)操作,最后計(jì)算和記錄校驗(yàn)和。如果我們?cè)诟采w以前不先檢查首位數(shù)據(jù)塊,計(jì)算出的校驗(yàn)和則會(huì)因?yàn)闆](méi)被覆蓋的數(shù)據(jù)而產(chǎn)生錯(cuò)誤。
在空閑時(shí)間,服務(wù)器會(huì)檢查不活躍的數(shù)據(jù)塊的校驗(yàn)和,這樣可以檢查出不經(jīng)常讀的數(shù)據(jù)的錯(cuò)誤。一旦錯(cuò)誤被檢查出來(lái),服務(wù)器會(huì)拷貝一個(gè)正確的數(shù)據(jù)塊來(lái)代替錯(cuò)誤的。
4.3 診斷工具
廣泛而細(xì)致的診斷日志以微小的代價(jià)換取了在問(wèn)題隔離、診斷、性能分析方面起到了重大的作用。GFS服務(wù)器用日志來(lái)記錄顯著的事件(例如服務(wù)器停機(jī)和啟動(dòng))和遠(yuǎn)程的應(yīng)答。遠(yuǎn)程日志記錄機(jī)器之間的請(qǐng)求和應(yīng)答,通過(guò)收集不同機(jī)器上的日志記錄,并對(duì)它們進(jìn)行分析恢復(fù),我們可以完整地重現(xiàn)活動(dòng)的場(chǎng)景,并用此來(lái)進(jìn)行錯(cuò)誤分析。
6 測(cè)量
6.1 測(cè)試環(huán)境
一臺(tái)主控機(jī),兩臺(tái)主控機(jī)備份,16臺(tái)數(shù)據(jù)塊服務(wù)器,16臺(tái)客戶機(jī)。
每臺(tái)機(jī)器:2塊PIII1.4G處理器,2G內(nèi)存,2塊80G5400rpm的硬盤,1塊100Mbps全雙工網(wǎng)卡
19臺(tái)服務(wù)器連接到一個(gè)HP2524交換機(jī)上,16臺(tái)客戶機(jī)倆接到領(lǐng)外一臺(tái)交換機(jī)上,兩臺(tái)交換機(jī)通過(guò)1G的鏈路相連。
Google 2003年關(guān)于Google File System的論文
原文出處:http://www.irunnet.com/viewtopic.php?p=913&sid=4f05f5b8a26e7d0b0e2586190c175d0b#913