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