Standby Namenode(sbn)在進入standby狀態後對FSNamesystem調用startStandbyServices(final Configuration conf),該方法會建立兩個重要的對象:EditLogTailer 和 StandbyCheckpointer,前者有兩個功能:node
後者有三個功能:apache
對namespace進行checkpointoop
清理陳舊的fsimage文件和edits文件(sbn並不會將拉取的edit log保存到磁盤,因此就不存在清理。nn將edit log寫到本地和JournalNodes,因此就涉及到陳舊edits文件的清理),詳細清理過程後續博客會繼續分析。spa
上傳新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過程本質就是將維護在內存中的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也就失去了意義。