RAID將數(shù)據(jù)分片后在多塊磁盤(pán)上并發(fā)進(jìn)行讀寫(xiě)訪問(wèn),從而提高了存儲(chǔ)容量、加快了訪問(wèn)速度,并通過(guò)數(shù)據(jù)的冗余校驗(yàn)提高了數(shù)據(jù)的可靠性,即使某塊磁盤(pán)損壞也不會(huì)丟失數(shù)據(jù)。將RAID的設(shè)計(jì)理念擴(kuò)大到整個(gè)分布式服務(wù)器集群,就產(chǎn)生了分布式文件系統(tǒng),Hadoop分布式文件系統(tǒng)的核心原理就是如此。
HDFS是在一個(gè)大規(guī)模分布式服務(wù)器集群上,對(duì)數(shù)據(jù)分片后進(jìn)行并行讀寫(xiě)及冗余存儲(chǔ)。因?yàn)镠DFS可以部署在一個(gè)比較大的服務(wù)器集群上,集群中所有服務(wù)器的磁盤(pán)都可供HDFS使用,所以整個(gè)HDFS的存儲(chǔ)空間可以達(dá)到PB級(jí)容量。

從圖中你可以看到HDFS的關(guān)鍵組件有兩個(gè),一個(gè)是DataNode,一個(gè)是NameNode。
DataNode
負(fù)責(zé)文件數(shù)據(jù)的存儲(chǔ)和讀寫(xiě)操作,HDFS將文件數(shù)據(jù)分割成若干數(shù)據(jù)塊(Block),每個(gè)DataNode存儲(chǔ)一部分?jǐn)?shù)據(jù)塊,這樣文件就分布存儲(chǔ)在整個(gè)HDFS服務(wù)器集群中。NameNode
負(fù)責(zé)整個(gè)分布式文件系統(tǒng)的元數(shù)據(jù)(MetaData)管理,也就是文件路徑名、數(shù)據(jù)塊的ID以及存儲(chǔ)位置等信息,相當(dāng)于操作系統(tǒng)中文件分配表(FAT)的角色。
HDFS的高可用設(shè)計(jì)
1.數(shù)據(jù)存儲(chǔ)故障容錯(cuò)
磁盤(pán)介質(zhì)在存儲(chǔ)過(guò)程中受環(huán)境或者老化影響,其存儲(chǔ)的數(shù)據(jù)可能會(huì)出現(xiàn)錯(cuò)亂。HDFS的應(yīng)對(duì)措施是,對(duì)于存儲(chǔ)在DataNode上的數(shù)據(jù)塊,計(jì)算并存儲(chǔ)校驗(yàn)和(CheckSum)。在讀取數(shù)據(jù)的時(shí)候,重新計(jì)算讀取出來(lái)的數(shù)據(jù)的校驗(yàn)和,如果校驗(yàn)不正確就拋出異常,應(yīng)用程序捕獲異常后就到其他DataNode上讀取備份數(shù)據(jù)。2.磁盤(pán)故障容錯(cuò)
如果DataNode監(jiān)測(cè)到本機(jī)的某塊磁盤(pán)損壞,就將該塊磁盤(pán)上存儲(chǔ)的所有BlockID報(bào)告給NameNode,NameNode檢查這些數(shù)據(jù)塊還在哪些DataNode上有備份,通知相應(yīng)的DataNode服務(wù)器將對(duì)應(yīng)的數(shù)據(jù)塊復(fù)制到其他服務(wù)器上,以保證數(shù)據(jù)塊的備份數(shù)滿足要求。3.DataNode故障容錯(cuò)
DataNode會(huì)通過(guò)心跳和NameNode保持通信,如果DataNode超時(shí)未發(fā)送心跳,NameNode就會(huì)認(rèn)為這個(gè)DataNode已經(jīng)宕機(jī)失效,立即查找這個(gè)DataNode上存儲(chǔ)的數(shù)據(jù)塊有哪些,以及這些數(shù)據(jù)塊還存儲(chǔ)在哪些服務(wù)器上,隨后通知這些服務(wù)器再?gòu)?fù)制一份數(shù)據(jù)塊到其他服務(wù)器上,保證HDFS存儲(chǔ)的數(shù)據(jù)塊備份數(shù)符合用戶設(shè)置的數(shù)目,即使再出現(xiàn)服務(wù)器宕機(jī),也不會(huì)丟失數(shù)據(jù)。4.NameNode故障容錯(cuò)
NameNode是整個(gè)HDFS的核心,記錄著HDFS文件分配表信息,所有的文件路徑和數(shù)據(jù)塊存儲(chǔ)信息都保存在NameNode,如果NameNode故障,整個(gè)HDFS系統(tǒng)集群都無(wú)法使用;如果NameNode上記錄的數(shù)據(jù)丟失,整個(gè)集群所有DataNode存儲(chǔ)的數(shù)據(jù)也就沒(méi)用了。
所以,NameNode高可用容錯(cuò)能力非常重要。NameNode采用主從熱備的方式提供高可用服務(wù),請(qǐng)看下圖。

集群部署兩臺(tái)NameNode服務(wù)器,一臺(tái)作為主服務(wù)器提供服務(wù),一臺(tái)作為從服務(wù)器進(jìn)行熱備,兩臺(tái)服務(wù)器通過(guò)ZooKeeper選舉,主要是通過(guò)爭(zhēng)奪znode鎖資源,決定誰(shuí)是主服務(wù)器。而DataNode則會(huì)向兩個(gè)NameNode同時(shí)發(fā)送心跳數(shù)據(jù),但是只有主NameNode才能向DataNode返回控制信息。
正常運(yùn)行期間,主從NameNode之間通過(guò)一個(gè)共享存儲(chǔ)系統(tǒng)shared edits來(lái)同步文件系統(tǒng)的元數(shù)據(jù)信息。當(dāng)主NameNode服務(wù)器宕機(jī),從NameNode會(huì)通過(guò)ZooKeeper升級(jí)成為主服務(wù)器,并保證HDFS集群的元數(shù)據(jù)信息,也就是文件分配表信息完整一致。