Broker 的關機恢復機制
一、Broker關機恢復概述
Broker關機恢復是指恢復 CommitLog、Consume Queue、Index File 等資料檔案。Broker 關機分為正常呼叫命令關機和異常被迫程式停止關機兩種情況。恢復過程的設計目標是使程式正常停止的程式實現零資料丟失,異常停止的程式實現最少量的資料丟失。與關機恢復相關的主要檔案有兩個:abort 和 checkpoint。
abort 是一個空檔案,標記當前 Broker 是否正常關機,Broker 程式正常啟動的時候,建立該檔案。Broker程式正常停止後,該檔案會被刪除;如果異常退出,則檔案依舊存在,建立和刪除的過程如下:
checkpoint 是檢查點檔案,儲存 Broker 最後正常儲存各種資料的時間,在重啟 Broker 時,恢復程式知道從什麼時刻恢復資料。檢查點邏輯由 org.apache.rocketmq.store.StoreCheckpoint 類實現。
在 StoreCheckpoint 類中儲存了 3 個時間,更新過程如下圖:
StoreCheckpoint 中儲存的 3 個時間引數:
- physicMsgTimestamp:最後一條已儲存 CommitLog 的訊息的儲存時間。
- logicsMsgTimestamp:最後一條已儲存 Consume Queue 的訊息的儲存時間。
- indexMsgTimestamp:最後一條已儲存 Index File 的訊息的儲存時間。
physicMsgTimestamp 和 logicsMsgTimestamp 的更新都是在資料儲存成功後進行的,過程比較簡單。而 indexMsgTimestamp 的邏輯是在 Index File 刷盤時被更新的,Index File 刷盤方法 org.apache.rocketmq.store.index.IndexService.flush()。在Index File 刷盤後,已刷盤檔案的最後儲存訊息時間被賦值給 indexMsgTimestamp,並對 Checkpoint 檔案進行刷盤。