首頁 > 軟體

checkpoint 機制具體實現範例詳解

2023-02-09 06:01:30

checkpoint 機制的具體實現

我們都知道為了優化分散式儲存系統中 NameNode 的重啟效能,我們引進了 checkpoint 機制和 FsImage 快照,使得 FsImage 和 editslog 共同為系統後設資料提供持久化功能。

那麼我們今天就來學習一下,checkpoint 機制具體應該要怎麼實現??

BackNode 節點冷備份

NameNode 的主要工作時維護系統中檔案後設資料,並實現其持久化;在每執行一個操作之後,NameNode 都要生成一個 editslog,最後刷盤(但是不是每生成一條資料就刷盤一次)。

從這我們可以發現,NameNode 程序,它需要額外分配出來一個執行緒,後臺執行緒定時的去進行磁碟IO的操作,其實這個是很影響本地 CPU 負載的;另外,假設這時候來了很多操作請求,那麼系統中將有大量的執行緒用來來更新記憶體的檔案目錄樹,這時候肯定是要加鎖的了。此時如果系統還要每隔一段時間,耗費比如說幾秒鐘,甚至幾分鐘的時間來對檔案目錄樹進行加鎖,讀取資料,寫入本地磁碟;這樣就會導致更新檔案目錄樹,和讀取檔案目錄樹寫入磁碟,它們之間會產生巨大的鎖的衝突。

如果上述所有操作都在 NameNode 上執行的話,就太影響 NameNode 節點的效能了。

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

BackNode 是充當於 NameNode 的一個冷備份的角色,我們可以將 checkpoint 的操作交給其來執行,這樣就可以減輕 NameNode 這邊的效能消耗了。

checkpoint 的實現

BackNode 在啟動的時候會啟動一個 checkpoint 的排程任務:

// 排程任務:fsImageCheckpointer
defaultScheduler.schedule("FSImage Checkpoint操作", fsImageCheckpointer,
        backupnodeConfig.getCheckpointInterval(), backupnodeConfig.getCheckpointInterval(), TimeUnit.MILLISECONDS);

這是一個定時任務,每隔一段時間就會被執行一次。

下面我們一起來看看 checkpoint 任務具體需要做些什麼?

  • 判斷當前系統中的 txid 和上一次 checkpoint 時的是否一致,不一致才繼續執行
  • 根據當前系統中的資料生成 FsImage
  • 處理掉舊的 FsImage

具體程式碼如下:

/**
 * checkpoint 任務
 */
@Override
public void run() {
    log.info("BackupNode啟動checkpoint後臺執行緒.");
    try {
        // 如果是正在恢復後設資料,則直接返回
        if (nameSystem.isRecovering()) {
            log.info("正在恢復後設資料...");
            return;
        }
        // 當前 maxid 和 之前記錄的 maxid 相等
        if (nameSystem.getMaxTxId() == lastCheckpointTxId) {
            log.info("EditLog和上次沒有變化,不進行checkpoint: [txId={}]", lastCheckpointTxId);
            return;
        }
        // 以下討論的情況是:當前 maxid 和 之前記錄的 maxid 不相等(大於)
        // 對當前記憶體中的資料生成快照
        FsImage fsImage = nameSystem.getFsImage();
        // 更新記錄中的 maxid
        lastCheckpointTxId = fsImage.getMaxTxId();
        // 路徑
        String fsImageFile = backupNodeConfig.getFsImageFile(String.valueOf(System.currentTimeMillis()));
        log.info("開始執行checkpoint操作: [maxTxId={}]", fsImage.getMaxTxId());
        // 寫入FsImage檔案
        doCheckpoint(fsImage, fsImageFile);
        // 上傳 FsImage 給 NameNode
        uploadFsImage(fsImageFile);
        // 刪除舊的FSImage
        namenodeClient.getDefaultScheduler().scheduleOnce("刪除FSImage任務", fsImageClearTask, 0);
    } catch (Exception e) {
        log.error("FSImageCheckPointer error:", e);
    }
}

以上就是checkpoint 機制具體實現範例詳解的詳細內容,更多關於checkpoint 機制實現的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com