Posted on 2013-10-24 01:03
whspecial 閱讀(1264)
評論(0) 編輯 收藏 引用 所屬分類:
KFS分析
KFS的元數(shù)據(jù)持久化是依賴checkpoint和operation log結(jié)合來工作的,其中checkpoint顧名思義保存的是某個點內(nèi)存的狀態(tài),operation log記錄的是對元數(shù)據(jù)修改的操作日志。
使用checkpoint+log的設計
(1) 元數(shù)據(jù)信息必須要持久化,否則掉電或者人工重啟之后該信息丟失
(2) 便于快速重啟,可以從最近的一個cp中快速構(gòu)建內(nèi)存狀態(tài),加上該cp之后的log就可以完整地構(gòu)建內(nèi)存
讀寫checkpoint和log的過程
Metaserver啟動時的內(nèi)存構(gòu)建:
在Startup.cc調(diào)用rebuild函數(shù)
(1) 如果之前已經(jīng)有了checkpoint,從checkpoint里重建內(nèi)存樹,否則新建一棵內(nèi)存樹
(2) 在內(nèi)存中replay該checkpoint之后的所有operation log
MetaServer運行時寫入新的checkpoint:
logcompactor_main.cc的main函數(shù)調(diào)用,應該是以調(diào)用另一個進程的方式來執(zhí)行,猜想是Metaserver進程會定時調(diào)用該進程
(1) 根據(jù)舊的checkpoint在內(nèi)存中生成狀態(tài)
(2) 在內(nèi)存中replay之后的op log
(3) 將此時的內(nèi)存狀態(tài)寫入新的checkpoint
MetaServer運行時寫入新的log:
由logger.cc來寫入新log,看了代碼應該是每次修改了元信息的操作,都會將這條op log寫入磁盤,雖然性能不高,但是比較可靠(之前也自己寫過日志庫,使用的是兩個buffer交換寫入,這樣比較高效一些)