分布式文件系統KFS源碼閱讀與分析(二):MetaServer元數據持久化
KFS文件系統的MetaServer元數據的持久化采用的是checkpoint + log方式,下面將結合其源碼,對KFS MetaServer中元數據的持久化機制及其實現細節進行分析。
1. 相關源碼文件
KFS MetaServer元數據持久化所涉及的代碼所在目錄為kfs-[version]/src/cc/meta,其中,KFS元數據持久化的相關源碼如下:
(1)meta/statup.cc: 負責KFS的啟動,在啟動過程中處理checkpoint和log。
(2)meta/checkpoint.cc: 負責metadata的checkpointing操作。
(3)meta/restore.cc: 從已保存的checkpoint重新構建metatree(以B+樹的方式組織)。
(4)meta/logger.cc: 為metadata的更新做日志記錄操作。
(5)meta/replay.cc: 在checkpoint恢復之后,重做log日志文件中的所有操作。
(6)meta/kfstree.h: 構建一個新的metatree,即初始化根目錄為”/”。
2. checkpoint和log機制
Log(日志)通常是系統或者軟件對已完成的某種處理操作的記錄,以便將來用作系統恢復,一般來說是文本格式。Checkpoint(檢查點)機制是將內存中被修改的數據塊與磁盤上的數據文件進行同步的一種數據持久化方式。
在KFS的元數據持久化中,之所有采用checkpoint + log的方式,本人覺得主要出于以下考慮:
(1)通過記錄必要的Checkpoint(檢查點),保證將文件系統元數據按照序列化的要求,永久持久化存儲到磁盤上,從而保證內存和硬盤上的數據的同步與一致;當下次系統恢復時,直接按照反序列化的要求進行還原,快速重新構建KFS的元數據metatree樹。
(2)通過checkpoint(檢查點)和log(日志)相結合,縮短KFS系統的啟動恢復時間。在系統恢復時,首先將系統恢復到最近一次的checkpoint狀態(即重新構建B+樹),然后,只需將最近一次checkpoint之后的log中的操作進行redo即可,而不是所有log中的所有操作進行redo,從而有效縮短系統恢復時間。
3. 元數據的持久化
在KFS中,log操作是由logger.cc自動完成的,默認為每隔10分鐘做一次log(寫切換);checkpoint操作是由checkpoint.cc實現,但是是通過logcompactor_main.cc的離線操作手動完成的,其main函數的工作過程如下:
- 加載log和checkpoint文件的目錄;
- 恢復最近一次的checkpoint文件;
- 重做最近一次checkpoint之后的所有logs;
- 將metatree中所有葉節點寫入新的checkpoint文件中。
4. 元數據加載過程
KFS文件系統停止時,MetaServer的元數據被持久化存儲到物理磁盤上(checkpoint文件和log文件);當KFS下次啟動時,這些持久化后的數據會被KFS MetaServer啟動程序所加載,相關方法的調用關系如圖中所示:

其中,
(1)KFS啟動后,將日志目錄logdir和checkpoint目錄cpdir等信息,傳給KFS::kfs_startup()函數,該函數中首先會調用KFS::logger_setup_paths()設置KFS的日志目錄;
(2)然后,KFS::kfs_startup()函數會繼續調用KFS::checkpointer_setup_paths()設置KFS的checkpoint目錄;
(3)接下來,KFS::kfs_startup()函數會繼續調用KFS::setup_initial_tree()函數,初始化MetaServer的B+樹metatree,分為以下兩種情況:
(4.1)如果存在最近的checkpoint文件,則調用Restorer::rebuild()函數,根據加載checkpoint文件,初始化后構建metatree樹;
(4.2)否則,則調用KFS::metatree.new_tree()函數,初始化一個新的metatree樹,只包含根目錄”/”,并設置與其相關聯的"."和".."鏈接項;
(5)完成之后,回到KFS::kfs_startup()函數中,調用Replay::playAllLogs()函數,重做最近一次checkpointing之后的所有日志中的操作;
(6)在KFS::kfs_startup()函數中,調用KFS::logger_init()函數,啟動記錄日志,設置日志輪轉的間隔時間;
(7)在KFS::kfs_startup()函數中,調用KFS::checkpointer_init()函數,初始化checkpoint。
至此,完成了KFS文件系統中持久化后的元數據的恢復過程。
浙公網安備 33010602011771號