1. 程式人生 > >Standby Namenode Checkpoint過程剖析

Standby Namenode Checkpoint過程剖析

        Standby Namenode(sbn)在進入standby狀態後對FSNamesystem呼叫startStandbyServices(final Configuration conf),該方法會建立兩個重要的物件:EditLogTailer 和 StandbyCheckpointer,前者有兩個功能:

  1. 觸發Active Namenode(nn) edits log roll
  2. 從JournalNodes拉取edit log供fsimage合併

EditLogTailer

後者有三個功能:

  1. 對namespace進行checkpoint

  2. 清理陳舊的fsimage檔案和edits檔案(sbn並不會將拉取的edit log儲存到磁碟,所以就不存在清理。nn將edit log寫到本地和JournalNodes,所以就涉及到陳舊edits檔案的清理),詳細清理過程後續部落格會繼續分析。

  3. 上傳新checkpoint出的fsimaeg檔案到nn

       

     StandbyCheckpointer內部維護一個CheckpointerThread執行緒,該執行緒負責週期性檢查checkpoint條件是否滿足,如果滿足就進行checkpoint。

  • 檢測週期(checkpointPeriod):1000*Math.min(dfs.namenode.checkpoint.period, dfs.namenode.checkpoint.check.period)秒

  • 條件1:最近一次合併到namespace的edit log的 txid 和最近一次做了checkpoint的txid的差值大於或者等於dfs.namenode.checkpoint.txns配置的數量(預設1000000)

  • 條件2:當前時間距離最近一次checkpoint的時間間隔大於或者等於dfs.namenode.checkpoint.period (預設3600秒)

        CheckpointerThread每隔checkpointPeriod 秒檢查一次。優先檢查條件1是否滿足,如果滿足就進行checkpoint,否則檢查條件2,如果條件2滿足就進行checkpoint,否則就等待下一個檢查週期。一旦條件滿足,就進入doCheckpoint()方法進行checkpoint,流程如下: checkpoint流程

                                                                checkpoint流程【請點選檢視原圖】

        checkpoint過程本質就是將維護在記憶體中的namespace全量inode樹匯出到磁碟儲存為fsimage_txid檔案,並生成fsimage_txid檔案的md5儲存到fsimage_txid.md5檔案。考慮到磁碟故障等問題,sbn 和 nn都可以配置多個目錄儲存fsimage檔案和edits檔案【通常建議將fsimsge和edits分開儲存到不同磁碟,這樣可以緩解磁碟壓力,畢竟執行中的nn會頻繁刷editlog到磁碟,checkpoint也會寫大檔案到磁碟】,所以就需要將fsimage匯出到多個目錄。匯出過程由FSImageSaver完成,FSImageSaver實現了Runnable介面,內部根據_Protocol Buffer_定義好的fsimage的資料格式和壓縮格式將namespace寫入fsimage_txid.ckpt檔案,寫入完成後再將此檔案重名字為fsimage_txid檔案,並生成檔案的md5碼儲存到fsimage_txid.md5檔案。對應於每個儲存目錄都會建立一個執行緒和一個FSImageSaver物件,多個目錄並行匯出。

        待新的fsimage檔案生成之後,sbn會將磁碟上保留的陳舊的fsimage檔案清理掉。歷史fsimage檔案通常只會在元資料損壞的時候被用來做恢復用,適當保留幾份就夠了,太多了不僅沒用反而浪費磁碟空間。有關清理過程,後續會分析。

        最後一步,sbn將新的fsimage檔案上傳給nn,這也是sbn除ha外的另一個存在意義。為了在檔案傳輸過程中也能快速完成transition to active(HDFS-4816),StandbyCheckpointer會單獨啟動一個執行緒,在其內部由TransferFsImage用http協議(nn 用jetty維護了一個ImageServlet 用於 fsimage檔案的上傳、下載)完成fsimage傳輸。

        涉及到的幾個重要引數:

引數名稱  說明  預設值
dfs.namenode.checkpoint.period checkpoint的時間間隔 3600(秒)
dfs.namenode.checkpoint.check.period 檢查週期 60(秒)
dfs.namenode.checkpoint.txns 兩次checkpoint間的txid數量,超過該值就應該checkpoint 1000000
dfs.image.compress 是否壓縮生成的fsimage檔案 false
dfs.image.compression.codec 壓縮格式 org.apache.hadoop.io.compress.DefaultCodec

前三個引數關係到checkpoint的頻率,如果過於頻繁會導致頻繁上傳fsimaeg檔案、頻繁寫磁碟,給nn造成壓力,影響正常服務。如果頻率低,則會導致過多事務得不到持久化,最終nn重啟時間延長,sbn也就失去了意義。