對于Namenode的分析,分以下幾個(gè)部分:
文件系統(tǒng)目錄樹管理
數(shù)據(jù)塊和數(shù)據(jù)節(jié)點(diǎn)管理
租約管理
租約是Namenode給與租約持有者(客戶端)在規(guī)定時(shí)間內(nèi)擁有文件權(quán)限(寫文件)的合同轩缤,Namenode會執(zhí)行租約的發(fā)放命迈、回收贩绕、檢查以及恢復(fù)等操作。緩存管理
2.3新增了集中式緩存管理功能壶愤,允許用戶將文件和目錄保存到HDFS緩存中淑倾。HDFS的集中式緩存是由分布在Datanode上的堆外內(nèi)存組成的,并且由Namenode統(tǒng)一管理征椒。FSNamesystem
Namenode的FSNamesystem類是用于處理HDFS操作邏輯的(讀 寫 追加等)Namenode的啟動和停止
在啟動時(shí)會進(jìn)入安全模式娇哆,在安全模式下Namenode不會接受客戶端對空間的修改
Namenode的啟動
這些操作都是在安全模式中進(jìn)行的:
- 首先加載命名空間鏡像(fsimage)并且合并編輯日志(editslog),建立Namenode的第一關(guān)系:文件系統(tǒng)目錄樹勃救。
- 接受Datanode的塊匯報(bào)(blockReport)碍讨,獲的數(shù)據(jù)塊的存儲信息,建立第二關(guān)系:數(shù)據(jù)塊與副本和數(shù)據(jù)節(jié)點(diǎn)之間的對應(yīng)關(guān)系
當(dāng)Namenode收集到的閾值比例滿足最低副本系數(shù)的數(shù)據(jù)塊時(shí)才可以離開安全模式蒙秒。
HA高可用
HDFS的高可用(High Availability, HA)方案就是為了解決Namenode的單點(diǎn)故障而產(chǎn)生的勃黍。
在HA HDFS集群中會同時(shí)運(yùn)行兩個(gè)Namenode
- 一個(gè)作為活動的(Active) Namenode,
- 一個(gè)作為備份的(Standby) Namenode.
備份Namenode的命名空間與活動Namenode是實(shí)時(shí)同步的,所以當(dāng)活動Namenode發(fā)生故障而停止服務(wù)時(shí),備份Namenode可以立即功換為活動狀態(tài),而不影響HDFS集群的服務(wù)。
1. HA架構(gòu)
在一個(gè)HA集群中,會配置兩個(gè)獨(dú)立的Namenode晕讲。在任意時(shí)刻,只有一個(gè)節(jié)點(diǎn)會作為活動的節(jié)點(diǎn),另一個(gè)節(jié)點(diǎn)則處于備份狀態(tài)覆获。活動的Namenode負(fù)責(zé)執(zhí)行所有修改命名空間以及刪除備份數(shù)據(jù)塊的操作,而備份的Namenode則執(zhí)行同步操作以保持與活動節(jié)點(diǎn)命名空間的一致性瓢省。
如圖3-64所示弄息,為了使備份節(jié)點(diǎn)與活動節(jié)點(diǎn)的狀態(tài)能夠同步一致,兩個(gè)節(jié)點(diǎn)都需要與一組獨(dú)立運(yùn)行節(jié)點(diǎn)(JournalNodes, JNS)通信勤婚。當(dāng)Active Namenode執(zhí)行了修改命名空間的操作時(shí)摹量,它會定期將執(zhí)行的操作記錄在editlog中,并寫入JNS的多數(shù)節(jié)點(diǎn)中蛔六,而Standby Namenode會一直監(jiān)聽JNS上editlog的變化荆永,如果發(fā)現(xiàn)editlog有改動, Standby Namenode就會讀取editlog并與當(dāng)前的命名空間合并国章。
當(dāng)發(fā)生了錯(cuò)誤切換時(shí)具钥, Standby節(jié)點(diǎn)會先保證已經(jīng)從JNS上讀取了所有的editlog并與命名空間合并,然后才會從Standby狀態(tài)切換為Active狀態(tài)液兽。通過這種機(jī)制骂删,保證了Active Namenode與Standby Namenode之間命名空間狀態(tài)的一致性,也就是第一關(guān)系鏈的一致性四啰。
為了使錯(cuò)誤切換能夠很快地執(zhí)行完畢宁玫,就需要保證Standby節(jié)點(diǎn)也保存了實(shí)時(shí)的數(shù)據(jù)塊存儲信息,也就是第二關(guān)系鏈柑晒。這樣發(fā)生錯(cuò)誤切換時(shí)欧瘪, Standby節(jié)點(diǎn)就不需要等待所有的數(shù)據(jù)節(jié)點(diǎn)進(jìn)行全量塊匯報(bào),而可以直接切換為Active狀態(tài)匙赞。為了實(shí)現(xiàn)這個(gè)機(jī)制佛掖, Datanode會同時(shí)向這兩個(gè)Namenode發(fā)送心跳以及塊匯報(bào)信息妖碉。這樣Active Nanenode和Standby Namenode的元數(shù)據(jù)就完全同步了,一旦發(fā)生故障芥被,就可以馬上切換欧宜,也就是熱備。這里需要注意的是拴魄,Standby Namenode只會更新數(shù)據(jù)塊的存儲信息冗茸,并不會向Namenode發(fā)送復(fù)制或者刪除數(shù)據(jù)塊的指令,這些指令只能由Active Namenode發(fā)送匹中。
為了防止腦裂的問題夏漱,HDFS提供了三個(gè)級別的隔離機(jī)制(fencing):
- 共享存儲隔離:同一時(shí)間只允許一個(gè)Namenode向JournalNodes寫入editlog數(shù)據(jù)。
- 客戶端隔離:一時(shí)間只允許一個(gè)Namenode響應(yīng)客戶端請求职员。
- Datanode隔離:同一時(shí)間只允許一個(gè)Namenode向Datanode下發(fā)名字節(jié)點(diǎn)指令,例如刪除麻蹋、復(fù)制數(shù)據(jù)塊指令等。
2 HA狀態(tài)切換方式
- 管理員手動通過命令執(zhí)行狀態(tài)切換
- 自動狀態(tài)切換機(jī)制觸發(fā)狀態(tài)切換(由ZKFailoverController控制切換流程)
3 Active Namenode和Standby Namenode之間如何共享editlog日志焊切?
Active Namenode會將日志文件寫到共享存儲上扮授,Standby Namenode會實(shí)時(shí)從共享存儲讀取editlog文件,然后合并到命名空間 专肪。
- Hadoop2.6之前使用的共享存儲時(shí)NAS(網(wǎng)絡(luò)附屬存儲)+NFS(網(wǎng)絡(luò)文件系統(tǒng))刹勃,缺點(diǎn)時(shí)要求有一個(gè)互斥腳本,在Namenode發(fā)生故障切換時(shí)關(guān)閉上一個(gè)活動節(jié)點(diǎn)
- 2.6提供了QJM(Quorum Journal Manager)方案來實(shí)現(xiàn)HA共享存儲嚎尤,這是一個(gè)基于Paxos算法實(shí)現(xiàn)的HA方案
4 QJM方案中有兩個(gè)組件:
JournalNode:獨(dú)立運(yùn)行的服務(wù)器荔仁,保存editlog文件,向外提供讀寫接口芽死;HDFS集群中有2N+1個(gè)JN節(jié)點(diǎn)寫入乏梁,則認(rèn)為寫入成功」毓螅基于Paxos算法
QuorumJournalManagerr:運(yùn)行在Namenode上遇骑,QJM通過調(diào)用QJournalProtocol中的方法向JounralNode發(fā)送請求。(并行發(fā)送日志)
5 租約管理
我們知道HDFS文件是write-once-read-many揖曾,并且不支持客戶端的并行寫操作落萎,那么這里就需要一種機(jī)制保證對HDFS文件的互斥操作。HDFS提供了租約(Lease)機(jī)制來實(shí)現(xiàn)文件的互斥操作炭剪。
租約:是Namenode給予租約持有者(LeaseHolder练链,一般是客戶端)在規(guī)定時(shí)間內(nèi)擁有文件權(quán)限(寫文件)的合同。
在HDFS中,客戶端寫文件時(shí)需要先從租約管理器(LeaseManager)申請一個(gè)租約奴拦,成功申請租約之后客戶端就成為了租約持有者媒鼓,也就擁有了對該HDFS文件的獨(dú)占權(quán)限,其他客戶端在該租約有效時(shí)無法打開這個(gè)HDFS文件進(jìn)行操作。
Namenode的租約管理器保存了 HDFS文件與租約绿鸣、租約與租約持有者的對應(yīng)關(guān)系瓷产,租約管理器還會定期檢查它維護(hù)的所有租約是否過期。租約管理器會強(qiáng)制收回過期的租約枚驻,所以租約持有者需要定期更新租約(renew),維護(hù)對該文件的獨(dú)占鎖定株旷。當(dāng)客戶端完成了對文件的寫操作再登,關(guān)閉文件時(shí),必須在租約管理器中釋放租約晾剖。
LeaseManager.Lease
我們知道一個(gè)HDFS客戶端是可以同時(shí)打開多個(gè)HDFS文件進(jìn)行讀寫操作的,為了便于管理,在租約管理器中將一個(gè)客戶端打開的所有文件組織在一起構(gòu)成一條記錄,也就是 LeaseManager.Lease類锉矢。LeaseManager類
是Namenode中維護(hù)所有租約操作的類,它不僅僅保存了HDFS中所有租約的信息齿尽,提供租約的增沽损、刪、改循头、查方法绵估,同時(shí)還維護(hù)了一個(gè)Monitor線程定期檢查租約是否超時(shí),對于長時(shí)間沒有更新租約的文件(超過硬限制時(shí)間)卡骂,LeaseManager會觸發(fā)租約恢復(fù)機(jī)制国裳,然后關(guān)閉文件。
添加租約---addLease()
檢查租約---FsNamesystem.checkLease()
租約更新---renewLease()
刪除租約---removeLease()
租約檢查---Monitor線程
租約恢復(fù)---Monitor線程發(fā)起
Boy-20180726