溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

checkpoint機制如何實現(xiàn)

發(fā)布時間:2023-02-09 09:08:58 來源:億速云 閱讀:149 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“checkpoint機制如何實現(xiàn)”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“checkpoint機制如何實現(xiàn)”吧!

checkpoint 機制的具體實現(xiàn)

我們都知道為了優(yōu)化分布式存儲系統(tǒng)中 NameNode 的重啟性能,我們引進了 checkpoint 機制和 FsImage 快照,使得 FsImage 和 editslog 共同為系統(tǒng)元數(shù)據(jù)提供持久化功能。

BackNode 節(jié)點冷備份

NameNode 的主要工作時維護系統(tǒng)中文件元數(shù)據(jù),并實現(xiàn)其持久化;在每執(zhí)行一個操作之后,NameNode 都要生成一個 editslog,最后刷盤(但是不是每生成一條數(shù)據(jù)就刷盤一次)。

從這我們可以發(fā)現(xiàn),NameNode 進程,它需要額外分配出來一個線程,后臺線程定時的去進行磁盤IO的操作,其實這個是很影響本地 CPU 負(fù)載的;另外,假設(shè)這時候來了很多操作請求,那么系統(tǒng)中將有大量的線程用來來更新內(nèi)存的文件目錄樹,這時候肯定是要加鎖的了。此時如果系統(tǒng)還要每隔一段時間,耗費比如說幾秒鐘,甚至幾分鐘的時間來對文件目錄樹進行加鎖,讀取數(shù)據(jù),寫入本地磁盤;這樣就會導(dǎo)致更新文件目錄樹,和讀取文件目錄樹寫入磁盤,它們之間會產(chǎn)生巨大的鎖的沖突。

如果上述所有操作都在 NameNode 上執(zhí)行的話,就太影響 NameNode 節(jié)點的性能了。

為此,我們需要考慮給系統(tǒng)中增加一個角色——BackNode,其實它的功能就有點像 HDFS 中的 SecondaryNameNode。

BackNode 是充當(dāng)于 NameNode 的一個冷備份的角色,我們可以將 checkpoint 的操作交給其來執(zhí)行,這樣就可以減輕 NameNode 這邊的性能消耗了。

checkpoint 的實現(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和上次沒有變化,不進行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機制如何實現(xiàn)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對checkpoint機制如何實現(xiàn)這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI