關於HDFS存儲元數據的NameNode持久化存儲

NameNode持久化場景引入:

問題:NameNode宕機,導致記憶體中的文件元數據丟失怎麼辦?我們知道元數據是存儲來記憶體中的,所以一旦宕機,記憶體數據是會丟失的,因此為了避免數據丟失,HDFS中出現了該持久化技術。
解決:NameNode會將記憶體中的元數據持久化到磁碟中。

持久化兩大方案:日誌持久化、快照持久化

日誌持久化概念:將client客戶端對HDFS執行的增刪改操作命令記錄在日誌文件中,方便以後宕機數據丟失,再次運行這些操作命令,每當有一個操作命令需要執行,首先記錄在editslog 也就是我們的日誌持久化文件中,再完成實際操作,保證每一個操作都對應的有日誌去完成備份。

日誌持久化優缺點:
優點 時效性極高,數據恢復安全,能夠完完全全恢復丟失的NN(NameNode)元數據。
缺點 恢復時間長,舉個例子,我們對元數據的操作做了N多次很多修改,最後用戶將該存儲文件刪除,我們的元數據中不應該再有該數據,我們之前的editslog日誌就白白運行許多命令。

快照持久化概念:每隔一段時間,將記憶體中的元數據資訊,持久化存儲起在fsimage快照中。

快照持久化優缺點:
優點 恢復快,比一條條的數據恢復快很多。
缺點 數據持久化不安全,不能保證最後宕機前的部分數據保存在恢復快照中,時效性差。

checkpoint:

![](//img2020.cnblogs.com/blog/1629390/202103/1629390-20210314104956045-841472848.png)
因此我們得知我們最好使用兩者的優點來進行存儲的恢復,數據安全不得馬虎,時效性同時更要保證,我們HDFS出現了SNN-SecondaryNamenode:
secondaryNameNode是NameNode的助理,將日誌editslog合併到快照fsimage中。如下圖所示,首先大概了解下兩者合併的機制,我們的日誌持久化依然按照來一條操作,記錄一條日誌的工作機制,當數據達到一定的量,默認100w條時候,完成一個合併操作:系統首先保存一個0號原始快照(fsimage0),然後editslog0記錄實時的指令日誌,當達到合併時機時,fsimage0和editslog發送到SNN中完成合併,由該助理幫助我們合併成新的快照fsimage1,將fsimage1複製發送給NameNode,以備宕機時候做為最新的快照來回復時間,盡全力保證了快照的時效性。

值得注意的是!我們執行fsimage0和editslog0合併成fismage1的操作的同時,新來的指令會記錄在editslog1中,完完全全保證了時效性,這個正在記錄實時操作的日誌文件,沒有達到合併時機(checkpoint)之前,是始終在NN(Namenode)中的,我們一旦宕機,fsimage1和editslog1足以完完全全保證所有資訊的恢復。完成了安全的持久化。
![](//img2020.cnblogs.com/blog/1629390/202103/1629390-20210314105124904-98536356.png)

持久化結論:

1. HDFS接受客戶端的文件操作後。
2. 先將操作的命令 以日誌的方式記錄到editslog中。
3. 然後再將指令對應的文件元數據的修改操作,修改記憶體中的元數據資訊。
4. SNN定期負責將editslog中的文件合併到fsimage中,數據恢復時用最新的正在記錄的editslog合併最新的fsimage快照即可。

SNNcheckpoint機制:

1. SecondaryNameNode向NameNode發起合併請求
2. NameNode將當前的Editslog文件保存改名edits,並新建EditsLog繼續持久化工作。
3. 將改名後的edits文件和本地的FSImage(舊)發送給sencondaryNameNode
4. SecondaryNameNode負責將FSImage(舊)+edits文件合併成FSImage(新)
5. 將新的FSImage(新)發送給NameNode保存。

checkpoint觸發條件(時機):

每1分鐘檢查一次觸發條件。(SNN沒隔1分鐘,訪問一次NN)
1. 每隔1小時觸發一次checkPoint
2. 每100w次操作,觸發一次checkpoint
![](//img2020.cnblogs.com/blog/1629390/202103/1629390-20210314110122189-2045615060.png)

後續我們需要注意的一些配置操作:

SNN和NN在一個伺服器是上,存在單點故障。
場景:一旦伺服器磁碟崩壞,持久化的數據就會全部丟失。
解決:SNN 和NN放在不同的伺服器上。
那麼怎麼配置SNN的伺服器位置呢?可以對hdfs-site.xml中的SNN的節點地址進行配置,需要注意的是我們需要配置文件通過Linux命令發送到所有的伺服器中,做到統一。可以用scp命令。
![](//img2020.cnblogs.com/blog/1629390/202103/1629390-20210314110628216-1879150187.png)

單獨啟動SecondaryNameNode:

hadoop-deamon start secondarynamenode
當面試問到: snn的職責
namenode如何做數據持久化
checkpoint的流程
edis和fsimage分別做什麼,這些基本沒有差別,我們通過講述兩大持久化方案,合併優點,checkpoint合併機制流程即可。

個人隨筆,轉載註明引用,已經上傳關於HDFS分散式的配置詳情文檔