1. 程式人生 > >namenode和secondNameNode通訊原理

namenode和secondNameNode通訊原理

Namenode主要維護兩個檔案,一個是fsimage,一個是editlog。
fsimage儲存了最新的元資料檢查點,包含了整個HDFS檔案系統的所有目錄和檔案的資訊。對於檔案來說包括了資料塊描述資訊、修改時間、訪問時間等;對於目錄來說包括修改時間、訪問許可權控制資訊(目錄所屬使用者,所在組)等。
editlog主要是在NameNode已經啟動情況下對HDFS進行的各種更新操作進行記錄,HDFS客戶端執行所有的寫操作都會被記錄到editlog中。

簡單來想,NameNode維護了檔案與資料塊的對映表以及資料塊與資料節點的對映表。
就是一個檔案,它切分成了幾個資料塊,以及這些資料塊分別儲存在哪些datanode上,namenode一清二楚。Fsimage就是在某一時刻,整個hdfs 的快照,就是這個時刻hdfs上所有的檔案塊和目錄,分別的狀態,位於哪些個datanode,各自的許可權,各自的副本個數。然後客戶端對hdfs所有的更新操作,比如說移動資料,或者刪除資料,都會記錄在editlog中。
為了避免editlog不斷增大,secondary namenode會週期性合併fsimage和edits成新的fsimage,新的操作記錄會寫入新的editlog中,這個週期可以自己設定(editlog到達一定大小或者定時)。

這裡寫圖片描述

詳細步驟:
第一步:將hdfs更新記錄寫入一個新的檔案——edits.new。
第二步:將fsimage和editlog通過http協議傳送至secondary namenode。
第三步:將fsimage與editlog合併,生成一個新的檔案——fsimage.ckpt。這步之所以要在secondary namenode中進行,是因為比較耗時,如果在namenode中進行,或導致整個系統卡頓。
第四步:將生成的fsimage.ckpt通過http協議傳送至namenode。
第五步:重新命名fsimage.ckpt為fsimage,edits.new為edits。
第六步:fsimage與editlog合併的過程就完成了。

如果namenode宕機,其實secondary namenode還儲存這一份不久前的fsimage,還能挽回一些損失吧。一旦有datanode掛掉了(宕機或者是網路阻塞),namenode能很快感知到,並且將宕機的節點上的資料塊轉移至其餘空閒節點。這點是因為hdfs中心跳機制(heartbeat)。心跳機制預設3s中一次,datanode會向namenode傳送一次心跳,告知namenode當前節點上存放的資料檔案是什麼。如果namenode中記錄的是該datanode存放了檔案A的兩個資料塊和檔案B的一個數據塊,但是心跳中只有檔案A的二個數據塊資訊,namenode就會知道該datanode資料塊損壞了,會把損壞的資料塊在別的datanode上補充。