Flink Checkpoint源碼級拆解
檢查點是 Apache Flink 的主要容錯機制。它的工作原理是定期創建所有分布式應用程序狀態的一致快照,允許 Flink 通過將應用程序狀態恢復到最新的檢查點來從故障中恢復。
一、Core Components 核心組件
checkpointing 系統由幾個關鍵組件組成,這些組件協同工作以實現容錯:
1. CheckpointCoordinator(檢查點協調器)
CheckpointCoordinator 是 Flink 檢查點機制的核心組件。它作為 JobManager 的一部分運行,并負責:
- 定期觸發 checkpoint 創建
- 向源發送檢查點屏障
- 從任務中收集確認
- 管理待處理和已完成的 checkpoint
- 處理檢查點失敗
- 在恢復期間協調檢查點恢復
2. PendingCheckpoint 待處理檢查點
PendingCheckpoint 表示已啟動但尚未被所有任務確認的 checkpoint。它保存已確認任務的部分狀態,并跟蹤哪些任務仍需要確認。
主要特點:
- 觸發 checkpoint 時創建
- 收集任務狀態確認
- 當所有任務都確認時,變為 CompletedCheckpoint
- 如果任務失敗或超時,可以中止
3. CompletedCheckpoint 已完成檢查點
CompletedCheckpoint 表示可用于恢復的完全確認的檢查點。它包含還原應用程序狀態所需的所有狀態句柄。
主要特點:
- 當所有任務都已確認 PendingCheckpoint 時創建
- 存儲在 CompletedCheckpointStore 中
- 在恢復期間用于恢復應用程序狀態
- 元數據持久化到外部存儲
4. CompletedCheckpointStore 已完成檢查點存儲
CompletedCheckpointStore 維護已完成檢查點的歷史記錄。它負責:
- 存儲已完成的 checkpoint
- 管理保留的 checkpoint 數量
- 提供用于恢復的檢查點
- 在達到最大限制時丟棄舊的 checkpoint
二、檢查點流程
下圖說明了 Flink 中的完整 checkpoint 過程:
1. 觸發 Checkpoint
可以通過三種方式觸發 Checkpoint:
- Periodically:最常用的方法,以固定間隔自動觸發。
- Manually手動 :通過臨時檢查點的 REST API。Savepoints
- Savepoints:用戶請求的持久性檢查點,通常用于版本升級或維護。
觸發 checkpoint 時,(CheckpointCoordinator)協調器進行如下操作:
- 從計數器獲取新的檢查點 ID
- 創建 PendingCheckpoint 以跟蹤進度
- 向所有源任務發送觸發器消息
- 設置 checkpoint 完成的超時
2. 確認 Checkpoint
當每個任務處理一個檢查點屏障時,它會:
- 拍攝其狀態的快照
- 通過配置的 state backend 存儲 state
- 向 CheckpointCoordinator 發送確認
確認內容包括:
- 檢查點 ID
- 任務的狀態快照引用
- 有關檢查點的性能指標
3. 完成檢查點
當所有任務都確認了一個 checkpoint 時,PendingCheckpoint 將通過以下方式轉換為 CompletedCheckpoint:
- 完成檢查點元數據
- 將其存儲在 CompletedCheckpointStore 中
- 如果超過最大計數,則丟棄最早的 checkpoint
- 通知協調器檢查點已完成