補充了一下NameNode啟動過程中有關FSImage與EditsLog的相關知識。
一、什么是FSImage和EditsLog
我們知道HDFS是一個分布式文件存儲系統,文件分布式存儲在多個DataNode節點上。一個文件存儲在哪些DataNode節點的哪些位置的元數據信息(metadata)由NameNode節點來處理。隨着存儲文件的增多,NameNode上存儲的信息也會越來越多。那么HDFS是如何及時更新這些metadata的呢?
在HDFS中主要是通過兩個組件FSImage和EditsLog來實現metadata的更新。在某次啟動HDFS時,會從FSImage文件中讀取當前HDFS文件的metadata,之后對HDFS的操作步驟都會記錄到edit log文件中。比如下面這個操作過程
那么完整的metadata信息就應該由FSImage文件和edit log文件組成。fsimage中存儲的信息就相當於整個hdfs在某一時刻的一個快照。
FSImage文件和EditsLog文件可以通過ID來互相關聯。在參數dfs.namenode.name.dir
設置的路徑下,會保存FSImage文件和EditsLog文件,如果是QJM方式HA的話,EditsLog文件保存在參數dfs.journalnode.edits.dir
設置的路徑下。
在上圖中可以看到,edit log文件以edits_開頭,后面跟一個txid范圍段,並且多個edit log之間首尾相連,正在使用的edit log名字為edits_inprogress_txid。該路徑下還會保存兩個fsimage文件,文件格式為fsimage_txid。上圖中可以看出fsimage文件已經加載到了最新的一個edit log文件,僅僅只有inprogress狀態的edit log未被加載。在啟動HDFS時,只需要讀入fsimage_0000000000000008927以及edits_inprogress_0000000000000008928就可以還原出當前hdfs的最新狀況。
但是這里又會出現一個問題,如果edit log文件越來越多、越來越大時,當重新啟動hdfs時,由於需要加載fsimage后再把所有的edit log也加載進來,就會出現第一段中出現的問題了。怎么解決?HDFS會采用checkpoing機制定期將edit log合並到fsimage中生成新的fsimage。這個過程就是接下來要講的了。
二、Checkpoint機制
fsimage和edit log合並的過程如下圖所示:
其實這個合並過程是一個很耗I/O與CPU的操作,並且在進行合並的過程中肯定也會有其他應用繼續訪問和修改hdfs文件。所以,這個過程一般不是在單一的NameNode節點上進行從。如果HDFS沒有做HA的話,checkpoint由SecondNameNode進程(一般SecondNameNode單獨起在另一台機器上)來進行。在HA模式下,checkpoint則由StandBy狀態的NameNode來進行。
什么時候進行checkpoint由兩個參數dfs.namenode.checkpoint.preiod
(默認值是3600,即1小時)和dfs.namenode.checkpoint.txns
(默認值是1000000)來決定。period參數表示,經過1小時就進行一次checkpoint,txns參數表示,hdfs經過100萬次操作后就要進行checkpoint了。這兩個參數任意一個得到滿足,都會觸發checkpoint過程。進行checkpoint的節點每隔dfs.namenode.checkpoint.check.period
(默認值是60)秒就會去統計一次hdfs的操作次數。
三、HA模式下Checkpointing過程分析
在HA模式下checkpoint過程由StandBy NameNode來進行,以下簡稱為SBNN,Active NameNode簡稱為ANN。
HA模式下的edit log文件會同時寫入多個JournalNodes節點的dfs.journalnode.edits.dir
路徑下,JournalNodes的個數為大於1的奇數,類似於Zookeeper的節點數,當有不超過一半的JournalNodes出現故障時,仍然能保證集群的穩定運行。
SBNN會讀取FSImage文件中的內容,並且每隔一段時間就會把ANN寫入edit log中的記錄讀取出來,這樣SBNN的NameNode進程中一直保持着hdfs文件系統的最新狀況namespace。當達到checkpoint條件的某一個時,就會直接將該信息寫入一個新的FSImage文件中,然后通過HTTP傳輸給ANN。
如上圖所示,主要由4個步驟:
1. SBNN檢查是否達到checkpoint條件:離上一次checkpoint操作是否已經有一個小時,或者HDFS已經進行了100萬次操作。
2. SBNN檢查達到checkpoint條件后,將該namespace以fsimage.ckpt_txid格式保存到SBNN的磁盤上,並且隨之生成一個MD5文件。然后將該fsimage.ckpt_txid文件重命名為fsimage_txid。
3. 然后SBNN通過HTTP聯系ANN。
4. ANN通過HTTP從SBNN獲取最新的fsimage_txid文件並保存為fsimage.ckpt_txid,然后也生成一個MD5,將這個MD5與SBNN的MD5文件進行比較,確認ANN已經正確獲取到了SBNN最新的fsimage文件。然后將fsimage.ckpt_txid文件重命名為fsimage_txit。
通過上面一系列的操作,SBNN上最新的FSImage文件就成功同步到了ANN上。