Standby Namenode Checkpoint過程剖析

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

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

EditLogTailer

後者有三個功能:apache

  1. 對namespace進行checkpointoop

  2. 清理陳舊的fsimage文件和edits文件(sbn並不會將拉取的edit log保存到磁盤,因此就不存在清理。nn將edit log寫到本地和JournalNodes,因此就涉及到陳舊edits文件的清理),詳細清理過程後續博客會繼續分析。spa

  3. 上傳新checkpoint出的fsimaeg文件到nn.net

       

     StandbyCheckpointer內部維護一個CheckpointerThread線程,該線程負責週期性檢查checkpoint條件是否知足,若是知足就進行checkpoint。線程

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

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

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

        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也就失去了意義。

相關文章
相關標籤/搜索