checkpoint 機(jī)制具體實(shí)現(xiàn)示例詳解
checkpoint 機(jī)制的具體實(shí)現(xiàn)
我們都知道為了優(yōu)化分布式存儲系統(tǒng)中 NameNode 的重啟性能,我們引進(jìn)了 checkpoint 機(jī)制和 FsImage 快照,使得 FsImage 和 editslog 共同為系統(tǒng)元數(shù)據(jù)提供持久化功能。
那么我們今天就來學(xué)習(xí)一下,checkpoint 機(jī)制具體應(yīng)該要怎么實(shí)現(xiàn)??
BackNode 節(jié)點(diǎn)冷備份
NameNode 的主要工作時維護(hù)系統(tǒng)中文件元數(shù)據(jù),并實(shí)現(xiàn)其持久化;在每執(zhí)行一個操作之后,NameNode 都要生成一個 editslog,最后刷盤(但是不是每生成一條數(shù)據(jù)就刷盤一次)。
從這我們可以發(fā)現(xiàn),NameNode 進(jìn)程,它需要額外分配出來一個線程,后臺線程定時的去進(jìn)行磁盤IO的操作,其實(shí)這個是很影響本地 CPU 負(fù)載的;另外,假設(shè)這時候來了很多操作請求,那么系統(tǒng)中將有大量的線程用來來更新內(nèi)存的文件目錄樹,這時候肯定是要加鎖的了。此時如果系統(tǒng)還要每隔一段時間,耗費(fèi)比如說幾秒鐘,甚至幾分鐘的時間來對文件目錄樹進(jìn)行加鎖,讀取數(shù)據(jù),寫入本地磁盤;這樣就會導(dǎo)致更新文件目錄樹,和讀取文件目錄樹寫入磁盤,它們之間會產(chǎn)生巨大的鎖的沖突。
如果上述所有操作都在 NameNode 上執(zhí)行的話,就太影響 NameNode 節(jié)點(diǎn)的性能了。
為此,我們需要考慮給系統(tǒng)中增加一個角色——BackNode,其實(shí)它的功能就有點(diǎn)像 HDFS 中的 SecondaryNameNode。
BackNode 是充當(dāng)于 NameNode 的一個冷備份的角色,我們可以將 checkpoint 的操作交給其來執(zhí)行,這樣就可以減輕 NameNode 這邊的性能消耗了。
checkpoint 的實(shí)現(xiàn)
BackNode 在啟動的時候會啟動一個 checkpoint 的調(diào)度任務(wù):
// 調(diào)度任務(wù):fsImageCheckpointer
defaultScheduler.schedule("FSImage Checkpoint操作", fsImageCheckpointer,
backupnodeConfig.getCheckpointInterval(), backupnodeConfig.getCheckpointInterval(), TimeUnit.MILLISECONDS);
這是一個定時任務(wù),每隔一段時間就會被執(zhí)行一次。
下面我們一起來看看 checkpoint 任務(wù)具體需要做些什么?
- 判斷當(dāng)前系統(tǒng)中的 txid 和上一次 checkpoint 時的是否一致,不一致才繼續(xù)執(zhí)行
- 根據(jù)當(dāng)前系統(tǒng)中的數(shù)據(jù)生成 FsImage
- 處理掉舊的 FsImage
具體代碼如下:
/**
* checkpoint 任務(wù)
*/
@Override
public void run() {
log.info("BackupNode啟動checkpoint后臺線程.");
try {
// 如果是正在恢復(fù)元數(shù)據(jù),則直接返回
if (nameSystem.isRecovering()) {
log.info("正在恢復(fù)元數(shù)據(jù)...");
return;
}
// 當(dāng)前 maxid 和 之前記錄的 maxid 相等
if (nameSystem.getMaxTxId() == lastCheckpointTxId) {
log.info("EditLog和上次沒有變化,不進(jìn)行checkpoint: [txId={}]", lastCheckpointTxId);
return;
}
// 以下討論的情況是:當(dāng)前 maxid 和 之前記錄的 maxid 不相等(大于)
// 對當(dāng)前內(nèi)存中的數(shù)據(jù)生成快照
FsImage fsImage = nameSystem.getFsImage();
// 更新記錄中的 maxid
lastCheckpointTxId = fsImage.getMaxTxId();
// 路徑
String fsImageFile = backupNodeConfig.getFsImageFile(String.valueOf(System.currentTimeMillis()));
log.info("開始執(zhí)行checkpoint操作: [maxTxId={}]", fsImage.getMaxTxId());
// 寫入FsImage文件
doCheckpoint(fsImage, fsImageFile);
// 上傳 FsImage 給 NameNode
uploadFsImage(fsImageFile);
// 刪除舊的FSImage
namenodeClient.getDefaultScheduler().scheduleOnce("刪除FSImage任務(wù)", fsImageClearTask, 0);
} catch (Exception e) {
log.error("FSImageCheckPointer error:", e);
}
}以上就是checkpoint 機(jī)制具體實(shí)現(xiàn)示例詳解的詳細(xì)內(nèi)容,更多關(guān)于checkpoint 機(jī)制實(shí)現(xiàn)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot項(xiàng)目中訪問HTML頁面的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot項(xiàng)目中訪問HTML頁面的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08
Java常見基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)
這篇文章主要介紹了Java常見數(shù)據(jù)結(jié)構(gòu)面試題,帶有答案及解釋,希望對廣大的程序愛好者有所幫助,同時祝大家有一個好成績,需要的朋友可以參考下,希望可以幫助到你2021-07-07
Spring Boot中整合PageHelper實(shí)現(xiàn)分頁功能詳細(xì)步驟
在Spring Boot項(xiàng)目中整合PageHelper并實(shí)現(xiàn)分頁查詢功能的全部步驟,通過以上配置和代碼,我們可以輕松地實(shí)現(xiàn)數(shù)據(jù)庫分頁查詢,提高了開發(fā)效率并改善了用戶體驗(yàn),感興趣的朋友跟隨小編一起看看吧2024-05-05
java模擬實(shí)現(xiàn)銀行ATM機(jī)操作
這篇文章主要為大家詳細(xì)介紹了java模擬實(shí)現(xiàn)銀行ATM機(jī)操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05
java8列表中通過stream流根據(jù)對象屬性去重的三種方式
這篇文章主要介紹了java8列表中通過stream流根據(jù)對象屬性去重的三種方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08

