分布式存儲(chǔ) HDFS 與 GFS 的設(shè)計(jì)差異
「后端分布式系列」前面關(guān)于 HDFS 的一些文章介紹了它的整體架構(gòu)和一些關(guān)鍵部件的設(shè)計(jì)實(shí)現(xiàn)要點(diǎn)。
我們知道 HDFS 最早是根據(jù) GFS(Google File System)的論文概念模型來設(shè)計(jì)實(shí)現(xiàn)的。
然后呢,我就去把 GFS 的原始論文找出來仔細(xì)看了遍,GFS 的整體架構(gòu)圖如下:
HDFS 參照了它所以大部分架構(gòu)設(shè)計(jì)概念是類似的,比如 HDFS NameNode 相當(dāng)于 GFS Master,HDFS DataNode 相當(dāng)于 GFS chunkserver。
但還有些細(xì)節(jié)不同的地方,所以本文主要分析下不同的地方。
寫入模型
HDFS 在考慮寫入模型時(shí)做了一個(gè)簡化,就是同一時(shí)刻只允許一個(gè)寫入者或追加者。
在這個(gè)模型下同一個(gè)文件同一個(gè)時(shí)刻只允許一個(gè)客戶端寫入或追加。
而 GFS 則允許同一時(shí)刻多個(gè)客戶端并發(fā)寫入或追加同一文件。
允許并發(fā)寫入帶來了更復(fù)雜的一致性問題。
多個(gè)客戶端并發(fā)寫入時(shí),它們之間的順序是無法保證的,同一個(gè)客戶端連續(xù)追加成功的多個(gè)記錄也可能被打斷。
這意味著一個(gè)客戶端在連續(xù)寫入文件數(shù)據(jù)時(shí),它的數(shù)據(jù)最終在文件中的分布可能是不連續(xù)的。
所謂一致性就是,對(duì)同一個(gè)文件,所有的客戶端看到的數(shù)據(jù)是一致的,不管它們是從哪個(gè)副本讀取的。
如果允許多個(gè)客戶端同時(shí)寫一個(gè)文件,怎么保證寫入數(shù)據(jù)在多個(gè)副本間一致?
我們前面講 HDFS 時(shí)它只允許一個(gè)寫入者按流水線方式寫入多個(gè)副本,寫入順序一致,寫入完成后數(shù)據(jù)將保持最終一致。
而對(duì)多個(gè)客戶端而言,就必須讓所有同時(shí)寫入的客戶端按同一種流水線方式去寫入,才可能保證寫入順序一致。
這個(gè)寫入流程我們下一節(jié)詳細(xì)分析。
寫入流程
GFS 使用租約機(jī)制來保障在跨多個(gè)副本的數(shù)據(jù)寫入中保持順序一致性。
GFS Master 將 chunk 租約發(fā)放給其中一個(gè)副本,這個(gè)副本我們就稱為主副本,其他副本稱為次副本。
由主副本來確定一個(gè)針對(duì)該 chunk 的寫入順序,次副本則遵守這個(gè)順序,這樣就保障了全局順序一致性。
chunk 租約機(jī)制的設(shè)計(jì)主要是為了減輕 Master 的負(fù)擔(dān),由主副本所在的 chunkserver 來承擔(dān)流水線順序的安排。
如下圖,我們?cè)敿?xì)描述下這個(gè)過程。
- 客戶端請(qǐng)求 Master 詢問哪個(gè) chunkserver 持有租約以及其他副本的位置。如果沒有 chunkserver 持有租約,說明該 chunk 最近沒有寫操作。Master 則選擇將租約授權(quán)給其中一臺(tái) chunkserver。
- Master 返回客戶端主副本和次副本的位置信息??蛻舳司彺孢@些信息以備將來使用??蛻舳艘院蟛辉傩枰?lián)系 Master,除非主副本所在 chunkserver 不可用或返回租約過期了。
- 客戶端選擇***的網(wǎng)絡(luò)順序推送數(shù)據(jù),chunkserver 將數(shù)據(jù)先緩存在內(nèi)部的 LRU 緩存中。GFS 中采用數(shù)據(jù)流和控制流分離的方法,從而能夠基于網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)更好地調(diào)度數(shù)據(jù)流的傳輸。
- 一旦所有的副本確認(rèn)收到了數(shù)據(jù),客戶端將發(fā)送一個(gè)寫請(qǐng)求控制命令到主副本。由主副本分配連續(xù)的序列號(hào)來確定最終的寫入順序。
- 主副本轉(zhuǎn)發(fā)寫請(qǐng)求到所有次副本,次副本按主副本安排的順序執(zhí)行寫入操作。
- 次副本寫完后向主副本應(yīng)答確認(rèn)操作完成。
- ***主副本應(yīng)答客戶端,若任意副本寫入過程中出現(xiàn)錯(cuò)誤,將報(bào)告給客戶端,由客戶端發(fā)起重試。
GFS 和 HDFS 的寫入流程都采用了流水線方式,但 HDFS 沒有分離數(shù)據(jù)流和控制流。
HDFS 的數(shù)據(jù)流水線寫入在網(wǎng)絡(luò)上的傳輸順序與最終寫入文件的順序一致。
而 GFS 數(shù)據(jù)在網(wǎng)絡(luò)上的傳輸順序與最終寫入文件的順序可能不一致。
GFS 在支持并發(fā)寫入和優(yōu)化網(wǎng)絡(luò)數(shù)據(jù)傳輸方面做出了***的折衷。
總結(jié)
GFS 的論文發(fā)表于 2003 年,后來大部分的分布式文件系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)或多或少都參考了 GFS 的設(shè)計(jì)思路。
而 HDFS 算是開源分布式文件系統(tǒng)中最完整實(shí)現(xiàn)了 GFS 論文中的概念模型。
但 HDFS 依然簡化了 GFS 中關(guān)于并發(fā)寫的思路,本文就兩者的寫入模型和過程做了一些對(duì)比說明,并希望引發(fā)一些思考。
博文出處:http://blog.csdn.net/mindfloating/article/details/49103611