您好,登錄后才能下訂單哦!
這篇文章主要講解了“checkpoint機制如何實現”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“checkpoint機制如何實現”吧!
我們都知道為了優化分布式存儲系統中 NameNode 的重啟性能,我們引進了 checkpoint 機制和 FsImage 快照,使得 FsImage 和 editslog 共同為系統元數據提供持久化功能。
NameNode 的主要工作時維護系統中文件元數據,并實現其持久化;在每執行一個操作之后,NameNode 都要生成一個 editslog,最后刷盤(但是不是每生成一條數據就刷盤一次)。
從這我們可以發現,NameNode 進程,它需要額外分配出來一個線程,后臺線程定時的去進行磁盤IO的操作,其實這個是很影響本地 CPU 負載的;另外,假設這時候來了很多操作請求,那么系統中將有大量的線程用來來更新內存的文件目錄樹,這時候肯定是要加鎖的了。此時如果系統還要每隔一段時間,耗費比如說幾秒鐘,甚至幾分鐘的時間來對文件目錄樹進行加鎖,讀取數據,寫入本地磁盤;這樣就會導致更新文件目錄樹,和讀取文件目錄樹寫入磁盤,它們之間會產生巨大的鎖的沖突。
如果上述所有操作都在 NameNode 上執行的話,就太影響 NameNode 節點的性能了。
為此,我們需要考慮給系統中增加一個角色——BackNode,其實它的功能就有點像 HDFS 中的 SecondaryNameNode。
BackNode 是充當于 NameNode 的一個冷備份的角色,我們可以將 checkpoint 的操作交給其來執行,這樣就可以減輕 NameNode 這邊的性能消耗了。
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機制如何實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。